Skip to content

Commit 90f65d9

Browse files
committed
analysing run keywords now correctly unescape keywords
1 parent eceb2e5 commit 90f65d9

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ All notable changes to the "robotcode" extension will be documented in this file
88

99
- some refactoring to speedup loading and parsing documents
1010
- semantic tokens now highlight builtin keywords
11+
- analysing run keywords now correctly unescape keywords
1112

1213
## 0.3.2
1314

robotcode/language_server/robotframework/diagnostics/namespace.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -597,20 +597,25 @@ async def _analyze_keyword_call(
597597
async def _analyse_run_keyword(
598598
self, keyword_doc: Optional[KeywordDoc], node: ast.AST, argument_tokens: List[Token]
599599
) -> List[Token]:
600+
from robot.utils.escaping import unescape
600601

601602
if keyword_doc is None or not keyword_doc.is_any_run_keyword():
602603
return argument_tokens
603604

604605
if keyword_doc.is_run_keyword() and len(argument_tokens) > 0 and is_not_variable_token(argument_tokens[0]):
605-
await self._analyze_keyword_call(argument_tokens[0].value, node, argument_tokens[0], argument_tokens[1:])
606+
await self._analyze_keyword_call(
607+
unescape(argument_tokens[0].value), node, argument_tokens[0], argument_tokens[1:]
608+
)
606609

607610
return argument_tokens[1:]
608611
elif (
609612
keyword_doc.is_run_keyword_with_condition()
610613
and len(argument_tokens) > 1
611614
and is_not_variable_token(argument_tokens[1])
612615
):
613-
await self._analyze_keyword_call(argument_tokens[1].value, node, argument_tokens[1], argument_tokens[2:])
616+
await self._analyze_keyword_call(
617+
unescape(argument_tokens[1].value), node, argument_tokens[1], argument_tokens[2:]
618+
)
614619
return argument_tokens[2:]
615620
elif keyword_doc.is_run_keywords():
616621
has_and = False
@@ -642,7 +647,7 @@ async def _analyse_run_keyword(
642647
args = argument_tokens
643648
argument_tokens = []
644649

645-
await self._analyze_keyword_call(t.value, node, t, args)
650+
await self._analyze_keyword_call(unescape(t.value), node, t, args)
646651

647652
return []
648653

@@ -658,7 +663,7 @@ def skip_args() -> None:
658663

659664
result = (
660665
await self._analyze_keyword_call(
661-
argument_tokens[1].value,
666+
unescape(argument_tokens[1].value),
662667
node,
663668
argument_tokens[1],
664669
argument_tokens[2:],
@@ -679,7 +684,7 @@ def skip_args() -> None:
679684
if argument_tokens[0].value == "ELSE" and len(argument_tokens) > 1:
680685

681686
result = await self._analyze_keyword_call(
682-
argument_tokens[1].value,
687+
unescape(argument_tokens[1].value),
683688
node,
684689
argument_tokens[1],
685690
argument_tokens[2:],
@@ -697,7 +702,7 @@ def skip_args() -> None:
697702
elif argument_tokens[0].value == "ELSE IF" and len(argument_tokens) > 2:
698703

699704
result = await self._analyze_keyword_call(
700-
argument_tokens[2].value,
705+
unescape(argument_tokens[2].value),
701706
node,
702707
argument_tokens[2],
703708
argument_tokens[3:],

robotcode/language_server/robotframework/parts/model_helper.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ async def get_run_keyword_keyworddoc_and_token_from_position(
1616
namespace: Namespace,
1717
position: Position,
1818
) -> Tuple[Optional[Tuple[Optional[KeywordDoc], Token]], List[Token]]:
19+
from robot.utils.escaping import unescape
1920

2021
if keyword_doc is None or not keyword_doc.is_any_run_keyword():
2122
return None, argument_tokens
2223

2324
if keyword_doc.is_run_keyword() and len(argument_tokens) > 0 and is_not_variable_token(argument_tokens[0]):
2425
result = await self.get_keyworddoc_and_token_from_position(
25-
argument_tokens[0].value, argument_tokens[0], argument_tokens[1:], namespace, position
26+
unescape(argument_tokens[0].value), argument_tokens[0], argument_tokens[1:], namespace, position
2627
)
2728

2829
return result, argument_tokens[1:]
@@ -32,7 +33,7 @@ async def get_run_keyword_keyworddoc_and_token_from_position(
3233
and is_not_variable_token(argument_tokens[1])
3334
):
3435
result = await self.get_keyworddoc_and_token_from_position(
35-
argument_tokens[1].value, argument_tokens[1], argument_tokens[2:], namespace, position
36+
unescape(argument_tokens[1].value), argument_tokens[1], argument_tokens[2:], namespace, position
3637
)
3738

3839
return result, argument_tokens[2:]
@@ -55,7 +56,9 @@ async def get_run_keyword_keyworddoc_and_token_from_position(
5556
else:
5657
args = []
5758

58-
result = await self.get_keyworddoc_and_token_from_position(t.value, t, args, namespace, position)
59+
result = await self.get_keyworddoc_and_token_from_position(
60+
unescape(t.value), t, args, namespace, position
61+
)
5962
if result is not None and result[0] is not None:
6063
return result, []
6164

@@ -99,7 +102,7 @@ def skip_args() -> None:
99102

100103
while argument_tokens:
101104
if argument_tokens[0].value == "ELSE" and len(argument_tokens) > 1:
102-
inner_keyword_doc = await namespace.find_keyword(argument_tokens[1].value)
105+
inner_keyword_doc = await namespace.find_keyword(unescape(argument_tokens[1].value))
103106

104107
if position.is_in_range(range_from_token(argument_tokens[1])):
105108
return (inner_keyword_doc, argument_tokens[1]), argument_tokens[2:]
@@ -119,7 +122,7 @@ def skip_args() -> None:
119122

120123
break
121124
elif argument_tokens[0].value == "ELSE IF" and len(argument_tokens) > 2:
122-
inner_keyword_doc = await namespace.find_keyword(argument_tokens[2].value)
125+
inner_keyword_doc = await namespace.find_keyword(unescape(argument_tokens[2].value))
123126

124127
if position.is_in_range(range_from_token(argument_tokens[2])):
125128
return (inner_keyword_doc, argument_tokens[2]), argument_tokens[3:]

0 commit comments

Comments
 (0)