Skip to content

Commit b42a491

Browse files
🐛 Fix ternary parser
1 parent a20ce30 commit b42a491

File tree

3 files changed

+40
-8
lines changed

3 files changed

+40
-8
lines changed

TwigCS/src/Token/Tokenizer.php

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -631,13 +631,19 @@ protected function lexPunctuation(): void
631631
{
632632
$currentToken = $this->code[$this->cursor];
633633

634-
if (':' === $currentToken) {
635-
$lastBracket = end($this->bracketsAndTernary);
636-
if (false !== $lastBracket && '?' === $lastBracket[0]) {
634+
$lastBracket = end($this->bracketsAndTernary);
635+
if (false !== $lastBracket && '?' === $lastBracket[0]) {
636+
if (':' === $currentToken) {
637637
// This is a ternary instead
638638
$this->lexOperator($currentToken);
639639

640640
return;
641+
} elseif (false !== strpos(',)]}', $currentToken)) {
642+
// Because {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }}
643+
do {
644+
array_pop($this->bracketsAndTernary);
645+
$lastBracket = end($this->bracketsAndTernary);
646+
} while ('?' === $lastBracket[0]);
641647
}
642648
}
643649

@@ -649,10 +655,6 @@ protected function lexPunctuation(): void
649655
}
650656

651657
$bracket = array_pop($this->bracketsAndTernary);
652-
if ('?' === $bracket[0]) {
653-
// Because {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }}
654-
$bracket = array_pop($this->bracketsAndTernary);
655-
}
656658
if (strtr($bracket[0], '([{', ')]}') !== $currentToken) {
657659
throw new Exception(sprintf('Unclosed "%s"', $bracket[0]));
658660
}

TwigCS/tests/Token/Tokenizer/TokenizerTest.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,36 @@ public function tokenizeDataProvider(): array
144144
46 => Token::WHITESPACE_TYPE,
145145
47 => Token::VAR_END_TYPE,
146146
48 => Token::EOL_TYPE,
147-
49 => Token::EOF_TYPE,
147+
49 => Token::BLOCK_START_TYPE,
148+
50 => Token::WHITESPACE_TYPE,
149+
51 => Token::BLOCK_TAG_TYPE,
150+
52 => Token::WHITESPACE_TYPE,
151+
53 => Token::NAME_TYPE,
152+
54 => Token::OPERATOR_TYPE,
153+
55 => Token::PUNCTUATION_TYPE,
154+
56 => Token::NAME_TYPE,
155+
57 => Token::PUNCTUATION_TYPE,
156+
58 => Token::WHITESPACE_TYPE,
157+
59 => Token::NAME_TYPE,
158+
60 => Token::WHITESPACE_TYPE,
159+
61 => Token::OPERATOR_TYPE,
160+
62 => Token::WHITESPACE_TYPE,
161+
63 => Token::NAME_TYPE,
162+
64 => Token::WHITESPACE_TYPE,
163+
65 => Token::OPERATOR_TYPE,
164+
66 => Token::WHITESPACE_TYPE,
165+
67 => Token::NUMBER_TYPE,
166+
68 => Token::PUNCTUATION_TYPE,
167+
69 => Token::WHITESPACE_TYPE,
168+
70 => Token::NAME_TYPE,
169+
71 => Token::PUNCTUATION_TYPE,
170+
72 => Token::WHITESPACE_TYPE,
171+
73 => Token::NUMBER_TYPE,
172+
74 => Token::PUNCTUATION_TYPE,
173+
75 => Token::WHITESPACE_TYPE,
174+
76 => Token::BLOCK_END_TYPE,
175+
77 => Token::EOL_TYPE,
176+
78 => Token::EOF_TYPE,
148177
],
149178
],
150179
[
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
{{ 1+2-3*4%5 }}
22
{{ bar ? 'string' : "string#" }}
33
{{ baz ?: { a:[1, 2] } }}
4+
{% set a={foo: bar ? baz ? 1, test: 1} %}

0 commit comments

Comments
 (0)