This commit is contained in:
@@ -2,6 +2,8 @@ from tclint.syntax_tree import Visitor, Command, BareWord, List
|
||||
import lsprotocol.types as lsp
|
||||
from common.load_data import standard_items
|
||||
|
||||
BUILTIN_VAR_LABELS = {ci.label for ci in standard_items.nx_variables}
|
||||
|
||||
|
||||
class CompletionItems:
|
||||
def __init__(self):
|
||||
@@ -34,23 +36,25 @@ class _Completion(Visitor):
|
||||
self._custom_functions = []
|
||||
self._proc_signatures = {}
|
||||
|
||||
def _append_unique(self, item: lsp.CompletionItem):
|
||||
# Avoid duplicate labels within the same file scan
|
||||
if not any(ci.label == item.label for ci in self._custom_functions):
|
||||
self._custom_functions.append(item)
|
||||
|
||||
def visit_command(self, command: Command):
|
||||
routine = command.routine
|
||||
|
||||
# Collect custom proc names and their signatures
|
||||
if routine.contents == "proc" and command.args:
|
||||
first_arg = command.args[0]
|
||||
if not first_arg.value:
|
||||
if not getattr(first_arg, "value", None):
|
||||
return
|
||||
|
||||
if any(item.label == first_arg.value for item in standard_items.nx_procs):
|
||||
return
|
||||
|
||||
try:
|
||||
self._custom_functions.remove(first_arg.value)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
self._custom_functions.append(lsp.CompletionItem(label=first_arg.value, kind=lsp.CompletionItemKind.Function))
|
||||
# Record proc name as a completion item
|
||||
self._append_unique(lsp.CompletionItem(label=first_arg.value, kind=lsp.CompletionItemKind.Function))
|
||||
if len(command.args) < 2:
|
||||
return
|
||||
|
||||
@@ -69,6 +73,24 @@ class _Completion(Visitor):
|
||||
|
||||
self._proc_signatures[first_arg.value] = param_names
|
||||
|
||||
# Collect global variables declared with: global var1 var2 ...
|
||||
elif routine.contents == "global" and command.args:
|
||||
for arg in command.args:
|
||||
if isinstance(arg, BareWord) and getattr(arg, "value", None):
|
||||
if arg.value not in BUILTIN_VAR_LABELS:
|
||||
self._append_unique(lsp.CompletionItem(label=arg.value, kind=lsp.CompletionItemKind.Variable))
|
||||
|
||||
# Collect variables set with explicit global namespace: set ::var_name ...
|
||||
elif routine.contents == "set" and command.args:
|
||||
first = command.args[0]
|
||||
if isinstance(first, BareWord) and getattr(first, "value", None):
|
||||
var_name = first.value
|
||||
if var_name.startswith("::"):
|
||||
base_name = var_name.split("(", 1)[0]
|
||||
clean_name = base_name[2:] # remove leading '::' for completion display
|
||||
if clean_name not in BUILTIN_VAR_LABELS:
|
||||
self._append_unique(lsp.CompletionItem(label=clean_name, kind=lsp.CompletionItemKind.Variable))
|
||||
|
||||
|
||||
def remove_existing_items(items: list[lsp.CompletionItem], store: dict) -> None:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user