Skip to content

Commit da33337

Browse files
Merge pull request #119 from VincentLanglet/fixTernaryParser
Fix ternary parser
2 parents ea7505a + e16bcd8 commit da33337

11 files changed

+41
-130
lines changed

TwigCS/src/Token/Tokenizer.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -631,14 +631,21 @@ 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;
641641
}
642+
if (false !== strpos(',)]}', $currentToken)) {
643+
// Because {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }}
644+
do {
645+
array_pop($this->bracketsAndTernary);
646+
$lastBracket = end($this->bracketsAndTernary);
647+
} while ('?' === $lastBracket[0]);
648+
}
642649
}
643650

644651
if (false !== strpos('([{', $currentToken)) {
@@ -649,10 +656,6 @@ protected function lexPunctuation(): void
649656
}
650657

651658
$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-
}
656659
if (strtr($bracket[0], '([{', ')]}') !== $currentToken) {
657660
throw new Exception(sprintf('Unclosed "%s"', $bracket[0]));
658661
}

TwigCS/tests/Fixtures/BlankEOFTest.fixed.twig

Lines changed: 0 additions & 2 deletions
This file was deleted.

TwigCS/tests/Fixtures/BlankEOFTest.twig

Lines changed: 0 additions & 3 deletions
This file was deleted.

TwigCS/tests/Fixtures/DelimiterSpacingTest.fixed.twig

Lines changed: 0 additions & 20 deletions
This file was deleted.

TwigCS/tests/Fixtures/DelimiterSpacingTest.twig

Lines changed: 0 additions & 20 deletions
This file was deleted.

TwigCS/tests/Fixtures/EmptyLinesTest.fixed.twig

Lines changed: 0 additions & 3 deletions
This file was deleted.

TwigCS/tests/Fixtures/EmptyLinesTest.twig

Lines changed: 0 additions & 4 deletions
This file was deleted.

TwigCS/tests/Fixtures/OperatorSpacingTest.fixed.twig

Lines changed: 0 additions & 35 deletions
This file was deleted.

TwigCS/tests/Fixtures/OperatorSpacingTest.twig

Lines changed: 0 additions & 35 deletions
This file was deleted.

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)