$parser->filterBodyNodes(new Twig_Node_Text(chr(0xEF).chr(0xBB).chr(0xBF), 0));
}
+ public function testParseIsReentrant()
+ {
+ $twig = new Twig_Environment(null, array(
+ 'autoescape' => false,
+ 'optimizations' => 0,
+ ));
+ $twig->addTokenParser(new TestTokenParser());
+
+ $parser = new Twig_Parser($twig);
+
+ $parser->parse(new Twig_TokenStream(array(
+ new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 0),
+ new Twig_Token(Twig_Token::NAME_TYPE, 'test', 0),
+ new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 0),
+ new Twig_Token(Twig_Token::VAR_START_TYPE, '', 0),
+ new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 0),
+ new Twig_Token(Twig_Token::VAR_END_TYPE, '', 0),
+ new Twig_Token(Twig_Token::EOF_TYPE, '', 0),
+ )));
+
+ $this->assertEquals(null, $parser->getParent());
+ }
+
protected function getParserForFilterBodyNodes()
{
$parser = new TestParser(new Twig_Environment());
return parent::filterBodyNodes($node);
}
}
+
+class TestTokenParser extends Twig_TokenParser
+{
+ public function parse(Twig_Token $token)
+ {
+ // simulate the parsing of another template right in the middle of the parsing of the current template
+ $this->parser->parse(new Twig_TokenStream(array(
+ new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 0),
+ new Twig_Token(Twig_Token::NAME_TYPE, 'extends', 0),
+ new Twig_Token(Twig_Token::STRING_TYPE, 'base', 0),
+ new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 0),
+ new Twig_Token(Twig_Token::EOF_TYPE, '', 0),
+ )));
+
+ $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+
+ return new Twig_Node(array());
+ }
+
+ public function getTag()
+ {
+ return 'test';
+ }
+}