robotcode-language-server 2.8.0.dev548__tar.gz → 2.8.0.dev631__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/PKG-INFO +5 -5
  2. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/pyproject.toml +4 -4
  3. robotcode_language_server-2.8.0.dev631/src/robotcode/language_server/__version__.py +1 -0
  4. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/references.py +60 -14
  5. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/semantic_tokens.py +36 -4
  6. robotcode_language_server-2.8.0.dev548/src/robotcode/language_server/__version__.py +0 -1
  7. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/.gitignore +0 -0
  8. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/README.md +0 -0
  9. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/__init__.py +0 -0
  10. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/cli.py +0 -0
  11. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/__init__.py +0 -0
  12. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/decorators.py +0 -0
  13. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/__init__.py +0 -0
  14. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/code_action.py +0 -0
  15. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/code_lens.py +0 -0
  16. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/commands.py +0 -0
  17. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/completion.py +0 -0
  18. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/declaration.py +0 -0
  19. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/definition.py +0 -0
  20. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/diagnostics.py +0 -0
  21. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/document_highlight.py +0 -0
  22. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/document_symbols.py +0 -0
  23. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/documents.py +0 -0
  24. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/folding_range.py +0 -0
  25. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/formatting.py +0 -0
  26. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/hover.py +0 -0
  27. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/implementation.py +0 -0
  28. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/inlay_hint.py +0 -0
  29. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/inline_value.py +0 -0
  30. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/linked_editing_ranges.py +0 -0
  31. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/protocol_part.py +0 -0
  32. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/references.py +0 -0
  33. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/rename.py +0 -0
  34. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/selection_range.py +0 -0
  35. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/semantic_tokens.py +0 -0
  36. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/signature_help.py +0 -0
  37. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/window.py +0 -0
  38. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/workspace.py +0 -0
  39. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/parts/workspace_symbols.py +0 -0
  40. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/protocol.py +0 -0
  41. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/common/server.py +0 -0
  42. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/hooks.py +0 -0
  43. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/py.typed +0 -0
  44. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/__init__.py +0 -0
  45. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/configuration.py +0 -0
  46. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/__init__.py +0 -0
  47. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/code_action_documentation.py +0 -0
  48. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/code_action_helper_mixin.py +0 -0
  49. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/code_action_quick_fixes.py +0 -0
  50. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/code_action_refactor.py +0 -0
  51. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/code_lens.py +0 -0
  52. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/completion.py +0 -0
  53. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/debugging_utils.py +0 -0
  54. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/diagnostics.py +0 -0
  55. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/document_highlight.py +0 -0
  56. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/document_symbols.py +0 -0
  57. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/documents_cache.py +0 -0
  58. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/folding_range.py +0 -0
  59. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/formatting.py +0 -0
  60. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/goto.py +0 -0
  61. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/hover.py +0 -0
  62. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/http_server.py +0 -0
  63. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/inlay_hint.py +0 -0
  64. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/inline_value.py +0 -0
  65. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/keywords_treeview.py +0 -0
  66. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/model_variables.py +0 -0
  67. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/project_info.py +0 -0
  68. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/protocol_part.py +0 -0
  69. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/rename.py +0 -0
  70. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/robocop_diagnostics.py +0 -0
  71. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/robocop_helper.py +0 -0
  72. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/robot_workspace.py +0 -0
  73. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/selection_range.py +0 -0
  74. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/signature_help.py +0 -0
  75. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/parts/workspace_symbols.py +0 -0
  76. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/protocol.py +0 -0
  77. {robotcode_language_server-2.8.0.dev548 → robotcode_language_server-2.8.0.dev631}/src/robotcode/language_server/robotframework/server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: robotcode-language-server
3
- Version: 2.8.0-dev.548
3
+ Version: 2.8.0-dev.631
4
4
  Summary: RobotCode Language Server for Robot Framework
5
5
  Project-URL: Homepage, https://robotcode.io
6
6
  Project-URL: Donate, https://opencollective.com/robotcode
@@ -26,10 +26,10 @@ Classifier: Programming Language :: Python :: Implementation :: PyPy
26
26
  Classifier: Topic :: Utilities
27
27
  Classifier: Typing :: Typed
28
28
  Requires-Python: >=3.10
