Skip to content

Commit 3a4ee79

Browse files
committed
fix: correct analyzing of variables in WhileHeader options
1 parent f8cb770 commit 3a4ee79

File tree

105 files changed

+3657
-27
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+3657
-27
lines changed

packages/robot/src/robotcode/robot/diagnostics/namespace_analyzer.py

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ def _visit_Variable(self, node: Variable) -> None: # noqa: N802
294294
if get_robot_version() >= (7, 0):
295295

296296
def visit_Var(self, node: Statement) -> None: # noqa: N802
297-
self._visit_statement(node)
297+
self._analyze_statement_variables(node)
298298

299299
variable = node.get_token(Token.VARIABLE)
300300
if variable is None:
@@ -348,13 +348,15 @@ def visit_Var(self, node: Statement) -> None: # noqa: N802
348348
pass
349349

350350
def visit_Statement(self, node: Statement) -> None: # noqa: N802
351-
self._visit_statement(node)
351+
self._analyze_statement_variables(node)
352352

353-
def _visit_statement(self, node: Statement, severity: DiagnosticSeverity = DiagnosticSeverity.ERROR) -> None:
353+
def _analyze_statement_variables(
354+
self, node: Statement, severity: DiagnosticSeverity = DiagnosticSeverity.ERROR
355+
) -> None:
354356
for token in node.get_tokens(Token.ARGUMENT):
355357
self._analyze_token_variables(token, severity)
356358

