[gemma4] refactor using treesitter

This commit is contained in:
2026-06-20 10:56:52 +02:00
parent 49f0f23a54
commit d600c0a8ca
10 changed files with 141 additions and 434 deletions
+22 -34
View File
@@ -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():