29
- Requires-Dist: robotcode-analyze==2.8.0-dev.548
30
- Requires-Dist: robotcode-jsonrpc2==2.8.0-dev.548
31
- Requires-Dist: robotcode-robot==2.8.0-dev.548
32
- Requires-Dist: robotcode==2.8.0-dev.548
29
+ Requires-Dist: robotcode-analyze==2.8.0-dev.631
30
+ Requires-Dist: robotcode-jsonrpc2==2.8.0-dev.631
31
+ Requires-Dist: robotcode-robot==2.8.0-dev.631
32
+ Requires-Dist: robotcode==2.8.0-dev.631
33
33
  Requires-Dist: robotframework>=5.0.0
34
34
  Description-Content-Type: text/markdown
35
35
 
@@ -29,10 +29,10 @@ classifiers = [
29
29
  ]
30
30
  dependencies = [
31
31
  "robotframework>=5.0.0",
32
- "robotcode-jsonrpc2==2.8.0-dev.548",
33
- "robotcode-robot==2.8.0-dev.548",
34
- "robotcode-analyze==2.8.0-dev.548",
35
- "robotcode==2.8.0-dev.548",
32
+ "robotcode-jsonrpc2==2.8.0-dev.631",
33
+ "robotcode-robot==2.8.0-dev.631",
34
+ "robotcode-analyze==2.8.0-dev.631",
35
+ "robotcode==2.8.0-dev.631",
36
36
  ]
37
37
  dynamic = ["version"]
38
38
 
@@ -0,0 +1 @@
1
+ __version__ = "2.8.0-dev.631"
@@ -150,7 +150,37 @@ class RobotReferencesProtocolPart(RobotLanguageServerProtocolPart):
150
150
  if result is not None:
151
151
  return result
152
152
 
153
- return None
153
+ return self._references_at_namespace_prefix(document, position, context)
154
+
155
+ def _references_at_namespace_prefix(
156
+ self,
157
+ document: TextDocument,
158
+ position: Position,
159
+ context: ReferenceContext,
160
+ ) -> Optional[List[Location]]:
161
+ namespace = self.parent.documents_cache.get_namespace(document)
162
+
163
+ # the analysis keeps the range of every prefix of a keyword call, keyed by the library or resource it names
164
+ entries = [
165
+ entry
166
+ for entry, locations in namespace.namespace_references.items()
167
+ if not isinstance(entry, VariablesEntry) and any(position in location.range for location in locations)
168
+ ]
169
+ if not entries:
170
+ return None
171
+
172
+ # a prefix has the references of the import it names
173
+ result: List[Location] = []
174
+ for entry in entries:
175
+ if isinstance(entry, ResourceEntry):
176
+ result.extend(self._resource_references(document, entry, context))
177
+ elif entry.alias:
178
+ result.extend(self._library_alias_references(document, entry, context))
179
+ else:
180
+ result.extend(self._library_references(document, entry.library_doc))
181
+
182
+ # a prefix can name more than one entry, and their answers overlap
183
+ return list(dict.fromkeys(result))
154
184
 
155
185
  def _find_references_in_workspace(
156
186
  self,
@@ -230,10 +260,7 @@ class RobotReferencesProtocolPart(RobotLanguageServerProtocolPart):
230
260
  include_declaration: bool = True,
231
261
  stop_at_first: bool = False,
232
262
  ) -> List[Location]:
233
- result = []
234
-
235
- if include_declaration and variable.source:
236
- result.append(Location(str(Uri.from_path(variable.source)), variable.name_range))
263
+ result: List[Location] = []
237
264
 
238
265
  if variable.type == VariableDefinitionType.LOCAL_VARIABLE:
239
266
  result.extend(self.find_variable_references_in_file(document, variable, False))
@@ -243,6 +270,11 @@ class RobotReferencesProtocolPart(RobotLanguageServerProtocolPart):
243
270
  result.append(next(iter(refs)))
244
271
  else:
245
272
  result.extend(refs)
273
+
274
+ # the declaration last: LSP4IJ searches from the first location, and finds nothing in a Python file
275
+ if include_declaration and variable.source:
276
+ result.append(Location(str(Uri.from_path(variable.source)), variable.name_range))
277
+
246
278
  return result
247
279
 
248
280
  @_logger.call
@@ -321,15 +353,16 @@ class RobotReferencesProtocolPart(RobotLanguageServerProtocolPart):
321
353
  ) -> List[Location]:
322
354
  result = []
323
355
 
324
- if include_declaration and kw_doc.source:
325
- result.append(Location(str(Uri.from_path(kw_doc.source)), kw_doc.range))
326
-
327
356
  refs = self.parent.documents_cache.get_project_index(document).find_keyword_references(kw_doc)
328
357
  if stop_at_first and refs:
329
358
  result.append(next(iter(refs)))
330
359
  else:
331
360
  result.extend(refs)
332
361
 
