This commit is contained in:
2025-11-16 14:59:02 +01:00
parent 51984e297b
commit 82b165dd21
12 changed files with 0 additions and 737 deletions
-123
View File
@@ -123,26 +123,7 @@ def offset_range(range: Range, lines: int, cols: int = 0) -> Range:
)
#
# @dataclass(frozen=True)
# class ProcEnvironment(Environment):
# name: str
# args: tuple[DocumentSymbol, ...]
# kwargs: tuple[DocumentSymbol, ...]
# rest: DocumentSymbol | None = None
#
# @property
# def locals(self) -> tuple[DocumentSymbol, ...]:
# ret = [*self.args, *self.kwargs]
# if self.rest:
# ret.append(self.rest)
#
# return tuple(ret)
class SkillLanguageServer(LanguageServer):
contents: dict[str, TextDocument]
trees: dict[str, Tree]
def __init__(
self,
@@ -165,111 +146,7 @@ class SkillLanguageServer(LanguageServer):
notebook_document_sync,
max_workers,
)
self.trees = {}
self.contents = {}
def parse(self, doc: TextDocument) -> None:
parsed = SKILL_PARSER.parse(doc.source.encode("utf8"), encoding="utf8")
self.trees[doc.uri] = parsed
self.contents[doc.uri] = doc
def update(self, uri: str, changes: list[TextDocumentContentChangeEvent]) -> None:
for change in changes:
if isinstance(change, TextDocumentContentChangeEvent_Type1):
logger.debug(f"updating {change.range}")
change_fixed = TextDocumentContentChangeEvent_Type1(
offset_range(change.range, -1),
change.text,
change.range_length,
)
old = self.contents[uri].lines
self.contents[uri].apply_change(change)
d = Differ()
logger.debug("".join(d.compare(old, self.contents[uri].lines)))
else:
pass
self.trees[uri] = SKILL_PARSER.parse(
self.contents[uri].source.encode("utf8"),
old_tree=self.trees[uri],
)
def _get_leaves(self, node: Node) -> list[Node]:
if node.children:
return [l for child in node.children for l in self._get_leaves(child)]
return [node]
def _diagnose_errors(self, uri: str) -> list[Diagnostic]:
diags: list[Diagnostic] = []
q = SKILL_LANG.query("(ERROR) @error")
nodes = (
q.captures(self.trees[uri].root_node)["error"]
if self.trees.get(uri)
else []
)
for node in nodes:
if node.type == "ERROR":
logger.error(node)
logger.error(node.range)
content = node.text.decode("utf8") if node.text else ""
range = Range(
Position(*node.range.start_point), Position(*node.range.end_point)
)
if "UNEXPECTED" in str(node):
msg = f"unexpected '{content}'"
else:
msg = str()
diags.append(
Diagnostic(
range,
msg,
severity=DiagnosticSeverity.Error,
),
)
return diags
def diagnose(self, uri: str) -> list[Diagnostic]:
diags: list[Diagnostic] = []
diags.extend(self._diagnose_errors(uri))
return diags
server = SkillLanguageServer("skillls", "v0.3")
# @server.feature(TEXT_DOCUMENT_DID_SAVE)
@server.feature(TEXT_DOCUMENT_DID_OPEN)
def on_open(ls: SkillLanguageServer, params: DidSaveTextDocumentParams) -> None:
doc = server.workspace.get_text_document(params.text_document.uri)
ls.parse(doc)
diags = ls.diagnose(doc.uri)
ls.publish_diagnostics(doc.uri, diags)
@server.feature(TEXT_DOCUMENT_DID_CHANGE)
def on_change(ls: SkillLanguageServer, params: DidChangeTextDocumentParams) -> None:
ls.update(params.text_document.uri, changes=params.content_changes)
diags = ls.diagnose(params.text_document.uri)
ls.publish_diagnostics(params.text_document.uri, diags)
@server.feature(TEXT_DOCUMENT_DOCUMENT_SYMBOL)
def doc_symbols(
ls: SkillLanguageServer,
params: DocumentSymbolParams,
) -> list[DocumentSymbol]:
# return ls.procs + ls.lets + ls.defs + ls.globals
return []
def main():