Skip to content

Commit

Permalink
Refactor - store documentation in language server attr
Browse files Browse the repository at this point in the history
  • Loading branch information
aazuspan committed Aug 11, 2024
1 parent 3cc1557 commit fe06d33
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ A Language Server Protocol (LSP) server to provide language support for the [SPI

- **Diagnostics**: Reports the location of syntax errors and warnings.
- **Hover**: Shows opcode documentation and assigned values on hover.
- **Completion**: Provides suggestions for opcodes, labels, and defined values.
- **Renaming**: Allows renaming of labels and defined values.
- **Go to definition**: Jumps to the definition of a label or defined value.
- **Completion**: Provides suggestions for opcodes, labels, and variables.
- **Renaming**: Allows renaming of labels and variables.
- **Go to definition**: Jumps to the definition of a label, memory address, or variable.

------

Expand Down
19 changes: 13 additions & 6 deletions src/spinasm_lsp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ def _parse_document(source: str) -> SPINAsmParser:
class SPINAsmLanguageServer(LanguageServer):
def __init__(self, *args, **kwargs) -> None:
self._prev_parser: SPINAsmParser | None = None
self.documentation = DocMap(folders=["instructions", "assemblers"])

super().__init__(*args, name="spinasm-lsp", version=__version__, **kwargs)

def debug(self, msg: Any) -> None:
Expand Down Expand Up @@ -60,8 +62,6 @@ async def get_parser(self, uri: str) -> SPINAsmParser:


server = SPINAsmLanguageServer(max_workers=5)
# TODO: Probably load async as part of a custom language server subclass
DOCUMENTATION = DocMap(folders=["instructions", "assemblers"])


@server.feature(lsp.TEXT_DOCUMENT_DID_CHANGE)
Expand Down Expand Up @@ -114,7 +114,7 @@ async def hover(ls: SPINAsmLanguageServer, params: lsp.HoverParams) -> lsp.Hover
# should be treated as part of the instruction for retrieving documentation.
if token_val == "RDA" and str(token.prev_token) == "CHO":
token_val = f"CHO {token_val}"
hover_msg = DOCUMENTATION.get(token_val, "")
hover_msg = ls.documentation.get(token_val, "")
# Label definitions and targets
elif token_val in parser.jmptbl:
hover_definition = parser.jmptbl[token_val.upper()]
Expand All @@ -134,7 +134,7 @@ async def hover(ls: SPINAsmLanguageServer, params: lsp.HoverParams) -> lsp.Hover
elif token_val == "CHO" and token.next_token is not None:
token_val = f"CHO {str(token.next_token)}"

hover_msg = DOCUMENTATION.get(token_val, "")
hover_msg = ls.documentation.get(token_val, "")

return (
None
Expand All @@ -152,15 +152,22 @@ async def completions(
"""Returns completion items."""
parser = await ls.get_parser(params.text_document.uri)

opcodes = [k.upper() for k in DOCUMENTATION]
opcodes = [k.upper() for k in ls.documentation]
symbols = list(parser.symtbl.keys())
labels = list(parser.jmptbl.keys())
mem = list(parser.mem.keys())

opcode_items = [
lsp.CompletionItem(label=k, kind=lsp.CompletionItemKind.Function)
lsp.CompletionItem(
label=k,
kind=lsp.CompletionItemKind.Function,
documentation=lsp.MarkupContent(
kind=lsp.MarkupKind.Markdown, value=ls.documentation[k.upper()]
),
)
for k in opcodes
]
# TODO: Set details for all the completions below using the same info as the hover.
symbol_items = [
lsp.CompletionItem(label=k, kind=lsp.CompletionItemKind.Constant)
for k in symbols
Expand Down

0 comments on commit fe06d33

Please sign in to comment.