Skip to content

Commit 89f48a1

Browse files
committed
Support for NONE in Setup/Teardowns fixes #38
1 parent 419a9e5 commit 89f48a1

File tree

12 files changed

+158
-29
lines changed

12 files changed

+158
-29
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ All notable changes to the "robotcode" extension will be documented in this file
88
- Add "Dry Run" and "Dry Debug" profile to test explorer
99
- You can select it via Run/Debug dropdown or Right Click on the "green arrow" before the test case/suite or in test explorer and then "Execute Using Profile"
1010
- Mark using reserved keywords like "Break", "While",... as errors
11+
- Support for NONE in Setup/Teardowns
12+
- see [here](https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-setup-and-teardown)
13+
- fixes [#38](https://github.com/d-biehl/robotcode/issues/38)
1114

1215
## 0.6.0
1316

robotcode/language_server/robotframework/diagnostics/analyzer.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,12 @@ async def visit_Fixture(self, node: ast.AST) -> None: # noqa: N802
368368

369369
# TODO: calculate possible variables in NAME
370370

371-
if keyword_token is not None and is_not_variable_token(keyword_token):
371+
if (
372+
keyword_token is not None
373+
and is_not_variable_token(keyword_token)
374+
and keyword_token.value is not None
375+
and keyword_token.value.upper() not in ("", "NONE")
376+
):
372377
await self._analyze_keyword_call(
373378
value.name, value, keyword_token, [cast(Token, e) for e in value.get_tokens(RobotToken.ARGUMENT)]
374379
)

robotcode/language_server/robotframework/parts/completion.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ async def create_keyword_settings_completion_items(self, range: Optional[Range])
461461
]
462462

463463
async def create_keyword_completion_items(
464-
self, token: Optional[Token], position: Position, add_reserverd: bool = True
464+
self, token: Optional[Token], position: Position, *, add_reserverd: bool = True, add_none: bool = False
465465
) -> List[CompletionItem]:
466466
result: List[CompletionItem] = []
467467
if self.document is None:
@@ -601,6 +601,17 @@ def enumerate_indexes(s: str, c: str) -> Iterator[int]:
601601
)
602602
result.append(c)
603603

