diff --git a/lib/Twig/ExpressionParser.php b/lib/Twig/ExpressionParser.php index e9ed43a53..0e6a8df30 100644 --- a/lib/Twig/ExpressionParser.php +++ b/lib/Twig/ExpressionParser.php @@ -170,23 +170,25 @@ class Twig_ExpressionParser $stream = $this->parser->getStream(); $nodes = array(); - + // a string cannot be followed by another string in a single expression + $nextCanBeString = true; while (true) { - if ($stream->test(Twig_Token::STRING_TYPE)) { + if ($stream->test(Twig_Token::STRING_TYPE) && $nextCanBeString) { $token = $stream->next(); $nodes[] = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine()); - } else if ($stream->test(Twig_Token::INTERPOLATION_START_TYPE)) { + $nextCanBeString = false; + } elseif ($stream->test(Twig_Token::INTERPOLATION_START_TYPE)) { $stream->next(); $nodes[] = $this->parseExpression(); $stream->expect(Twig_Token::INTERPOLATION_END_TYPE); + $nextCanBeString = true; } else { break; } } $expr = array_shift($nodes); - - foreach($nodes as $node) { + foreach ($nodes as $node) { $expr = new Twig_Node_Expression_Binary_Concat($expr, $node, $node->getLine()); } diff --git a/test/Twig/Tests/ExpressionParserTest.php b/test/Twig/Tests/ExpressionParserTest.php index bb7b38ada..b3f300fae 100644 --- a/test/Twig/Tests/ExpressionParserTest.php +++ b/test/Twig/Tests/ExpressionParserTest.php @@ -144,6 +144,18 @@ class Twig_Tests_ExpressionParserTest extends PHPUnit_Framework_TestCase ); } + /** + * @expectedException Twig_Error_Syntax + */ + public function testStringExpressionDoesNotConcatenateTwoConsecutiveStrings() + { + $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0)); + $stream = $env->tokenize('{{ "a" "b" }}', 'index'); + $parser = new Twig_Parser($env); + + $parser->parse($stream); + } + /** * @dataProvider getTestsForString */ diff --git a/test/Twig/Tests/Fixtures/expressions/strings.test b/test/Twig/Tests/Fixtures/expressions/strings.test index a2bff109b..a9116613e 100644 --- a/test/Twig/Tests/Fixtures/expressions/strings.test +++ b/test/Twig/Tests/Fixtures/expressions/strings.test @@ -2,7 +2,9 @@ Twig supports string interpolation --TEMPLATE-- {{ "foo #{"foo #{bar} baz"} baz" }} +{{ "foo #{bar}#{bar} baz" }} --DATA-- return array('bar' => 'BAR'); --EXPECT-- foo foo BAR baz baz +foo BARBAR baz