88from robot .libraries .BuiltIn import BuiltIn
99from robot .parsing .parser .parser import _tokens_to_statements
1010
11- from .globals import IS_RF_7
11+ from .globals import IS_RF_7 , KEYWORD_SEP
1212from .lexer import get_robot_token , get_variable_token
1313from .prompttoolkitcmd import PromptToolkitCmd
1414from .robotkeyword import normalize_kw
@@ -69,9 +69,16 @@ def _find_statement_details_at_cursor(self):
6969
7070 def _find_token_at_cursor (self ):
7171 for token in self .statement .tokens :
72- if (
73- token .type
74- ): # in ["KEYWORD", "IF", "FOR", "ELSE", "ELSE IF"]: TODO: Commented to get all tokens in debug. lets see the impact
72+ if token .type in [
73+ "KEYWORD" ,
74+ "IF" ,
75+ "FOR" ,
76+ "ELSE" ,
77+ "ELSE IF" ,
78+ "TRY" ,
79+ "WHILE" ,
80+ "VAR" ,
81+ ]: # TODO: Commented to get all tokens in debug. lets see the impact
7582 self .statement_type = token .type
7683 if (
7784 token .lineno == self .cursor_row + 1
@@ -93,6 +100,12 @@ def __init__(self, libs, keywords, helps, cmd_repl: Optional[PromptToolkitCmd] =
93100 self .helps = helps
94101 self .libs = libs
95102 self .keywords = list (keywords )
103+ self .keywords_catalog = {}
104+ for keyword in self .keywords :
105+ self .keywords_catalog [normalize_kw (keyword .name )] = keyword
106+ self .keywords_catalog [
107+ f"{ normalize_kw (keyword .parent .name )} .{ normalize_kw (keyword .name )} "
108+ ] = keyword
96109 self .current_statement = None
97110 for name , display , display_meta in self .get_commands ():
98111 self .names .append (name )
@@ -163,28 +176,28 @@ def _get_resource_completions(self, text):
163176 )
164177
165178 def _get_argument_completer (self , text ):
166- for keyword in self .keywords :
167- if normalize_kw (keyword .name ) == normalize_kw (
168- self .current_statement .statement .keyword
169- ) or f"{ normalize_kw (keyword .parent .name )} .{ normalize_kw (keyword .name )} " == normalize_kw (
170- self .current_statement .statement .keyword
171- ):
172- data_tokens = self .current_statement .statement .data_tokens
173- args = keyword .args
174- set_named_args , set_pos_args = self .get_set_args (args , data_tokens )
175- if set_named_args :
176- yield from self .get_named_arg_completion (args , set_named_args , set_pos_args )
177- else :
178- yield from self .get_pos_arg_completion (args , set_pos_args )
179+ keyword = self .keywords_catalog .get (
180+ normalize_kw (self .current_statement .statement .keyword ), None
181+ )
182+ if keyword :
183+ data_tokens = self .current_statement .statement .data_tokens
184+ args = keyword .args
185+ set_named_args , set_pos_args = self .get_set_args (args , data_tokens )
186+ if set_named_args :
187+ yield from self .get_named_arg_completion (args , set_named_args , set_pos_args )
188+ else :
189+ yield from self .get_pos_arg_completion (args , set_pos_args )
179190
180- def get_pos_arg_completion (self , args , set_pos_args ):
191+ def get_pos_arg_completion (
192+ self , args , set_pos_args
193+ ): # TODO: here is an issue. if more positional args are set, than existing, named_only will be removed from proposal
181194 for index , arg in enumerate ([* args .positional_or_named , * args .named_only ]):
182195 if index + 1 > len (set_pos_args ):
183- suffix = "=" if arg in [* args .positional_or_named , * args .named_only ] else ""
196+ # suffix = "=" if arg in [*args.positional_or_named, *args.named_only] else ""
184197 yield Completion (
185- f"{ arg } " ,
198+ f"{ arg } = " ,
186199 0 ,
187- display = f"{ arg } { suffix } " ,
200+ display = f"{ arg } = " ,
188201 display_meta = str (args .defaults .get (arg , "" )),
189202 )
190203
@@ -338,7 +351,7 @@ def _get_keyword_completions(
338351 ):
339352 yield from [
340353 Completion (
341- f" { var [: - 1 ] } " ,
354+ var ,
342355 - cursor_pos ,
343356 display = var ,
344357 display_meta = repr (val ),
@@ -365,7 +378,7 @@ def __init__(self, completer: CmdCompleter):
365378 def get_suggestion (self , buffer : Buffer , document : Document ) -> Union [Suggestion , None ]:
366379 text = document .text
367380 completions = [compl .text for compl in self .completer .get_completions (document , None )]
368- last_word = text .split (" " )[- 1 ]
381+ last_word = KEYWORD_SEP .split (text )[- 1 ]
369382 matches = [kw for kw in completions if kw .startswith (last_word )]
370383 matches .extend ([kw for kw in completions if kw .lower ().startswith (last_word .lower ())])
371384 return Suggestion (matches [0 ][len (last_word ) :] if matches else "" )
0 commit comments