362
+ # the declaration last: LSP4IJ searches from the first location, and finds nothing in a Python file
363
+ if include_declaration and kw_doc.source:
364
+ result.append(Location(str(Uri.from_path(kw_doc.source)), kw_doc.range))
365
+
333
366
  return result
334
367
 
335
368
  @_logger.call
@@ -388,12 +421,7 @@ class RobotReferencesProtocolPart(RobotLanguageServerProtocolPart):
388
421
  if library_doc is None:
389
422
  return None
390
423
 
391
- return self._find_references_in_workspace(
392
- document,
393
- False,
394
- self._find_library_import_references_in_file,
395
- library_doc,
396
- )
424
+ return self._library_references(document, library_doc)
397
425
 
398
426
  separator = import_node.get_token(RobotToken.WITH_NAME)
399
427
  alias_token = import_node.get_tokens(RobotToken.NAME)[-1] if separator else None
@@ -413,6 +441,19 @@ class RobotReferencesProtocolPart(RobotLanguageServerProtocolPart):
413
441
  if entry is None:
414
442
  return None
415
443
 
444
+ return self._library_alias_references(document, entry, context)
445
+
446
+ def _library_references(self, document: TextDocument, library_doc: LibraryDoc) -> List[Location]:
447
+ return self._find_references_in_workspace(
448
+ document,
449
+ False,
450
+ self._find_library_import_references_in_file,
451
+ library_doc,
452
+ )
453
+
454
+ def _library_alias_references(
455
+ self, document: TextDocument, entry: LibraryEntry, context: ReferenceContext
456
+ ) -> List[Location]:
416
457
  result = list(self.parent.documents_cache.get_project_index(document).find_namespace_references(entry))
417
458
 
418
459
  if context.include_declaration and entry.import_source:
@@ -475,6 +516,11 @@ class RobotReferencesProtocolPart(RobotLanguageServerProtocolPart):
475
516
  if entry is None:
476
517
  return None
477
518
 
