fixed regression in string parsing (closes #580)

This commit is contained in:
Fabien Potencier
2012-01-05 15:18:26 +01:00
parent 5fdf6599da
commit ee39215cc2
3 changed files with 21 additions and 5 deletions
+7 -5
View File
@@ -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());
}
+12
View File
@@ -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
*/
@@ -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