Skip to content

Commit b0848d1

Browse files
committed
refactor(if): share code that splits inline if
Also add a test for assignment inside inline if
1 parent 169d307 commit b0848d1

4 files changed

Lines changed: 16 additions & 18 deletions

File tree

‎atest/robot/running/if/inline_if_else.robot‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ Inline if else - if executed - failing
2727
Inline if else - else executed - failing
2828
Check Test Case ${TESTNAME}
2929

30+
Assignment inside inline if
31+
Check Test Case ${TESTNAME}
32+
3033
Inline if inside for loop
3134
Check Test Case ${TESTNAME}
3235

‎atest/testdata/running/if/inline_if_else.robot‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ Inline if else - else executed - failing
2828
[Documentation] FAIL expected
2929
IF 0 > 1 Log unexpected ELSE Fail expected
3030

31+
Assignment inside inline if
32+
IF True ${num}= Convert to number 12
33+
Variable Should Exist $num
34+
3135
Inline if inside for loop
3236
[Documentation] FAIL The end
3337
FOR ${i} IN 1 2 3

‎src/robot/parsing/lexer/blocklexers.py‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,25 +245,26 @@ def lexer_classes(self):
245245
KeywordCallLexer)
246246

247247
def input(self, statement):
248-
for part in self._get_statements(statement):
248+
for part in self.split_statements(statement):
249249
super().input(part)
250250
return self
251251

252-
def _get_statements(self, statement):
252+
@staticmethod
253+
def split_statements(statement):
253254
current_statement = []
254-
expects_arg = False
255+
expect_arg = False
255256
for token in statement:
256-
if expects_arg:
257+
if expect_arg:
257258
current_statement.append(token)
258259
yield current_statement
259260
current_statement = []
260-
expects_arg = False
261+
expect_arg = False
261262
elif token.value in ('IF', 'ELSE IF'):
262263
if current_statement:
263264
yield current_statement
264265
current_statement = []
265266
current_statement.append(token)
266-
expects_arg = True
267+
expect_arg = True
267268
elif token.value == 'ELSE':
268269
yield current_statement
269270
current_statement = []

‎src/robot/parsing/lexer/lexer.py‎

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from robot.errors import DataError
1919
from robot.utils import get_error_message, FileReader
2020

21-
from .blocklexers import FileLexer
21+
from .blocklexers import FileLexer, InlineIfLexer
2222
from .context import InitFileContext, TestCaseFileContext, ResourceFileContext
2323
from .tokenizer import Tokenizer
2424
from .tokens import EOS, END, Token
@@ -194,17 +194,7 @@ def _tokenize_variables(self, tokens):
194194
yield t
195195

196196
def _split_inline_if(self, statement):
197-
statement_end_indices = \
198-
[idx for idx, token in
199-
enumerate(statement)
200-
if token.type in (Token.IF, Token.ELSE_IF, Token.ELSE, Token.KEYWORD)]
201-
for pos, idx in enumerate(statement_end_indices):
202-
if pos == 0:
203-
yield statement[:statement_end_indices[pos+1]]
204-
elif pos < len(statement_end_indices) - 1:
205-
yield statement[idx:statement_end_indices[pos+1]]
206-
else:
207-
yield statement[idx:len(statement)]
197+
yield from InlineIfLexer.split_statements(statement)
208198
yield [END.from_token(statement[-1])]
209199

210200
def _is_inline_if(self, statement):

0 commit comments

Comments
 (0)