519
+ return self._resource_references(document, entry, context)
520
+
521
+ def _resource_references(
522
+ self, document: TextDocument, entry: ResourceEntry, context: ReferenceContext
523
+ ) -> List[Location]:
478
524
  result = self._find_references_in_workspace(
479
525
  document,
480
526
  False,
@@ -21,6 +21,7 @@ from typing import (
21
21
  Union,
22
22
  cast,
23
23
  )
24
+ from weakref import WeakKeyDictionary
24
25
 
25
26
  from robot.parsing.lexer.tokens import Token
26
27
  from robot.parsing.model.blocks import Section
@@ -55,6 +56,7 @@ from robotcode.core.lsp.types import (
55
56
  SemanticTokenTypes,
56
57
  )
57
58
  from robotcode.core.text_document import TextDocument, range_to_utf16
59
+ from robotcode.robot.diagnostics.entities import ArgumentDefinition, EmbeddedArgumentDefinition
58
60
  from robotcode.robot.diagnostics.keyword_finder import DEFAULT_BDD_PREFIX_REGEXP, build_bdd_prefix_regexp
59
61
  from robotcode.robot.diagnostics.library_doc import (
60
62
  ALL_RUN_KEYWORDS_MATCHERS,
@@ -1099,6 +1101,12 @@ class SemanticTokenGenerator:
1099
1101
  TokenModifier.DOCUMENTATION: SemanticTokenModifiers.DOCUMENTATION,
1100
1102
  }
1101
1103
 
1104
+ # Modifiers that change the type instead: a variable that names an argument
1105
+ # renders as `parameter`, like the argument's declaration.
1106
+ _TOKEN_MODIFIER_TO_SEM_TYPE: ClassVar[Dict[Tuple[TokenKind, TokenModifier], AnyTokenType]] = {
1107
+ (TokenKind.VARIABLE, TokenModifier.ARGUMENT): SemanticTokenTypes.PARAMETER,
1108
+ }
1109
+
1102
1110
  # --- Legacy-compat emission policy (design D7) ---
1103
1111
 
1104
1112
  # Whole options of control structures render atomically: one control-flow
@@ -1151,6 +1159,8 @@ class SemanticTokenGenerator:
1151
1159
  """Initialize the generator with its own dependencies."""
1152
1160
  self.token_mapper = SemanticTokenMapper()
1153
1161
  self.keyword_analyzer = KeywordTokenAnalyzer(self.token_mapper)
1162
+ # a namespace holds the result of one analysis, so its argument uses never change
1163
+ self._argument_uses_cache: WeakKeyDictionary[Namespace, FrozenSet[Tuple[int, int]]] = WeakKeyDictionary()
1154
1164
 
1155
1165
  def collect_tokens_from_model(
1156
1166
  self,
@@ -1231,6 +1241,8 @@ class SemanticTokenGenerator:
1231
1241
  mapped = {self._TOKEN_MODIFIER_TO_SEM[m] for m in token.modifiers if m in self._TOKEN_MODIFIER_TO_SEM}
1232
1242
  if mapped:
1233
1243
  sem_mods = (sem_mods or set()) | mapped
1244
+ for m in token.modifiers:
1245
+ sem_type = self._TOKEN_MODIFIER_TO_SEM_TYPE.get((token.kind, m), sem_type)
1234
1246
  return SemTokenInfo(token.line, token.col_offset, token.length, sem_type, sem_mods)
1235
1247
 
1236
1248
  def _iter_model_sem_tokens(
@@ -1815,26 +1827,46 @@ class SemanticTokenGenerator:
1815
1827
  if not sub_tokens:
1816
1828
  yield SemTokenInfo.from_token(token, sem_type, sem_mod)
1817
1829
  return
1818
- yield from self._iter_variable_name_sem_tokens(sub_tokens, sem_type, sem_mod)
1830
+ yield from self._iter_variable_name_sem_tokens(sub_tokens, sem_type, sem_mod, self._argument_uses(namespace))
1831
+
1832
+ def _argument_uses(self, namespace: Namespace) -> FrozenSet[Tuple[int, int]]:
1833
+ """Where the analysis resolved a name to an argument from `[Arguments]`, the same resolution Find References
1834
+ and Rename use; embedded arguments are left out."""
1835
+ uses = self._argument_uses_cache.get(namespace)
1836
+ if uses is None:
1837
+ uses = frozenset(
1838
+ (location.range.start.line, location.range.start.character)
1839
+ for var, locations in namespace.variable_references.items()
1840
+ if isinstance(var, ArgumentDefinition) and not isinstance(var, EmbeddedArgumentDefinition)
1841
+ for location in locations
1842
+ )
1843
+ self._argument_uses_cache[namespace] = uses
1844
+ return uses
1819
1845
 
1820
1846
  def _iter_variable_name_sem_tokens(
1821
1847
  self,
1822
1848
  sub_tokens: Sequence[SemanticToken],
1823
1849
  sem_type: AnyTokenType,
1824
1850
  sem_mod: Optional[Set[AnyTokenModifier]],
1851
+ argument_uses: FrozenSet[Tuple[int, int]],
1825
1852
  ) -> Iterator[SemTokenInfo]:
1826
1853
  for sub in sub_tokens:
1827
1854
  if sub.kind is TokenKind.VARIABLE:
1828
1855
  if sub.sub_tokens:
1829
- yield from self._iter_variable_name_sem_tokens(sub.sub_tokens, RobotSemTokenTypes.VARIABLE, None)
1856
+ yield from self._iter_variable_name_sem_tokens(
1857
+ sub.sub_tokens, RobotSemTokenTypes.VARIABLE, None, argument_uses
1858
+ )
1830
1859
  else:
1831
1860
  yield SemTokenInfo(sub.line, sub.col_offset, sub.length, RobotSemTokenTypes.VARIABLE)
1832
1861
  elif sub.kind is TokenKind.PYTHON_EXPRESSION:
1833
1862
  continue
1834
1863
  elif sub.sub_tokens:
1835
- yield from self._iter_variable_name_sem_tokens(sub.sub_tokens, sem_type, sem_mod)
1864
+ yield from self._iter_variable_name_sem_tokens(sub.sub_tokens, sem_type, sem_mod, argument_uses)
1836
1865
  elif sub.kind is TokenKind.VARIABLE_BASE:
1837
- yield SemTokenInfo(sub.line, sub.col_offset, sub.length, sem_type, sem_mod)
1866
+ # a use of an argument is a parameter, like its declaration
1867
+ is_argument = (sub.range.start.line, sub.range.start.character) in argument_uses
1868
+ base_type = SemanticTokenTypes.PARAMETER if is_argument else sem_type
1869
+ yield SemTokenInfo(sub.line, sub.col_offset, sub.length, base_type, sem_mod)
1838
1870
  elif sub.kind is TokenKind.VARIABLE_TYPE_HINT:
1839
1871
  yield SemTokenInfo(sub.line, sub.col_offset, sub.length, SemanticTokenTypes.TYPE)
1840
1872
 
@@ -1 +0,0 @@
1
- __version__ = "2.8.0-dev.548"