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()