604+
if add_none:
605+
result.append(
606+
CompletionItem(
607+
label="NONE",
608+
kind=CompletionItemKind.KEYWORD,
609+
sort_text="998_NONE",
610+
insert_text_format=InsertTextFormat.PLAINTEXT,
611+
text_edit=TextEdit(range=r, new_text="NONE") if r is not None else None,
612+
)
613+
)
614+
604615
if add_reserverd:
605616
for k in get_reserved_keywords():
606617
c = CompletionItem(
@@ -940,6 +951,7 @@ async def _complete_SuiteSetup_or_SuiteTeardown_or_TestTemplate( # noqa: N802
940951
statement_node.tokens[2] if r.end == position and len(statement_node.tokens) > 2 else None,
941952
position,
942953
add_reserverd=False,
954+
add_none=True,
943955
)
944956

945957
if len(statement_node.tokens) > 2:
@@ -950,7 +962,10 @@ async def _complete_SuiteSetup_or_SuiteTeardown_or_TestTemplate( # noqa: N802
950962
r = range_from_token(token)
951963
if position.is_in_range(r) or r.end == position:
952964
return await self.create_keyword_completion_items(
953-
None if self.is_bdd_token(token) else token, position, add_reserverd=False
965+
None if self.is_bdd_token(token) else token,
966+
position,
967+
add_reserverd=False,
968+
add_none=True,
954969
)
955970

956971
if len(statement_node.tokens) > 3:
@@ -962,7 +977,10 @@ async def _complete_SuiteSetup_or_SuiteTeardown_or_TestTemplate( # noqa: N802
962977
r.end.character += 1
963978
if position.is_in_range(r) or r.end == position:
964979
return await self.create_keyword_completion_items(
965-
None if self.is_bdd_token(token) else token, position, add_reserverd=False
980+
None if self.is_bdd_token(token) else token,
981+
position,
982+
add_reserverd=False,
983+
add_none=True,
966984
)
967985

968986
return None
@@ -1061,6 +1079,7 @@ async def complete_Setup_or_Teardown_or_Template( # noqa: N802
10611079
statement_node.tokens[3] if r.end == position and len(statement_node.tokens) > 3 else None,
10621080
position,
10631081
add_reserverd=False,
1082+
add_none=True,
10641083
)
10651084

10661085
if len(statement_node.tokens) > 3:
@@ -1070,7 +1089,12 @@ async def complete_Setup_or_Teardown_or_Template( # noqa: N802
10701089

10711090
r = range_from_token(token)
10721091
if position.is_in_range(r) or r.end == position:
1073-
return await self.create_keyword_completion_items(token, position, add_reserverd=False)
1092+
return await self.create_keyword_completion_items(
1093+
token,
1094+
position,
1095+
add_reserverd=False,
1096+
add_none=True,
1097+
)
10741098

10751099
if len(statement_node.tokens) > 4:
10761100
second_token = statement_node.tokens[4]
@@ -1081,7 +1105,10 @@ async def complete_Setup_or_Teardown_or_Template( # noqa: N802
10811105
r.end.character += 1
10821106
if position.is_in_range(r) or r.end == position:
10831107
return await self.create_keyword_completion_items(
1084-
None if self.is_bdd_token(token) else token, position, add_reserverd=False
1108+
None if self.is_bdd_token(token) else token,
1109+
position,
1110+
add_reserverd=False,
1111+
add_none=True,
10851112
)
10861113

10871114
return None
@@ -1694,5 +1721,10 @@ async def complete_Fixture( # noqa: N802
16941721
context: Optional[CompletionContext],
16951722
) -> Union[List[CompletionItem], CompletionList, None]:
16961723
from robot.parsing.lexer.tokens import Token as RobotToken
1724+
from robot.parsing.model.statements import Fixture
1725+
1726+
name_token = cast(Fixture, node).get_token(RobotToken.NAME)
1727+
if name_token is None or name_token.value is None or name_token.value in ("", "NONE"):
1728+
return None
16971729

16981730
return await self._complete_KeywordCall_or_Fixture(RobotToken.NAME, node, nodes_at_position, position, context)

robotcode/language_server/robotframework/parts/document_highlight.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,14 @@ async def highlight_Fixture( # noqa: N802
255255
return None
256256

257257
fixture_node = cast(Fixture, node)
258+
259+
name_token = cast(Token, fixture_node.get_token(RobotToken.NAME))
260+
if name_token is None or name_token.value is None or name_token.value in ("", "NONE"):
261+
return None
262+
258263
result = await self.get_keyworddoc_and_token_from_position(
259264
fixture_node.name,
260-
cast(Token, fixture_node.get_token(RobotToken.NAME)),
265+
name_token,
261266
[cast(Token, t) for t in fixture_node.get_tokens(RobotToken.ARGUMENT)],
262267
namespace,
263268
position,

robotcode/language_server/robotframework/parts/goto.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,14 @@ async def definition_Fixture( # noqa: N802
346346
return None
347347

348348
fixture_node = cast(Fixture, node)
349+
350+
name_token = cast(Token, fixture_node.get_token(RobotToken.NAME))
351+
if name_token is None or name_token.value is None or name_token.value in ("", "NONE"):
352+
return None
353+
349354
result = await self.get_keyworddoc_and_token_from_position(
350355
fixture_node.name,
351-
cast(Token, fixture_node.get_token(RobotToken.NAME)),
356+
name_token,
352357
[cast(Token, t) for t in fixture_node.get_tokens(RobotToken.ARGUMENT)],
353358
namespace,
354359
position,

robotcode/language_server/robotframework/parts/hover.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,14 @@ async def hover_Fixture( # noqa: N802
300300
return None
301301

302302
fixture_node = cast(Fixture, node)
303+
304+
name_token = cast(Token, fixture_node.get_token(RobotToken.NAME))
305+
if name_token is None or name_token.value is None or name_token.value in ("", "NONE"):
306+
return None
307+
303308
result = await self.get_keyworddoc_and_token_from_position(
304309
fixture_node.name,
305-
cast(Token, fixture_node.get_token(RobotToken.NAME)),
310+
name_token,
306311
[cast(Token, t) for t in fixture_node.get_tokens(RobotToken.ARGUMENT)],
307312
namespace,
308313
position,

robotcode/language_server/robotframework/parts/references.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,9 +389,14 @@ async def references_Fixture( # noqa: N802
389389
return None
390390

391391
fixture_node = cast(Fixture, node)
392+
393+
name_token = cast(Token, fixture_node.get_token(RobotToken.NAME))
394+
if name_token is None or name_token.value is None or name_token.value in ("", "NONE"):
395+
return None
396+
392397
result = await self.get_keyworddoc_and_token_from_position(
393398
fixture_node.name,
394-
cast(Token, fixture_node.get_token(RobotToken.NAME)),
399+
name_token,
395400
[cast(Token, t) for t in fixture_node.get_tokens(RobotToken.ARGUMENT)],
396401
namespace,
397402
position,

robotcode/language_server/robotframework/parts/signature_help.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,11 @@ async def signature_help_Fixture( # noqa: N802
201201
self, node: ast.AST, document: TextDocument, position: Position, context: Optional[SignatureHelpContext] = None
202202
) -> Optional[SignatureHelp]:
203203
from robot.parsing.lexer.tokens import Token as RobotToken
204+
from robot.parsing.model.statements import Fixture
205+
206+
name_token = cast(Fixture, node).get_token(RobotToken.NAME)
207+
if name_token is None or name_token.value is None or name_token.value in ("", "NONE"):
208+
return None
204209

205210
return await self._signature_help_KeywordCall_or_Fixture(RobotToken.NAME, node, document, position, context)
206211

tests/robotcode/language_server/robotframework/parts/data/tests/setup_teardown.robot

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
Suite Setup do something suite setup
33
Suite Teardown do something suite teardown
44
Test Setup do something test setup
5-
Test Teardown do something test teardown
5+
#Test Teardown do something test teardown
6+
Test Teardown _NONe
67

78
Default Tags hallo
89

@@ -16,10 +17,19 @@ Second
1617
Log hello
1718
[Teardown] do something test teardown inner
1819

20+
Third
21+
[Setup] NONE
22+
Log hello
23+
[Teardown]
24+
25+
1926
*** Keywords ***
2027
do something ${type}
2128
do something ${type}
2229

2330
do something
2431
[Arguments] ${type}
2532
Log done ${type}
33+
34+
_NONE
35+
Log None

tests/robotcode/language_server/robotframework/parts/test_references/test_references_robot_034_004_simple_keyword_call_.yml

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -826,28 +826,46 @@ result:
826826
range:
827827
end:
828828
character: 7
829-
line: 11
829+
line: 12
830830
start:
831831
character: 4
832-
line: 11
832+
line: 12
833833
uri: tests/setup_teardown.robot
834834
- !Location
835835
range:
836836
end:
837837
character: 7
838-
line: 15
838+
line: 16
839839
start:
840840
character: 4
841-
line: 15
841+
line: 16
842842
uri: tests/setup_teardown.robot
843843
- !Location
844844
range:
845845
end:
846846
character: 7
847-
line: 24
847+
line: 21
848848
start:
849849
character: 4
850-
line: 24
850+
line: 21
851+
uri: tests/setup_teardown.robot
852+
- !Location
853+
range:
854+
end:
855+
character: 7
856+
line: 31
857+
start:
858+
character: 4
859+
line: 31
860+
uri: tests/setup_teardown.robot
861+
- !Location
862+
range:
863+
end:
864+
character: 7
865+
line: 34
866+
start:
867+
character: 4
868+
line: 34
851869
uri: tests/setup_teardown.robot
852870
- !Location
853871
range:

0 commit comments

Comments
 (0)