diff --git a/TwigCS/src/Token/Tokenizer.php b/TwigCS/src/Token/Tokenizer.php index 07d6f27..3447529 100644 --- a/TwigCS/src/Token/Tokenizer.php +++ b/TwigCS/src/Token/Tokenizer.php @@ -631,14 +631,21 @@ protected function lexPunctuation(): void { $currentToken = $this->code[$this->cursor]; - if (':' === $currentToken) { - $lastBracket = end($this->bracketsAndTernary); - if (false !== $lastBracket && '?' === $lastBracket[0]) { + $lastBracket = end($this->bracketsAndTernary); + if (false !== $lastBracket && '?' === $lastBracket[0]) { + if (':' === $currentToken) { // This is a ternary instead $this->lexOperator($currentToken); return; } + if (false !== strpos(',)]}', $currentToken)) { + // Because {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }} + do { + array_pop($this->bracketsAndTernary); + $lastBracket = end($this->bracketsAndTernary); + } while ('?' === $lastBracket[0]); + } } if (false !== strpos('([{', $currentToken)) { @@ -649,10 +656,6 @@ protected function lexPunctuation(): void } $bracket = array_pop($this->bracketsAndTernary); - if ('?' === $bracket[0]) { - // Because {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }} - $bracket = array_pop($this->bracketsAndTernary); - } if (strtr($bracket[0], '([{', ')]}') !== $currentToken) { throw new Exception(sprintf('Unclosed "%s"', $bracket[0])); } diff --git a/TwigCS/tests/Fixtures/BlankEOFTest.fixed.twig b/TwigCS/tests/Fixtures/BlankEOFTest.fixed.twig deleted file mode 100644 index 1936aaf..0000000 --- a/TwigCS/tests/Fixtures/BlankEOFTest.fixed.twig +++ /dev/null @@ -1,2 +0,0 @@ -
-
diff --git a/TwigCS/tests/Fixtures/BlankEOFTest.twig b/TwigCS/tests/Fixtures/BlankEOFTest.twig deleted file mode 100644 index 99dfd42..0000000 --- a/TwigCS/tests/Fixtures/BlankEOFTest.twig +++ /dev/null @@ -1,3 +0,0 @@ -
-
- diff --git a/TwigCS/tests/Fixtures/DelimiterSpacingTest.fixed.twig b/TwigCS/tests/Fixtures/DelimiterSpacingTest.fixed.twig deleted file mode 100644 index 692a539..0000000 --- a/TwigCS/tests/Fixtures/DelimiterSpacingTest.fixed.twig +++ /dev/null @@ -1,20 +0,0 @@ -{{ foo }} -{# comment #} -{% if foo %}{% endif %} - -{{- foo -}} -{#- comment -#} -{%- if foo -%}{%- endif -%} - -{{ - shouldNotCareAboutNewLine -}} -{%- if foo -%}{%- endif -%} - -{{ foo({'bar': {'baz': 'shouldNotCareAboutDoubleHashes'}}) }} - -
- {{ - shouldNotCareAboutNewLine - }} -
diff --git a/TwigCS/tests/Fixtures/DelimiterSpacingTest.twig b/TwigCS/tests/Fixtures/DelimiterSpacingTest.twig deleted file mode 100644 index 0175972..0000000 --- a/TwigCS/tests/Fixtures/DelimiterSpacingTest.twig +++ /dev/null @@ -1,20 +0,0 @@ -{{ foo }} -{# comment #} -{% if foo %}{% endif %} - -{{- foo -}} -{#- comment -#} -{%- if foo -%}{%- endif -%} - -{{ - shouldNotCareAboutNewLine -}} -{%-if foo -%}{%- endif-%} - -{{ foo({'bar': {'baz': 'shouldNotCareAboutDoubleHashes'}}) }} - -
- {{ - shouldNotCareAboutNewLine - }} -
diff --git a/TwigCS/tests/Fixtures/EmptyLinesTest.fixed.twig b/TwigCS/tests/Fixtures/EmptyLinesTest.fixed.twig deleted file mode 100644 index 70c6156..0000000 --- a/TwigCS/tests/Fixtures/EmptyLinesTest.fixed.twig +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/TwigCS/tests/Fixtures/EmptyLinesTest.twig b/TwigCS/tests/Fixtures/EmptyLinesTest.twig deleted file mode 100644 index 018bc05..0000000 --- a/TwigCS/tests/Fixtures/EmptyLinesTest.twig +++ /dev/null @@ -1,4 +0,0 @@ -
- - -
diff --git a/TwigCS/tests/Fixtures/OperatorSpacingTest.fixed.twig b/TwigCS/tests/Fixtures/OperatorSpacingTest.fixed.twig deleted file mode 100644 index e99904f..0000000 --- a/TwigCS/tests/Fixtures/OperatorSpacingTest.fixed.twig +++ /dev/null @@ -1,35 +0,0 @@ -{{ 1 + 2 }} -{{ 1 - 2 }} -{{ 1 / 2 }} -{{ 1 * 2 }} -{{ 1 % 2 }} -{{ 1 // 2 }} -{{ 1 ** 2 }} -{{ foo ~ bar }} -{{ true ? true : false }} -{{ 1 == 2 }} -{{ not true }} -{{ false and true }} -{{ false or true }} -{{ a in array }} -{{ a is array }} - -Untouch +-/*%==: - -{{ [1, 2, 3] }} -{{ {'foo': 'bar'} }} -{{ 1 ?: 2 }} -{{ 1 ?? 2 }} - -{{ 1 + -2 }} -{{ 1 + (-2 + 3) }} -{{ a[-2] }} -{{ { 'foo': -2 } }} -{{ foo.name }} -{{ 1..10 }} -{{ -5..-2 }} -{{ [1, -2] }} -{% if -2 == -3 or -2 == -3 %}{% endif %} -{% if a - 2 == -4 %}{% endif %} -{{ a in -2..-3 }} -{{ "a_#{1 + 1}" }} diff --git a/TwigCS/tests/Fixtures/OperatorSpacingTest.twig b/TwigCS/tests/Fixtures/OperatorSpacingTest.twig deleted file mode 100644 index 6827dbb..0000000 --- a/TwigCS/tests/Fixtures/OperatorSpacingTest.twig +++ /dev/null @@ -1,35 +0,0 @@ -{{ 1+2 }} -{{ 1-2 }} -{{ 1/2 }} -{{ 1*2 }} -{{ 1%2 }} -{{ 1//2 }} -{{ 1**2 }} -{{ foo~bar }} -{{ true ? true : false }} -{{ 1==2 }} -{{ not true }} -{{ false and true }} -{{ false or true }} -{{ a in array }} -{{ a is array }} - -Untouch +-/*%==: - -{{ [1, 2, 3] }} -{{ {'foo': 'bar'} }} -{{ 1?:2 }} -{{ 1??2 }} - -{{ 1 +-2 }} -{{ 1 + (-2 + 3) }} -{{ a[-2] }} -{{ { 'foo': -2 } }} -{{ foo.name }} -{{ 1..10 }} -{{ -5..-2 }} -{{ [1, -2] }} -{% if -2 == -3 or -2 == -3 %}{% endif %} -{% if a - 2 == -4 %}{% endif %} -{{ a in -2..-3 }} -{{ "a_#{1+1}" }} diff --git a/TwigCS/tests/Token/Tokenizer/TokenizerTest.php b/TwigCS/tests/Token/Tokenizer/TokenizerTest.php index 50f27d0..f312a42 100644 --- a/TwigCS/tests/Token/Tokenizer/TokenizerTest.php +++ b/TwigCS/tests/Token/Tokenizer/TokenizerTest.php @@ -144,7 +144,36 @@ public function tokenizeDataProvider(): array 46 => Token::WHITESPACE_TYPE, 47 => Token::VAR_END_TYPE, 48 => Token::EOL_TYPE, - 49 => Token::EOF_TYPE, + 49 => Token::BLOCK_START_TYPE, + 50 => Token::WHITESPACE_TYPE, + 51 => Token::BLOCK_TAG_TYPE, + 52 => Token::WHITESPACE_TYPE, + 53 => Token::NAME_TYPE, + 54 => Token::OPERATOR_TYPE, + 55 => Token::PUNCTUATION_TYPE, + 56 => Token::NAME_TYPE, + 57 => Token::PUNCTUATION_TYPE, + 58 => Token::WHITESPACE_TYPE, + 59 => Token::NAME_TYPE, + 60 => Token::WHITESPACE_TYPE, + 61 => Token::OPERATOR_TYPE, + 62 => Token::WHITESPACE_TYPE, + 63 => Token::NAME_TYPE, + 64 => Token::WHITESPACE_TYPE, + 65 => Token::OPERATOR_TYPE, + 66 => Token::WHITESPACE_TYPE, + 67 => Token::NUMBER_TYPE, + 68 => Token::PUNCTUATION_TYPE, + 69 => Token::WHITESPACE_TYPE, + 70 => Token::NAME_TYPE, + 71 => Token::PUNCTUATION_TYPE, + 72 => Token::WHITESPACE_TYPE, + 73 => Token::NUMBER_TYPE, + 74 => Token::PUNCTUATION_TYPE, + 75 => Token::WHITESPACE_TYPE, + 76 => Token::BLOCK_END_TYPE, + 77 => Token::EOL_TYPE, + 78 => Token::EOF_TYPE, ], ], [ diff --git a/TwigCS/tests/Token/Tokenizer/TokenizerTest3.twig b/TwigCS/tests/Token/Tokenizer/TokenizerTest3.twig index faf2023..4c76576 100644 --- a/TwigCS/tests/Token/Tokenizer/TokenizerTest3.twig +++ b/TwigCS/tests/Token/Tokenizer/TokenizerTest3.twig @@ -1,3 +1,4 @@ {{ 1+2-3*4%5 }} {{ bar ? 'string' : "string#" }} {{ baz ?: { a:[1, 2] } }} +{% set a={foo: bar ? baz ? 1, test: 1} %}