[gemma4] refactor using treesitter
This commit is contained in:
+22
-34
@@ -27,8 +27,7 @@ from lsprotocol.types import (
|
||||
from pygls.lsp.server import LanguageServer
|
||||
|
||||
|
||||
from skillls.checker import ParenMismatchError
|
||||
from skillls.helpers import parse_file
|
||||
from skillls.parser import SkillParser
|
||||
from skillls.types import URI, Node
|
||||
|
||||
basicConfig(
|
||||
@@ -44,7 +43,7 @@ class SkillLanguageServer(LanguageServer):
|
||||
ws_files: set[URI]
|
||||
opened_files: set[URI]
|
||||
scopes: dict[URI, list[Node]]
|
||||
errs: dict[URI, ExceptionGroup]
|
||||
diagnostics: dict[URI, list[Diagnostic]]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
@@ -56,25 +55,14 @@ class SkillLanguageServer(LanguageServer):
|
||||
super().__init__(name, version, text_document_sync_kind, notebook_document_sync)
|
||||
self.ws_files = set()
|
||||
self.opened_files = set()
|
||||
self.scopes = {}
|
||||
self.errs = {}
|
||||
self.scopes: dict[URI, list[DocumentSymbol]] = {}
|
||||
self.diagnostics: dict[URI, list[Diagnostic]] = {}
|
||||
self.parser = SkillParser()
|
||||
|
||||
def update_diagnostics(self) -> None:
|
||||
for uri in self.opened_files:
|
||||
diags: list[Diagnostic] = []
|
||||
if eg := self.errs.get(uri):
|
||||
for exc in eg.exceptions:
|
||||
match exc:
|
||||
case ParenMismatchError():
|
||||
diags.append(
|
||||
Diagnostic(
|
||||
message=f"[skill_ls] {Path.from_uri(uri).name}:{exc.loc.start.line} {exc.kind.value}",
|
||||
severity=DiagnosticSeverity.Error,
|
||||
range=exc.loc,
|
||||
)
|
||||
)
|
||||
diags = self.diagnostics.get(uri, [])
|
||||
|
||||
# if diags:
|
||||
self.text_document_publish_diagnostics(
|
||||
PublishDiagnosticsParams(
|
||||
uri=uri,
|
||||
@@ -105,11 +93,12 @@ def lsp_initialize(server: SkillLanguageServer, params: InitializeParams) -> Non
|
||||
|
||||
server.ws_files.add(uri)
|
||||
try:
|
||||
server.scopes[uri] = parse_file(server.workspace.get_text_document(uri))
|
||||
if server.errs.get(uri):
|
||||
del server.errs[uri]
|
||||
except ExceptionGroup as eg:
|
||||
server.errs[uri] = eg
|
||||
text_doc = server.workspace.get_text_document(uri)
|
||||
symbols, diagnostics = server.parser.parse_document(text_doc)
|
||||
server.scopes[uri] = symbols
|
||||
server.diagnostics[uri] = diagnostics
|
||||
except Exception as e:
|
||||
logger.error(f"Error initializing file {uri}: {e}")
|
||||
|
||||
|
||||
@server.feature(TEXT_DOCUMENT_DID_OPEN)
|
||||
@@ -128,13 +117,12 @@ def on_close(server: SkillLanguageServer, params: DidCloseTextDocumentParams) ->
|
||||
@server.feature(TEXT_DOCUMENT_DID_SAVE)
|
||||
def on_change(server: SkillLanguageServer, params: DidChangeTextDocumentParams) -> None:
|
||||
try:
|
||||
server.scopes[params.text_document.uri] = parse_file(
|
||||
server.workspace.get_text_document(params.text_document.uri)
|
||||
)
|
||||
if server.errs.get(params.text_document.uri):
|
||||
del server.errs[params.text_document.uri]
|
||||
except ExceptionGroup as eg:
|
||||
server.errs[params.text_document.uri] = eg
|
||||
text_doc = server.workspace.get_text_document(params.text_document.uri)
|
||||
symbols, diagnostics = server.parser.parse_document(text_doc)
|
||||
server.scopes[params.text_document.uri] = symbols
|
||||
server.diagnostics[params.text_document.uri] = diagnostics
|
||||
except Exception as e:
|
||||
logger.error(f"Error changing file {params.text_document.uri}: {e}")
|
||||
|
||||
server.update_diagnostics()
|
||||
|
||||
@@ -143,13 +131,13 @@ def on_change(server: SkillLanguageServer, params: DidChangeTextDocumentParams)
|
||||
def on_inlay(server: SkillLanguageServer, params: InlayHintParams) -> list[InlayHint]:
|
||||
hints: list[InlayHint] = []
|
||||
uri = params.text_document.uri
|
||||
for node in server.scopes.get(uri, []):
|
||||
for symbol in server.scopes.get(uri, []):
|
||||
hints.append(
|
||||
InlayHint(
|
||||
label=node.node,
|
||||
label=symbol.name,
|
||||
kind=InlayHintKind.Type,
|
||||
padding_left=True,
|
||||
position=node.location.end,
|
||||
position=symbol.range.end,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -160,7 +148,7 @@ def on_inlay(server: SkillLanguageServer, params: InlayHintParams) -> list[Inlay
|
||||
def on_symbols(
|
||||
server: SkillLanguageServer, params: DocumentSymbolParams
|
||||
) -> list[DocumentSymbol] | None:
|
||||
return [node.as_doc_symbol() for node in server.scopes[params.text_document.uri]]
|
||||
return server.scopes[params.text_document.uri]
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
Reference in New Issue
Block a user