357-
def _visit_expression_statement(
359+
def _analyze_statement_expression_variables(
358360
self, node: Statement, severity: DiagnosticSeverity = DiagnosticSeverity.ERROR
359361
) -> None:
360362

@@ -367,7 +369,7 @@ def _visit_settings_statement(
367369
) -> None:
368370
self._in_setting = True
369371
try:
370-
self._visit_statement(node, severity)
372+
self._analyze_statement_variables(node, severity)
371373
finally:
372374
self._in_setting = False
373375

@@ -921,7 +923,7 @@ def visit_Fixture(self, node: Fixture) -> None: # noqa: N802
921923

922924
if keyword_token is not None and keyword_token.value and keyword_token.value.upper() not in ("", "NONE"):
923925
self._analyze_token_variables(keyword_token)
924-
self._visit_statement(node)
926+
self._analyze_statement_variables(node)
925927

926928
self._analyze_keyword_call(
927929
node,
@@ -977,7 +979,7 @@ def visit_KeywordCall(self, node: KeywordCall) -> None: # noqa: N802
977979
return
978980

979981
self._analyze_token_variables(keyword_token)
980-
self._visit_statement(node)
982+
self._analyze_statement_variables(node)
981983

982984
self._analyze_keyword_call(
983985
node,
@@ -1202,12 +1204,12 @@ def _analyze_assign_statement(self, node: Statement) -> None:
12021204
pass
12031205

12041206
def visit_InlineIfHeader(self, node: Statement) -> None: # noqa: N802
1205-
self._visit_expression_statement(node)
1207+
self._analyze_statement_expression_variables(node)
12061208

12071209
self._analyze_assign_statement(node)
12081210

12091211
def visit_ForHeader(self, node: Statement) -> None: # noqa: N802
1210-
self._visit_statement(node)
1212+
self._analyze_statement_variables(node)
12111213

12121214
variables = node.get_tokens(Token.VARIABLE)
12131215
for variable in variables:
@@ -1243,7 +1245,8 @@ def visit_ForHeader(self, node: Statement) -> None: # noqa: N802
12431245
)
12441246

12451247
def visit_ExceptHeader(self, node: Statement) -> None: # noqa: N802
1246-
self._visit_statement(node)
1248+
self._analyze_statement_variables(node)
1249+
self._analyze_option_token_variables(node)
12471250

12481251
variable_token = node.get_token(Token.VARIABLE)
12491252

@@ -1299,7 +1302,7 @@ def _format_template(self, template: str, arguments: Tuple[str, ...]) -> Tuple[s
12991302
return "".join(temp), ()
13001303

13011304
def visit_TemplateArguments(self, node: TemplateArguments) -> None: # noqa: N802
1302-
self._visit_statement(node)
1305+
self._analyze_statement_variables(node)
13031306

13041307
template = self._template or self._test_template
13051308
if template is not None and template.value is not None and template.value.upper() not in ("", "NONE"):
@@ -1339,10 +1342,10 @@ def visit_TemplateArguments(self, node: TemplateArguments) -> None: # noqa: N80
13391342
self.generic_visit(node)
13401343

13411344
def visit_DefaultTags(self, node: Statement) -> None: # noqa: N802
1342-
self._visit_statement(node, DiagnosticSeverity.HINT)
1345+
self._analyze_statement_variables(node, DiagnosticSeverity.HINT)
13431346

13441347
def visit_ForceTags(self, node: Statement) -> None: # noqa: N802
1345-
self._visit_statement(node, DiagnosticSeverity.HINT)
1348+
self._analyze_statement_variables(node, DiagnosticSeverity.HINT)
13461349

13471350
if get_robot_version() >= (6, 0):
13481351
tag = node.get_token(Token.FORCE_TAGS)
@@ -1356,7 +1359,7 @@ def visit_ForceTags(self, node: Statement) -> None: # noqa: N802
13561359
)
13571360

13581361
def visit_TestTags(self, node: Statement) -> None: # noqa: N802
1359-
self._visit_statement(node, DiagnosticSeverity.HINT)
1362+
self._analyze_statement_variables(node, DiagnosticSeverity.HINT)
13601363

13611364
if get_robot_version() >= (6, 0):
13621365
tag = node.get_token(Token.FORCE_TAGS)
@@ -1376,7 +1379,7 @@ def visit_DocumentationOrMetadata(self, node: Statement) -> None: # noqa: N802
13761379
self._visit_settings_statement(node, DiagnosticSeverity.HINT)
13771380

13781381
def visit_Timeout(self, node: Statement) -> None: # noqa: N802
1379-
self._visit_statement(node, DiagnosticSeverity.HINT)
1382+
self._analyze_statement_variables(node, DiagnosticSeverity.HINT)
13801383

13811384
def visit_SingleValue(self, node: Statement) -> None: # noqa: N802
13821385
self._visit_settings_statement(node, DiagnosticSeverity.HINT)
@@ -1402,7 +1405,7 @@ def visit_Tags(self, node: Statement) -> None: # noqa: N802
14021405
)
14031406

14041407
def visit_SectionHeader(self, node: Statement) -> None: # noqa: N802
1405-
self._visit_statement(node)
1408+
self._analyze_statement_variables(node)
14061409

14071410
if get_robot_version() >= (7, 0):
14081411
token = node.get_token(*Token.HEADER_TOKENS)
@@ -1425,7 +1428,7 @@ def visit_SectionHeader(self, node: Statement) -> None: # noqa: N802
14251428
)
14261429

14271430
def visit_ReturnSetting(self, node: Statement) -> None: # noqa: N802
1428-
self._visit_statement(node)
1431+
self._analyze_statement_variables(node)
14291432

14301433
if get_robot_version() >= (7, 0):
14311434
token = node.get_token(Token.RETURN_SETTING)
@@ -1456,7 +1459,7 @@ def visit_VariablesImport(self, node: VariablesImport) -> None: # noqa: N802
14561459
return
14571460

14581461
self._analyze_token_variables(name_token)
1459-
self._visit_statement(node)
1462+
self._analyze_statement_variables(node)
14601463

14611464
found = False
14621465
entries = self._namespace.get_import_entries()
@@ -1485,7 +1488,7 @@ def visit_ResourceImport(self, node: ResourceImport) -> None: # noqa: N802
14851488
return
14861489

14871490
self._analyze_token_variables(name_token)
1488-
self._visit_statement(node)
1491+
self._analyze_statement_variables(node)
14891492

