optimze Server

This commit is contained in:
Christoph Brandau
2025-08-12 07:48:05 +02:00
parent c0635e48ea
commit 7263b6f530
2 changed files with 75 additions and 33 deletions
+33 -5
View File
@@ -26,6 +26,37 @@ class TclLanguageServer(server.LanguageServer):
self.poco_completion: dict = {}
self.proc_signatures: dict = {}
self.proc_docs: dict = {}
# Cache: (uri, version) -> (tree, violations)
self._ast_cache = {}
def get_tree(self, document: TextDocument):
key = (document.uri, document.version)
cached = self._ast_cache.get(key)
if cached:
return cached[0]
# Parse and cache
self.parser.violations = []
tree = self.parser.parse(document.source)
violations = list(self.parser.violations)
self._ast_cache[key] = (tree, violations)
return tree
def get_tree_and_violations(self, document: TextDocument):
key = (document.uri, document.version)
cached = self._ast_cache.get(key)
if cached:
return cached
# Parse and cache
self.parser.violations = []
tree = self.parser.parse(document.source)
violations = list(self.parser.violations)
self._ast_cache[key] = (tree, violations)
return tree, violations
def clear_cache_for_uri(self, uri: str):
to_delete = [k for k in self._ast_cache.keys() if k[0] == uri]
for k in to_delete:
del self._ast_cache[k]
def update_poco_completion_for_file(self, document: TextDocument):
"""Update poco_completion for a specific file when it changes"""
@@ -42,7 +73,7 @@ class TclLanguageServer(server.LanguageServer):
# Parse and extract new completion items
completion.reset()
try:
tree = self.parser.parse(document.source)
tree = self.get_tree(document)
tree.accept(completion, recurse=True)
remove_existing_items(completion.custom_functions, self.poco_completion)
self.poco_completion[filepath] = completion.custom_functions
@@ -81,10 +112,7 @@ class TclLanguageServer(server.LanguageServer):
self,
document: TextDocument,
) -> List[Violation]:
violations = []
self.parser.violations = []
tree = self.parser.parse(document.source)
violations += self.parser.violations
tree, violations = self.get_tree_and_violations(document)
for checker in checks.get_checkers():
violations += checker.check(document.source, tree)
return violations