69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
from tclint.syntax_tree import Visitor, Command, BareWord, List
|
|
import lsprotocol.types as lsp
|
|
|
|
|
|
class CompletionItems:
|
|
def __init__(self):
|
|
self._custom_functions: list[lsp.CompletionItem] = []
|
|
|
|
@property
|
|
def custom_functions(self) -> list[lsp.CompletionItem]:
|
|
return self._custom_functions
|
|
|
|
@custom_functions.setter
|
|
def custom_functions(self, value: lsp.CompletionItem):
|
|
self._custom_functions.append(value)
|
|
|
|
|
|
class _Completion(Visitor):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self._custom_functions: list[lsp.CompletionItem] = []
|
|
self._proc_signatures = {}
|
|
|
|
@property
|
|
def custom_functions(self) -> list[lsp.CompletionItem]:
|
|
return self._custom_functions
|
|
|
|
@property
|
|
def proc_signatures(self):
|
|
return self._proc_signatures
|
|
|
|
def reset(self):
|
|
self._custom_functions = []
|
|
self._proc_signatures = {}
|
|
|
|
def visit_command(self, command: Command):
|
|
routine = command.routine
|
|
|
|
if routine.contents == "proc" and command.args:
|
|
first_arg = command.args[0]
|
|
if hasattr(first_arg, "value") and not any(
|
|
item.label == first_arg.value for item in self._custom_functions
|
|
):
|
|
self._custom_functions.append(
|
|
lsp.CompletionItem(
|
|
label=first_arg.value, kind=lsp.CompletionItemKind.Function
|
|
)
|
|
)
|
|
if len(command.args) < 2:
|
|
return
|
|
|
|
param_list_node = command.args[1]
|
|
if not hasattr(param_list_node, "children"):
|
|
return
|
|
|
|
param_names = []
|
|
for arg in param_list_node.children:
|
|
if isinstance(arg, BareWord):
|
|
param_names.append(arg.value)
|
|
elif isinstance(arg, List) and len(arg.children) >= 1:
|
|
first = arg.children[0]
|
|
if isinstance(first, BareWord):
|
|
param_names.append(first.value)
|
|
|
|
self._proc_signatures[first_arg.value] = param_names
|
|
|
|
|
|
completion = _Completion()
|