@@ -330,6 +330,7 @@ async def _analyze_keyword_call(
330
330
argument_tokens : List [Token ],
331
331
analyse_run_keywords : bool = True ,
332
332
allow_variables : bool = False ,
333
+ ignore_errors_if_contains_variables : bool = False ,
333
334
) -> Optional [KeywordDoc ]:
334
335
from robot .parsing .lexer .tokens import Token as RobotToken
335
336
from robot .parsing .model .statements import Template , TestTemplate
@@ -371,13 +372,14 @@ async def _analyze_keyword_call(
371
372
372
373
result = await self .finder .find_keyword (keyword )
373
374
374
- for e in self .finder .diagnostics :
375
- await self .append_diagnostics (
376
- range = kw_range ,
377
- message = e .message ,
378
- severity = e .severity ,
379
- code = e .code ,
380
- )
375
+ if not ignore_errors_if_contains_variables or is_not_variable_token (keyword_token ):
376
+ for e in self .finder .diagnostics :
377
+ await self .append_diagnostics (
378
+ range = kw_range ,
379
+ message = e .message ,
380
+ severity = e .severity ,
381
+ code = e .code ,
382
+ )
381
383
382
384
if result is not None :
383
385
if self .namespace .document is not None :
@@ -544,22 +546,27 @@ async def _analyse_run_keyword(
544
546
if keyword_doc is None or not keyword_doc .is_any_run_keyword ():
545
547
return argument_tokens
546
548
547
- if keyword_doc .is_run_keyword () and len (argument_tokens ) > 0 and is_not_variable_token ( argument_tokens [ 0 ]) :
549
+ if keyword_doc .is_run_keyword () and len (argument_tokens ) > 0 :
548
550
await self ._analyze_keyword_call (
549
- unescape (argument_tokens [0 ].value ), node , argument_tokens [0 ], argument_tokens [1 :]
551
+ unescape (argument_tokens [0 ].value ),
552
+ node ,
553
+ argument_tokens [0 ],
554
+ argument_tokens [1 :],
555
+ allow_variables = True ,
556
+ ignore_errors_if_contains_variables = True ,
550
557
)
551
558
552
559
return argument_tokens [1 :]
553
- elif (
554
- keyword_doc .is_run_keyword_with_condition ()
555
- and len (argument_tokens ) > (cond_count := keyword_doc .run_keyword_condition_count ())
556
- and is_not_variable_token (argument_tokens [cond_count ])
560
+ elif keyword_doc .is_run_keyword_with_condition () and len (argument_tokens ) > (
561
+ cond_count := keyword_doc .run_keyword_condition_count ()
557
562
):
558
563
await self ._analyze_keyword_call (
559
564
unescape (argument_tokens [cond_count ].value ),
560
565
node ,
561
566
argument_tokens [cond_count ],
562
567
argument_tokens [cond_count + 1 :],
568
+ allow_variables = True ,
569
+ ignore_errors_if_contains_variables = True ,
563
570
)
564
571
return argument_tokens [cond_count + 1 :]
565
572
elif keyword_doc .is_run_keywords ():
@@ -577,9 +584,6 @@ async def _analyse_run_keyword(
577
584
)
578
585
continue
579
586
580
- if not is_not_variable_token (t ):
581
- continue
582
-
583
587
and_token = next ((e for e in argument_tokens if e .value == "AND" ), None )
584
588
args = []
585
589
if and_token is not None :
@@ -590,7 +594,14 @@ async def _analyse_run_keyword(
590
594
args = argument_tokens
591
595
argument_tokens = []
592
596
593
- await self ._analyze_keyword_call (unescape (t .value ), node , t , args )
597
+ await self ._analyze_keyword_call (
598
+ unescape (t .value ),
599
+ node ,
600
+ t ,
601
+ args ,
602
+ allow_variables = True ,
603
+ ignore_errors_if_contains_variables = True ,
604
+ )
594
605
595
606
return []
596
607
@@ -620,14 +631,15 @@ def skip_args() -> List[Token]:
620
631
621
632
args = skip_args ()
622
633
623
- if is_not_variable_token (kwt ):
624
- await self ._analyze_keyword_call (
625
- unescape (kwt .value ),
626
- node ,
627
- kwt ,
628
- args ,
629
- analyse_run_keywords = False ,
630
- )
634
+ await self ._analyze_keyword_call (
635
+ unescape (kwt .value ),
636
+ node ,
637
+ kwt ,
638
+ args ,
639
+ analyse_run_keywords = False ,
640
+ allow_variables = True ,
641
+ ignore_errors_if_contains_variables = True ,
642
+ )
631
643
632
644
while argument_tokens :
633
645
if argument_tokens [0 ].value == "ELSE" and len (argument_tokens ) > 1 :
@@ -682,12 +694,16 @@ async def visit_Fixture(self, node: ast.AST) -> None: # noqa: N802
682
694
683
695
if (
684
696
keyword_token is not None
685
- and is_not_variable_token (keyword_token )
686
697
and keyword_token .value is not None
687
698
and keyword_token .value .upper () not in ("" , "NONE" )
688
699
):
689
700
await self ._analyze_keyword_call (
690
- value .name , value , keyword_token , [cast (Token , e ) for e in value .get_tokens (RobotToken .ARGUMENT )]
701
+ value .name ,
702
+ value ,
703
+ keyword_token ,
704
+ [cast (Token , e ) for e in value .get_tokens (RobotToken .ARGUMENT )],
705
+ allow_variables = True ,
706
+ ignore_errors_if_contains_variables = True ,
691
707
)
692
708
693
709
await self .generic_visit (node )
0 commit comments