diff --git a/lib/Twig/Extension/Core.php b/lib/Twig/Extension/Core.php index f1a93c12e..bbedd91b9 100644 --- a/lib/Twig/Extension/Core.php +++ b/lib/Twig/Extension/Core.php @@ -233,11 +233,11 @@ class Twig_Extension_Core extends Twig_Extension new Twig_SimpleTest('even', null, array('node_class' => 'Twig_Node_Expression_Test_Even')), new Twig_SimpleTest('odd', null, array('node_class' => 'Twig_Node_Expression_Test_Odd')), new Twig_SimpleTest('defined', null, array('node_class' => 'Twig_Node_Expression_Test_Defined')), - new Twig_SimpleTest('sameas', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas')), + new Twig_SimpleTest('sameas', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas', 'deprecated' => true, 'alternative' => 'same as')), new Twig_SimpleTest('same as', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas')), new Twig_SimpleTest('none', null, array('node_class' => 'Twig_Node_Expression_Test_Null')), new Twig_SimpleTest('null', null, array('node_class' => 'Twig_Node_Expression_Test_Null')), - new Twig_SimpleTest('divisibleby', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby')), + new Twig_SimpleTest('divisibleby', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby', 'deprecated' => true, 'alternative' => 'divisible by')), new Twig_SimpleTest('divisible by', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby')), new Twig_SimpleTest('constant', null, array('node_class' => 'Twig_Node_Expression_Test_Constant')), new Twig_SimpleTest('empty', 'twig_test_empty'), @@ -298,17 +298,28 @@ class Twig_Extension_Core extends Twig_Extension public function parseTestExpression(Twig_Parser $parser, Twig_NodeInterface $node) { $stream = $parser->getStream(); - $name = $this->getTestName($parser, $node->getLine()); - $class = $this->getTestNodeClass($parser, $name); + $test = $this->getTest($parser, $node->getLine()); + + if ($test instanceof Twig_SimpleTest && $test->isDeprecated()) { + $message = sprintf('Twig Test "%s" is deprecated', $test->getName()); + if ($test->getAlternative()) { + $message .= sprintf('. Use "%s" instead', $test->getAlternative()); + } + $message .= sprintf(' in %s at line %d.', $stream->getFilename(), $stream->getCurrent()->getLine()); + + @trigger_error($message, E_USER_DEPRECATED); + } + + $class = $this->getTestNodeClass($parser, $test); $arguments = null; if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) { $arguments = $parser->getExpressionParser()->parseArguments(true); } - return new $class($node, $name, $arguments, $parser->getCurrentToken()->getLine()); + return new $class($node, $test->getName(), $arguments, $parser->getCurrentToken()->getLine()); } - protected function getTestName(Twig_Parser $parser, $line) + protected function getTest(Twig_Parser $parser, $line) { $stream = $parser->getStream(); $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); @@ -316,7 +327,7 @@ class Twig_Extension_Core extends Twig_Extension $testMap = $env->getTests(); if (isset($testMap[$name])) { - return $name; + return $testMap[$name]; } if ($stream->test(Twig_Token::NAME_TYPE)) { @@ -326,7 +337,7 @@ class Twig_Extension_Core extends Twig_Extension if (isset($testMap[$name])) { $parser->getStream()->next(); - return $name; + return $testMap[$name]; } } @@ -338,16 +349,13 @@ class Twig_Extension_Core extends Twig_Extension throw new Twig_Error_Syntax($message, $line, $parser->getFilename()); } - protected function getTestNodeClass(Twig_Parser $parser, $name) + protected function getTestNodeClass(Twig_Parser $parser, $test) { - $env = $parser->getEnvironment(); - $testMap = $env->getTests(); - - if ($testMap[$name] instanceof Twig_SimpleTest) { - return $testMap[$name]->getNodeClass(); + if ($test instanceof Twig_SimpleTest) { + return $test->getNodeClass(); } - return $testMap[$name] instanceof Twig_Test_Node ? $testMap[$name]->getClass() : 'Twig_Node_Expression_Test'; + return $test instanceof Twig_Test_Node ? $test->getClass() : 'Twig_Node_Expression_Test'; } /** diff --git a/lib/Twig/SimpleTest.php b/lib/Twig/SimpleTest.php index 87b093548..8ba2192b2 100644 --- a/lib/Twig/SimpleTest.php +++ b/lib/Twig/SimpleTest.php @@ -27,6 +27,8 @@ class Twig_SimpleTest $this->options = array_merge(array( 'is_variadic' => false, 'node_class' => 'Twig_Node_Expression_Test', + 'deprecated' => false, + 'alternative' => null, ), $options); } @@ -49,4 +51,14 @@ class Twig_SimpleTest { return $this->options['is_variadic']; } + + public function isDeprecated() + { + return $this->options['deprecated']; + } + + public function getAlternative() + { + return $this->options['alternative']; + } }