redo
This commit is contained in:
-123
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user