robotcode-robot 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.
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/PKG-INFO +2 -2
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/pyproject.toml +1 -1
- robotcode_robot-2.8.0.dev631/src/robotcode/robot/__version__.py +1 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/library_doc.py +6 -3
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/namespace_analyzer.py +31 -12
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/analyzer.py +65 -12
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/enums.py +1 -0
- robotcode_robot-2.8.0.dev548/src/robotcode/robot/__version__.py +0 -1
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/.gitignore +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/README.md +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/__init__.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/config/__init__.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/config/loader.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/config/model.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/config/utils.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/__init__.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/analyzer_result.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/data_cache.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/diagnostic_rules.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/diagnostics_modifier.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/document_cache_helper.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/entities.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/errors.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/import_resolver.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/imports_manager.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/keyword_finder.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/model_helper.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/namespace.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/project_index.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/scope_tree.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/__init__.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/json_dump.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/model.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/nodes.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/run_keyword.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/serialization.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/semantic_analyzer/variable_tokenizer.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/variable_scope.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/diagnostics/workspace_config.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/py.typed +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/__init__.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/ast.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/markdown_docs.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/markdownformatter.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/match.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/robot_patching.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/robot_path.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/stubs.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/variables.py +0 -0
- {robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/visitor.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: robotcode-robot
|
|
3
|
-
Version: 2.8.0-dev.
|
|
3
|
+
Version: 2.8.0-dev.631
|
|
4
4
|
Summary: Support classes for RobotCode for handling Robot Framework projects.
|
|
5
5
|
Project-URL: Homepage, https://robotcode.io
|
|
6
6
|
Project-URL: Donate, https://opencollective.com/robotcode
|
|
@@ -27,7 +27,7 @@ Classifier: Topic :: Utilities
|
|
|
27
27
|
Classifier: Typing :: Typed
|
|
28
28
|
Requires-Python: >=3.10
|
|
29
29
|
Requires-Dist: platformdirs>=4.3
|
|
30
|
-
Requires-Dist: robotcode-core==2.8.0-dev.
|
|
30
|
+
Requires-Dist: robotcode-core==2.8.0-dev.631
|
|
31
31
|
Requires-Dist: robotframework>=5.0.0
|
|
32
32
|
Requires-Dist: tomli>=1.1.0; python_version < '3.11'
|
|
33
33
|
Description-Content-Type: text/markdown
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.8.0-dev.631"
|
|
@@ -1930,13 +1930,16 @@ class LibraryDoc:
|
|
|
1930
1930
|
def _get_title_markdown(self, header_level: int) -> str:
|
|
1931
1931
|
result = f"#{'#' * header_level} {(self.type.capitalize()) if self.type else 'Unknown'} *{self.name}*\n\n"
|
|
1932
1932
|
|
|
1933
|
-
|
|
1933
|
+
# resource and suite files show GLOBAL, as in Libdoc; variable files have no scope in Robot Framework
|
|
1934
|
+
scope = self.scope if self.type != "VARIABLES" else ""
|
|
1935
|
+
|
|
1936
|
+
if self.version or scope:
|
|
1934
1937
|
result += "| | |\n| :--- | :--- |\n"
|
|
1935
1938
|
|
|
1936
1939
|
if self.version:
|
|
1937
1940
|
result += f"| **Library Version:** | {self.version} |\n"
|
|
1938
|
-
if
|
|
1939
|
-
result += f"| **Library Scope:** | {
|
|
1941
|
+
if scope:
|
|
1942
|
+
result += f"| **Library Scope:** | {scope} |\n"
|
|
1940
1943
|
|
|
1941
1944
|
result += "\n\n"
|
|
1942
1945
|
|
|
@@ -1458,7 +1458,10 @@ class NamespaceAnalyzer(Visitor):
|
|
|
1458
1458
|
ignore_errors=True,
|
|
1459
1459
|
)
|
|
1460
1460
|
|
|
1461
|
-
if
|
|
1461
|
+
if (
|
|
1462
|
+
not matcher.is_assign(allow_assign_mark=True, allow_nested=True, allow_items=True)
|
|
1463
|
+
or matcher.name is None
|
|
1464
|
+
):
|
|
1462
1465
|
return
|
|
1463
1466
|
|
|
1464
1467
|
if RF_VERSION >= (7, 0) and contains_variable(matcher.base, "$@&%"):
|
|
@@ -1496,6 +1499,19 @@ class NamespaceAnalyzer(Visitor):
|
|
|
1496
1499
|
stripped_name_token = strip_variable_token(assign_token, matcher=matcher, parse_type=True)
|
|
1497
1500
|
|
|
1498
1501
|
if matcher.items:
|
|
1502
|
+
# Robot Framework resolves the variables in the index; the search without types keeps a type
|
|
1503
|
+
# in the base, so the index starts after it
|
|
1504
|
+
raw = search_variable(matcher.string, ignore_errors=True)
|
|
1505
|
+
items_start = raw.start + len(raw.identifier) + len(raw.base) + 2
|
|
1506
|
+
items_token = Token(
|
|
1507
|
+
Token.ARGUMENT,
|
|
1508
|
+
matcher.string[items_start : raw.end],
|
|
1509
|
+
assign_token.lineno,
|
|
1510
|
+
assign_token.col_offset + items_start,
|
|
1511
|
+
)
|
|
1512
|
+
for var_token, var in self._iter_variables_from_token(items_token):
|
|
1513
|
+
self._handle_find_variable_result(var_token, var)
|
|
1514
|
+
|
|
1499
1515
|
existing_var = self._find_variable(name)
|
|
1500
1516
|
if existing_var is None:
|
|
1501
1517
|
self._handle_find_variable_result(
|
|
@@ -1611,18 +1627,21 @@ class NamespaceAnalyzer(Visitor):
|
|
|
1611
1627
|
if not matcher.is_scalar_assign():
|
|
1612
1628
|
return
|
|
1613
1629
|
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1630
|
+
existing_var = next(
|
|
1631
|
+
(
|
|
1632
|
+
v
|
|
1633
|
+
for k, v in self._variables.items()
|
|
1634
|
+
if k == matcher
|
|
1635
|
+
and v.type in [VariableDefinitionType.ARGUMENT, VariableDefinitionType.LOCAL_VARIABLE]
|
|
1636
|
+
),
|
|
1637
|
+
None,
|
|
1638
|
+
)
|
|
1639
|
+
if existing_var is not None:
|
|
1640
|
+
# EXCEPT AS sets the existing variable again, like a FOR variable of that name
|
|
1641
|
+
self._variable_references[existing_var].add(
|
|
1642
|
+
Location(self._document_uri, range_from_token(strip_variable_token(variable_token)))
|
|
1623
1643
|
)
|
|
1624
|
-
|
|
1625
|
-
):
|
|
1644
|
+
else:
|
|
1626
1645
|
var_def = LocalVariableDefinition(
|
|
1627
1646
|
name=variable_token.value,
|
|
1628
1647
|
name_token=strip_variable_token(variable_token),
|
|
@@ -405,6 +405,8 @@ class SemanticAnalyzer(Visitor):
|
|
|
405
405
|
)
|
|
406
406
|
self._logger.exception(e)
|
|
407
407
|
|
|
408
|
+
self._mark_argument_uses()
|
|
409
|
+
|
|
408
410
|
# Build indexes
|
|
409
411
|
self._semantic_model.build_index()
|
|
410
412
|
|
|
@@ -423,6 +425,38 @@ class SemanticAnalyzer(Visitor):
|
|
|
423
425
|
semantic_model=self._semantic_model,
|
|
424
426
|
)
|
|
425
427
|
|
|
428
|
+
def _mark_argument_uses(self) -> None:
|
|
429
|
+
"""Mark every variable token whose name the analysis resolved to an argument from `[Arguments]`, the same
|
|
430
|
+
resolution Find References and Rename use; embedded arguments stay unmarked."""
|
|
431
|
+
starts = {
|
|
432
|
+
(location.range.start.line, location.range.start.character)
|
|
433
|
+
for var, locations in self._variable_references.items()
|
|
434
|
+
if isinstance(var, ArgumentDefinition) and not isinstance(var, EmbeddedArgumentDefinition)
|
|
435
|
+
for location in locations
|
|
436
|
+
}
|
|
437
|
+
if starts:
|
|
438
|
+
for stmt in self._semantic_model.statements:
|
|
439
|
+
self._mark_argument_uses_in_statement(stmt, starts)
|
|
440
|
+
|
|
441
|
+
def _mark_argument_uses_in_statement(self, stmt: SemanticStatement, starts: Set[Tuple[int, int]]) -> None:
|
|
442
|
+
for token in stmt.tokens:
|
|
443
|
+
self._mark_argument_uses_in_token(token, starts)
|
|
444
|
+
# the inner calls of a Run Keyword variant have tokens of their own
|
|
445
|
+
if isinstance(stmt, RunKeywordCallStatement):
|
|
446
|
+
for inner in stmt.inner_calls:
|
|
447
|
+
self._mark_argument_uses_in_statement(inner, starts)
|
|
448
|
+
|
|
449
|
+
def _mark_argument_uses_in_token(self, token: SemanticToken, starts: Set[Tuple[int, int]]) -> None:
|
|
450
|
+
for sub in token.sub_tokens or ():
|
|
451
|
+
self._mark_argument_uses_in_token(sub, starts)
|
|
452
|
+
# a reference covers the name of the variable, its base
|
|
453
|
+
if (
|
|
454
|
+
token.kind is TokenKind.VARIABLE
|
|
455
|
+
and sub.kind is TokenKind.VARIABLE_BASE
|
|
456
|
+
and (sub.range.start.line, sub.range.start.character) in starts
|
|
457
|
+
):
|
|
458
|
+
token.modifiers = (token.modifiers or frozenset()) | {TokenModifier.ARGUMENT}
|
|
459
|
+
|
|
426
460
|
# --- Semantic Model helpers ---
|
|
427
461
|
|
|
428
462
|
# Statement kinds that act as the block-header for control-flow blocks.
|
|
@@ -3176,7 +3210,10 @@ class SemanticAnalyzer(Visitor):
|
|
|
3176
3210
|
ignore_errors=True,
|
|
3177
3211
|
)
|
|
3178
3212
|
|
|
3179
|
-
if
|
|
3213
|
+
if (
|
|
3214
|
+
not matcher.is_assign(allow_assign_mark=True, allow_nested=True, allow_items=True)
|
|
3215
|
+
or matcher.name is None
|
|
3216
|
+
):
|
|
3180
3217
|
return
|
|
3181
3218
|
|
|
3182
3219
|
if RF_VERSION >= (7, 0) and contains_variable(matcher.base, "$@&%"):
|
|
@@ -3220,6 +3257,19 @@ class SemanticAnalyzer(Visitor):
|
|
|
3220
3257
|
stripped_name_token = strip_variable_token(assign_token, matcher=matcher, parse_type=True)
|
|
3221
3258
|
|
|
3222
3259
|
if matcher.items:
|
|
3260
|
+
# Robot Framework resolves the variables in the index; the search without types keeps a type
|
|
3261
|
+
# in the base, so the index starts after it
|
|
3262
|
+
raw = search_variable(matcher.string, ignore_errors=True)
|
|
3263
|
+
items_start = raw.start + len(raw.identifier) + len(raw.base) + 2
|
|
3264
|
+
items_token = Token(
|
|
3265
|
+
Token.ARGUMENT,
|
|
3266
|
+
matcher.string[items_start : raw.end],
|
|
3267
|
+
assign_token.lineno,
|
|
3268
|
+
assign_token.col_offset + items_start,
|
|
3269
|
+
)
|
|
3270
|
+
for var_token, var in self._iter_variables_from_token(items_token):
|
|
3271
|
+
self._handle_find_variable_result(var_token, var)
|
|
3272
|
+
|
|
3223
3273
|
existing_var = self._find_variable(name)
|
|
3224
3274
|
if existing_var is None:
|
|
3225
3275
|
self._handle_find_variable_result(
|
|
@@ -3468,18 +3518,21 @@ class SemanticAnalyzer(Visitor):
|
|
|
3468
3518
|
if not matcher.is_scalar_assign():
|
|
3469
3519
|
return
|
|
3470
3520
|
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3521
|
+
existing_var = next(
|
|
3522
|
+
(
|
|
3523
|
+
v
|
|
3524
|
+
for k, v in self._variables.items()
|
|
3525
|
+
if k == matcher
|
|
3526
|
+
and v.type in [VariableDefinitionType.ARGUMENT, VariableDefinitionType.LOCAL_VARIABLE]
|
|
3527
|
+
),
|
|
3528
|
+
None,
|
|
3529
|
+
)
|
|
3530
|
+
if existing_var is not None:
|
|
3531
|
+
# EXCEPT AS sets the existing variable again, like a FOR variable of that name
|
|
3532
|
+
self._variable_references[existing_var].add(
|
|
3533
|
+
Location(self._document_uri, range_from_token(strip_variable_token(variable_token)))
|
|
3480
3534
|
)
|
|
3481
|
-
|
|
3482
|
-
):
|
|
3535
|
+
else:
|
|
3483
3536
|
var_def = LocalVariableDefinition(
|
|
3484
3537
|
name=variable_token.value,
|
|
3485
3538
|
name_token=strip_variable_token(variable_token),
|
|
@@ -194,6 +194,7 @@ class TokenModifier(Enum):
|
|
|
194
194
|
EMBEDDED = "embedded"
|
|
195
195
|
DECLARATION = "declaration"
|
|
196
196
|
DOCUMENTATION = "documentation"
|
|
197
|
+
ARGUMENT = "argument" # a variable that names an argument from the keyword's [Arguments], not an embedded one
|
|
197
198
|
|
|
198
199
|
|
|
199
200
|
class ForFlavor(Enum):
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.8.0-dev.548"
|
|
File without changes
|
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/__init__.py
RENAMED
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/config/__init__.py
RENAMED
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/config/loader.py
RENAMED
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/config/model.py
RENAMED
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/config/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/__init__.py
RENAMED
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/ast.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/match.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/stubs.py
RENAMED
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/variables.py
RENAMED
|
File without changes
|
{robotcode_robot-2.8.0.dev548 → robotcode_robot-2.8.0.dev631}/src/robotcode/robot/utils/visitor.py
RENAMED
|
File without changes
|