4141 LibraryEntry ,
4242 ResourceEntry ,
4343 VariableDefinition ,
44+ VariableDefinitionType ,
4445 VariableNotFoundDefinition ,
4546)
4647from .library_doc import KeywordDoc , KeywordMatcher , is_embedded_keyword
@@ -245,16 +246,36 @@ async def visit(self, node: ast.AST) -> None:
245246 var_range = range_from_token (var_token )
246247 else :
247248 var_range = range_from_token (var_token )
249+
250+ suite_var = None
251+ if isinstance (var , CommandLineVariableDefinition ):
252+ suite_var = await self .namespace .find_variable (
253+ var .name ,
254+ skip_commandline_variables = True ,
255+ ignore_error = True ,
256+ )
257+ if suite_var is not None and suite_var .type not in [
258+ VariableDefinitionType .VARIABLE
259+ ]:
260+ suite_var = None
261+
248262 if var .name_range != var_range :
249263 self ._variable_references [var ].add (
250264 Location (self .namespace .document .document_uri , var_range )
251265 )
266+ if suite_var is not None :
267+ self ._variable_references [suite_var ].add (
268+ Location (self .namespace .document .document_uri , var_range )
269+ )
270+
252271 elif var not in self ._variable_references and token1 .type in [
253272 RobotToken .ASSIGN ,
254273 RobotToken .ARGUMENT ,
255274 RobotToken .VARIABLE ,
256275 ]:
257276 self ._variable_references [var ] = set ()
277+ if suite_var is not None :
278+ self ._variable_references [suite_var ] = set ()
258279
259280 if (
260281 isinstance (node , Statement )
@@ -280,11 +301,23 @@ async def visit(self, node: ast.AST) -> None:
280301 else :
281302 if self .namespace .document is not None :
282303 var_range = range_from_token (var_token )
304+
283305 if var .name_range != var_range :
284306 self ._variable_references [var ].add (
285307 Location (self .namespace .document .document_uri , range_from_token (var_token ))
286308 )
287309
310+ if isinstance (var , CommandLineVariableDefinition ):
311+ suite_var = await self .namespace .find_variable (
312+ var .name ,
313+ skip_commandline_variables = True ,
314+ ignore_error = True ,
315+ )
316+ if suite_var is not None and suite_var .type in [VariableDefinitionType .VARIABLE ]:
317+ self ._variable_references [suite_var ].add (
318+ Location (self .namespace .document .document_uri , range_from_token (var_token ))
319+ )
320+
288321 await super ().visit (node )
289322 finally :
290323 self .node_stack = self .node_stack [:- 1 ]
@@ -377,6 +410,37 @@ async def _analyze_keyword_call(
377410
378411 result = self .finder .find_keyword (keyword )
379412
413+ if (
414+ result is not None
415+ and lib_entry is not None
416+ and kw_namespace
417+ and result .parent is not None
418+ and result .parent != lib_entry .library_doc .digest
419+ ):
420+ entry = next (
421+ (
422+ v
423+ for v in (await self .namespace .get_libraries ()).values ()
424+ if v .library_doc .digest == result .parent
425+ ),
426+ None ,
427+ )
428+ if entry is None :
429+ entry = next (
430+ (
431+ v
432+ for v in (await self .namespace .get_resources ()).values ()
433+ if v .library_doc .digest == result .parent
434+ ),
435+ None ,
436+ )
437+ if entry is not None :
438+ lib_entry = entry
439+
440+ if kw_namespace and lib_entry is not None and lib_range is not None :
441+ if self .namespace .document is not None :
442+ self ._namespace_references [lib_entry ].add (Location (self .namespace .document .document_uri , lib_range ))
443+
380444 if not ignore_errors_if_contains_variables or is_not_variable_token (keyword_token ):
381445 for e in self .finder .diagnostics :
382446 self .append_diagnostics (
@@ -386,11 +450,11 @@ async def _analyze_keyword_call(
386450 code = e .code ,
387451 )
388452
389- if kw_namespace and lib_entry is not None and lib_range is not None :
390- if self .namespace .document is not None :
391- self . _namespace_references [ lib_entry ]. add ( Location ( self .namespace . document . document_uri , lib_range ))
392-
393- if result is not None :
453+ if result is None :
454+ if self .namespace .document is not None and self . finder . multiple_keywords_result is not None :
455+ for lib_entry , kw_doc in self .finder . multiple_keywords_result :
456+ self . _keyword_references [ kw_doc ]. add ( Location ( self . namespace . document . document_uri , kw_range ))
457+ else :
394458 if self .namespace .document is not None :
395459 self ._keyword_references [result ].add (Location (self .namespace .document .document_uri , kw_range ))
396460
@@ -538,6 +602,17 @@ async def _analyze_keyword_call(
538602 self ._variable_references [var ].add (
539603 Location (self .namespace .document .document_uri , range_from_token (var_token ))
540604 )
605+
606+ if isinstance (var , CommandLineVariableDefinition ):
607+ suite_var = await self .namespace .find_variable (
608+ var .name ,
609+ skip_commandline_variables = True ,
610+ ignore_error = True ,
611+ )
612+ if suite_var is not None and suite_var .type in [VariableDefinitionType .VARIABLE ]:
613+ self ._variable_references [suite_var ].add (
614+ Location (self .namespace .document .document_uri , range_from_token (var_token ))
615+ )
541616 if result .argument_definitions :
542617 for arg in argument_tokens :
543618 name , value = split_from_equals (arg .value )
@@ -964,22 +1039,61 @@ def _check_import_name(self, value: Optional[str], node: ast.AST, type: str) ->
9641039 )
9651040
9661041 async def visit_VariablesImport (self , node : ast .AST ) -> None : # noqa: N802
967- if get_robot_version () >= ( 6 , 1 ):
968- from robot .parsing .model .statements import VariablesImport
1042+ from robot . parsing . lexer . tokens import Token as RobotToken
1043+ from robot .parsing .model .statements import VariablesImport
9691044
1045+ if get_robot_version () >= (6 , 1 ):
9701046 import_node = cast (VariablesImport , node )
9711047 self ._check_import_name (import_node .name , node , "Variables" )
9721048
1049+ n = cast (VariablesImport , node )
1050+ name_token = cast (RobotToken , n .get_token (RobotToken .NAME ))
1051+ if name_token is None :
1052+ return
1053+
1054+ entries = await self .namespace .get_imported_variables ()
1055+ if entries and self .namespace .document :
1056+ for v in entries .values ():
1057+ if v .import_source == self .namespace .source and v .import_range == range_from_token (name_token ):
1058+ if v not in self ._namespace_references :
1059+ self ._namespace_references [v ] = set ()
1060+
9731061 async def visit_ResourceImport (self , node : ast .AST ) -> None : # noqa: N802
974- if get_robot_version () >= ( 6 , 1 ):
975- from robot .parsing .model .statements import ResourceImport
1062+ from robot . parsing . lexer . tokens import Token as RobotToken
1063+ from robot .parsing .model .statements import ResourceImport
9761064
1065+ if get_robot_version () >= (6 , 1 ):
9771066 import_node = cast (ResourceImport , node )
9781067 self ._check_import_name (import_node .name , node , "Resource" )
9791068
1069+ n = cast (ResourceImport , node )
1070+ name_token = cast (RobotToken , n .get_token (RobotToken .NAME ))
1071+ if name_token is None :
1072+ return
1073+
1074+ entries = await self .namespace .get_resources ()
1075+ if entries and self .namespace .document :
1076+ for v in entries .values ():
1077+ if v .import_source == self .namespace .source and v .import_range == range_from_token (name_token ):
1078+ if v not in self ._namespace_references :
1079+ self ._namespace_references [v ] = set ()
1080+
9801081 async def visit_LibraryImport (self , node : ast .AST ) -> None : # noqa: N802
981- if get_robot_version () >= ( 6 , 1 ):
982- from robot .parsing .model .statements import LibraryImport
1082+ from robot . parsing . lexer . tokens import Token as RobotToken
1083+ from robot .parsing .model .statements import LibraryImport
9831084
1085+ if get_robot_version () >= (6 , 1 ):
9841086 import_node = cast (LibraryImport , node )
9851087 self ._check_import_name (import_node .name , node , "Library" )
1088+
1089+ n = cast (LibraryImport , node )
1090+ name_token = cast (RobotToken , n .get_token (RobotToken .NAME ))
1091+ if name_token is None :
1092+ return
1093+
1094+ entries = await self .namespace .get_libraries ()
1095+ if entries and self .namespace .document :
1096+ for v in entries .values ():
1097+ if v .import_source == self .namespace .source and v .import_range == range_from_token (name_token ):
1098+ if v not in self ._namespace_references :
1099+ self ._namespace_references [v ] = set ()
0 commit comments