Skip to content

Commit 169d307

Browse files
committed
refactor(if): create own lexer for inline if
Add accpetance tests for inline if inside a block as well.
1 parent d169ca6 commit 169d307

File tree

4 files changed

+76
-41
lines changed

4 files changed

+76
-41
lines changed

atest/robot/running/if/inline_if_else.robot

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

30+
Inline if inside for loop
31+
Check Test Case ${TESTNAME}
32+
33+
Inline if inside nested loop
34+
Check Test Case ${TESTNAME}
35+
3036
Inline if passing in keyword
3137
Check Test Case ${TESTNAME}
3238

atest/testdata/running/if/inline_if_else.robot

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Inline if not executed
1111

1212
Inline if not executed failing
1313
[Documentation] FAIL after not passing
14-
IF 'a' == 'b' Pass Execution should go here
14+
IF 'a' == 'b' Pass Execution should not go here
1515
Fail after not passing
1616

1717
Inline if else - if executed
@@ -28,6 +28,22 @@ Inline if else - else executed - failing
2828
[Documentation] FAIL expected
2929
IF 0 > 1 Log unexpected ELSE Fail expected
3030

31+
Inline if inside for loop
32+
[Documentation] FAIL The end
33+
FOR ${i} IN 1 2 3
34+
IF ${i} == 3 Fail The end ELSE Log ${i}
35+
END
36+
37+
Inline if inside nested loop
38+
[Documentation] FAIL The end
39+
IF ${False}
40+
Fail Should not go here
41+
ELSE
42+
FOR ${i} IN 1 2 3
43+
IF ${i} == 3 Fail The end ELSE Log ${i}
44+
END
45+
END
46+
3147
Inline if passing in keyword
3248
Passing if keyword
3349

src/robot/parsing/lexer/blocklexers.py

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ def _handle_name_or_indentation(self, statement):
173173
statement.pop(0).type = None # These tokens will be ignored
174174

175175
def lexer_classes(self):
176-
return (TestOrKeywordSettingLexer, ForLexer, IfLexer, KeywordCallLexer)
176+
return (TestOrKeywordSettingLexer, ForLexer, InlineIfLexer, IfLexer,
177+
KeywordCallLexer)
177178

178179

179180
class TestCaseLexer(TestOrKeywordLexer):
@@ -205,11 +206,8 @@ def accepts_more(self, statement):
205206

206207
def input(self, statement):
207208
lexer = BlockLexer.input(self, statement)
208-
if isinstance(lexer, (ForHeaderLexer)):
209+
if isinstance(lexer, (ForHeaderLexer, IfHeaderLexer)):
209210
self._block_level += 1
210-
if isinstance(lexer, (IfHeaderLexer)):
211-
if not lexer.is_inline_if:
212-
self._block_level += 1
213211
if isinstance(lexer, EndLexer):
214212
self._block_level -= 1
215213

@@ -220,7 +218,8 @@ def handles(self, statement):
220218
return ForHeaderLexer(self.ctx).handles(statement)
221219

222220
def lexer_classes(self):
223-
return (ForHeaderLexer, IfLexer, EndLexer, KeywordCallLexer)
221+
return (ForHeaderLexer, InlineIfLexer, IfLexer, EndLexer,
222+
KeywordCallLexer)
224223

225224

226225
class IfLexer(NestedBlockLexer):
@@ -231,3 +230,47 @@ def handles(self, statement):
231230
def lexer_classes(self):
232231
return (IfHeaderLexer, ElseIfHeaderLexer, ElseHeaderLexer,
233232
ForLexer, EndLexer, KeywordCallLexer)
233+
234+
235+
class InlineIfLexer(BlockLexer):
236+
237+
def handles(self, statement):
238+
return statement[0].value == 'IF' and len(statement) > 2
239+
240+
def accepts_more(self, statement):
241+
return False
242+
243+
def lexer_classes(self):
244+
return (IfHeaderLexer, ElseIfHeaderLexer, ElseHeaderLexer,
245+
KeywordCallLexer)
246+
247+
def input(self, statement):
248+
for part in self._get_statements(statement):
249+
super().input(part)
250+
return self
251+
252+
def _get_statements(self, statement):
253+
current_statement = []
254+
expects_arg = False
255+
for token in statement:
256+
if expects_arg:
257+
current_statement.append(token)
258+
yield current_statement
259+
current_statement = []
260+
expects_arg = False
261+
elif token.value in ('IF', 'ELSE IF'):
262+
if current_statement:
263+
yield current_statement
264+
current_statement = []
265+
current_statement.append(token)
266+
expects_arg = True
267+
elif token.value == 'ELSE':
268+
yield current_statement
269+
current_statement = []
270+
yield [token]
271+
else:
272+
current_statement.append(token)
273+
yield current_statement
274+
275+
276+

src/robot/parsing/lexer/statementlexers.py

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -158,43 +158,13 @@ def lex(self):
158158

159159
class IfHeaderLexer(StatementLexer):
160160

161-
def __init__(self, ctx):
162-
super().__init__(ctx)
163-
self.is_inline_if = False
164-
165161
def handles(self, statement):
166-
return statement[0].value == 'IF'
167-
168-
def input(self, statement):
169-
self.is_inline_if = len(statement) > 2
170-
return super().input(statement)
162+
return statement[0].value == 'IF' and len(statement) <= 2
171163

172164
def lex(self):
173-
if not self.is_inline_if:
174-
self.statement[0].type = Token.IF
175-
for token in self.statement[1:]:
176-
token.type = Token.ARGUMENT
177-
else:
178-
marker_indexes = [idx for idx, token in
179-
enumerate(self.statement)
180-
if token.value in ('IF', 'ELSE IF', 'ELSE')]
181-
for idx, marker_idx in enumerate(marker_indexes):
182-
marker_token = self.statement[marker_idx]
183-
marker_token.type = {
184-
'IF': Token.IF,
185-
'ELSE IF': Token.ELSE_IF,
186-
'ELSE': Token.ELSE
187-
}[marker_token.value]
188-
if marker_token.type in (Token.IF, Token.ELSE_IF):
189-
self.statement[marker_idx + 1].type = Token.ARGUMENT
190-
kw_start = marker_idx + 2
191-
else:
192-
kw_start = marker_idx + 1
193-
kw_end = marker_indexes[idx + 1] if idx < len(
194-
marker_indexes) - 1 else len(self.statement)
195-
l = KeywordCallLexer(self.ctx)
196-
l.input(self.statement[kw_start:kw_end])
197-
l.lex()
165+
self.statement[0].type = Token.IF
166+
for token in self.statement[1:]:
167+
token.type = Token.ARGUMENT
198168

199169

200170
class ElseIfHeaderLexer(StatementLexer):

0 commit comments

Comments
 (0)