14901493
found = False
14911494
entries = self._namespace.get_import_entries()
@@ -1513,7 +1516,7 @@ def visit_LibraryImport(self, node: LibraryImport) -> None: # noqa: N802
15131516
return
15141517

15151518
self._analyze_token_variables(name_token)
1516-
self._visit_statement(node)
1519+
self._analyze_statement_variables(node)
15171520

15181521
found = False
15191522
entries = self._namespace.get_import_entries()
@@ -1533,8 +1536,11 @@ def visit_LibraryImport(self, node: LibraryImport) -> None: # noqa: N802
15331536
break
15341537

15351538
def visit_WhileHeader(self, node: Statement) -> None: # noqa: N802
1536-
self._visit_expression_statement(node)
1539+
self._analyze_statement_expression_variables(node)
1540+
1541+
self._analyze_option_token_variables(node)
15371542

1543+
def _analyze_option_token_variables(self, node: Statement) -> None:
15381544
for token in node.get_tokens(Token.OPTION):
15391545
if token.value and "=" in token.value:
15401546
name, value = token.value.split("=", 1)
@@ -1543,10 +1549,10 @@ def visit_WhileHeader(self, node: Statement) -> None: # noqa: N802
15431549
self._analyze_token_variables(value_token)
15441550

15451551
def visit_IfHeader(self, node: Statement) -> None: # noqa: N802
1546-
self._visit_expression_statement(node)
1552+
self._analyze_statement_expression_variables(node)
15471553

15481554
def visit_IfElseHeader(self, node: Statement) -> None: # noqa: N802
1549-
self._visit_expression_statement(node)
1555+
self._analyze_statement_expression_variables(node)
15501556

15511557
def _find_variable(self, name: str) -> Optional[VariableDefinition]:
15521558
if name[:2] == "%{" and name[-1] == "}":
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
data: !GeneratedTestData
2+
character: 21
3+
line: 258
4+
name: an argument
5+
result:
6+
- !Location
7+
range:
8+
end:
9+
character: 26
10+
line: 258
11+
start:
12+
character: 21
13+
line: 258
14+
uri: tests/references.robot
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
data: !GeneratedTestData
2+
character: 24
3+
line: 258
4+
name: an argument
5+
result:
6+
- !Location
7+
range:
8+
end:
9+
character: 26
10+
line: 258
11+
start:
12+
character: 21
13+
line: 258
14+
uri: tests/references.robot
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data: !GeneratedTestData
2+
character: 27
3+
line: 258
4+
name: an argument
5+
result: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data: !GeneratedTestData
2+
character: 14
3+
line: 261
4+
name: local variable usage
5+
result: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data: !GeneratedTestData
2+
character: 19
3+
line: 261
4+
name: argument usage
5+
result: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data: !GeneratedTestData
2+
character: 21
3+
line: 261
4+
name: argument usage
5+
result: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data: !GeneratedTestData
2+
character: 23
3+
line: 261
4+
name: argument usage
5+
result: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
data: !GeneratedTestData
2+
character: 36
3+
line: 261
4+
name: argument usage in while option
5+
result:
6+
- !Location
7+
range:
8+
end:
9+
character: 40
10+
line: 258
11+
start:
12+
character: 33
13+
line: 258
14+
uri: tests/references.robot
15+
- !Location
16+
range:
17+
end:
18+
character: 43
19+
line: 261
20+
start:
21+
character: 36
22+
line: 261
23+
uri: tests/references.robot
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
data: !GeneratedTestData
2+
character: 39
3+
line: 261
4+
name: argument usage in while option
5+
result:
6+
- !Location
7+
range:
8+
end:
9+
character: 40
10+
line: 258
11+
start:
12+
character: 33
13+
line: 258
14+
uri: tests/references.robot
15+
- !Location
16+
range:
17+
end:
18+
character: 43
19+
line: 261
20+
start:
21+
character: 36
22+
line: 261
23+
uri: tests/references.robot

0 commit comments

Comments
 (0)