deprecated Twig_Environment::computeAlternatives()

This commit is contained in:
Fabien Potencier
2015-10-24 23:34:03 +02:00
parent a4597a4c00
commit d0a5ef8cc0
9 changed files with 124 additions and 34 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
* 1.23.0 (2015-XX-XX)
* n/a
* deprecated Twig_Environment::computeAlternatives()
* 1.22.3 (2015-10-13)
+5 -9
View File
@@ -1235,18 +1235,14 @@ class Twig_Environment
return $this->binaryOperators;
}
/**
* @deprecated since 1.23 (to be removed in 2.0)
*/
public function computeAlternatives($name, $items)
{
$alternatives = array();
foreach ($items as $item) {
$lev = levenshtein($name, $item);
if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
$alternatives[$item] = $lev;
}
}
asort($alternatives);
@trigger_error(sprintf('The %s method is deprecated and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
return array_keys($alternatives);
return Twig_Error_Syntax::getAlternatives($name, $items);
}
protected function initGlobals()
+16
View File
@@ -155,6 +155,9 @@ class Twig_Error extends Exception
throw new BadMethodCallException(sprintf('Method "Twig_Error::%s()" does not exist.', $method));
}
/**
* @internal
*/
protected function updateRepr()
{
$this->message = $this->rawMessage;
@@ -165,6 +168,12 @@ class Twig_Error extends Exception
$dot = true;
}
$questionMark = false;
if ('?' === substr($this->message, -1)) {
$this->message = substr($this->message, 0, -1);
$questionMark = true;
}
if ($this->filename) {
if (is_string($this->filename) || (is_object($this->filename) && method_exists($this->filename, '__toString'))) {
$filename = sprintf('"%s"', $this->filename);
@@ -181,8 +190,15 @@ class Twig_Error extends Exception
if ($dot) {
$this->message .= '.';
}
if ($questionMark) {
$this->message .= '?';
}
}
/**
* @internal
*/
protected function guessTemplateInfo()
{
$template = null;
+34
View File
@@ -17,4 +17,38 @@
*/
class Twig_Error_Syntax extends Twig_Error
{
/**
* Tweaks the error message to include suggestions.
*
* @param string $name The original name of the item that does not exist
* @param array $items An array of possible items
*/
public function addMessageSuggestions($name, array $items)
{
if (!$alternatives = self::computeAlternatives($name, $items)) {
return;
}
$this->rawMessage .= sprintf(' Did you mean "%s"?', implode('", "', $alternatives));
$this->updateRepr();
}
/**
* @internal
*
* To be merged with the addMessageSuggestions() method in 2.0.
*/
public static function computeAlternatives($name, $items)
{
$alternatives = array();
foreach ($items as $item) {
$lev = levenshtein($name, $item);
if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
$alternatives[$item] = $lev;
}
}
asort($alternatives);
return array_keys($alternatives);
}
}
+6 -10
View File
@@ -570,12 +570,10 @@ class Twig_ExpressionParser
$env = $this->parser->getEnvironment();
if (false === $function = $env->getFunction($name)) {
$message = sprintf('The function "%s" does not exist', $name);
if ($alternatives = $env->computeAlternatives($name, array_keys($env->getFunctions()))) {
$message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
}
$e = new Twig_Error_Syntax(sprintf('Unknown "%s" function.', $name), $line, $this->parser->getFilename());
$e->addMessageSuggestions($name, array_keys($env->getFunctions()));
throw new Twig_Error_Syntax($message, $line, $this->parser->getFilename());
throw $e;
}
if ($function instanceof Twig_SimpleFunction && $function->isDeprecated()) {
@@ -600,12 +598,10 @@ class Twig_ExpressionParser
$env = $this->parser->getEnvironment();
if (false === $filter = $env->getFilter($name)) {
$message = sprintf('The filter "%s" does not exist', $name);
if ($alternatives = $env->computeAlternatives($name, array_keys($env->getFilters()))) {
$message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
}
$e = new Twig_Error_Syntax(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getFilename());
$e->addMessageSuggestions($name, array_keys($env->getFilters()));
throw new Twig_Error_Syntax($message, $line, $this->parser->getFilename());
throw $e;
}
if ($filter instanceof Twig_SimpleFilter && $filter->isDeprecated()) {
+3 -5
View File
@@ -340,12 +340,10 @@ class Twig_Extension_Core extends Twig_Extension
}
}
$message = sprintf('The test "%s" does not exist', $name);
if ($alternatives = $env->computeAlternatives($name, array_keys($env->getTests()))) {
$message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
}
$e = new Twig_Error_Syntax(sprintf('Unknown "%s" test.', $name), $line, $parser->getFilename());
$e->addMessageSuggestions($name, array_keys($env->getTests()));
throw new Twig_Error_Syntax($message, $line, $parser->getFilename());
throw $e;
}
protected function getTestNodeClass(Twig_Parser $parser, $test)
+3 -5
View File
@@ -174,12 +174,10 @@ class Twig_Parser implements Twig_ParserInterface
throw new Twig_Error_Syntax($error, $token->getLine(), $this->getFilename());
}
$message = sprintf('Unknown tag name "%s"', $token->getValue());
if ($alternatives = $this->env->computeAlternatives($token->getValue(), array_keys($this->env->getTags()))) {
$message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives));
}
$e = new Twig_Error_Syntax(sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->getFilename());
$e->addMessageSuggestions($token->getValue(), array_keys($this->env->getTags()));
throw new Twig_Error_Syntax($message, $token->getLine(), $this->getFilename());
throw $e;
}
$this->stream->next();
+39 -3
View File
@@ -296,7 +296,7 @@ class Twig_Tests_ExpressionParserTest extends PHPUnit_Framework_TestCase
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage The function "cycl" does not exist. Did you mean "cycle" in "index" at line 1
* @expectedExceptionMessage Unknown "cycl" function. Did you mean "cycle" in "index" at line 1?
*/
public function testUnknownFunction()
{
@@ -308,7 +308,19 @@ class Twig_Tests_ExpressionParserTest extends PHPUnit_Framework_TestCase
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage The filter "lowe" does not exist. Did you mean "lower" in "index" at line 1
* @expectedExceptionMessage Unknown "foobar" function in "index" at line 1.
*/
public function testUnknownFunctionWithoutSuggestions()
{
$env = new Twig_Environment($this->getMock('Twig_LoaderInterface'), array('cache' => false, 'autoescape' => false));
$parser = new Twig_Parser($env);
$parser->parse($env->tokenize('{{ foobar() }}', 'index'));
}
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage Unknown "lowe" filter. Did you mean "lower" in "index" at line 1?
*/
public function testUnknownFilter()
{
@@ -320,7 +332,19 @@ class Twig_Tests_ExpressionParserTest extends PHPUnit_Framework_TestCase
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage The test "nul" does not exist. Did you mean "null" in "index" at line 1
* @expectedExceptionMessage Unknown "foobar" filter in "index" at line 1.
*/
public function testUnknownFilterWithoutSuggestions()
{
$env = new Twig_Environment($this->getMock('Twig_LoaderInterface'), array('cache' => false, 'autoescape' => false));
$parser = new Twig_Parser($env);
$parser->parse($env->tokenize('{{ 1|foobar }}', 'index'));
}
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage Unknown "nul" test. Did you mean "null" in "index" at line 1
*/
public function testUnknownTest()
{
@@ -329,4 +353,16 @@ class Twig_Tests_ExpressionParserTest extends PHPUnit_Framework_TestCase
$parser->parse($env->tokenize('{{ 1 is nul }}', 'index'));
}
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage Unknown "foobar" test in "index" at line 1.
*/
public function testUnknownTestWithoutSuggestions()
{
$env = new Twig_Environment($this->getMock('Twig_LoaderInterface'), array('cache' => false, 'autoescape' => false));
$parser = new Twig_Parser($env);
$parser->parse($env->tokenize('{{ 1 is foobar }}', 'index'));
}
}
+17 -1
View File
@@ -21,7 +21,7 @@ class Twig_Tests_ParserTest extends PHPUnit_Framework_TestCase
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage Unknown tag name "foo". Did you mean "for" at line 1
* @expectedExceptionMessage Unknown "foo" tag. Did you mean "for" at line 1?
*/
public function testUnknownTag()
{
@@ -35,6 +35,22 @@ class Twig_Tests_ParserTest extends PHPUnit_Framework_TestCase
$parser->parse($stream);
}
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage Unknown "foobar" tag at line 1.
*/
public function testUnknownTagWithoutSuggestions()
{
$stream = new Twig_TokenStream(array(
new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
new Twig_Token(Twig_Token::NAME_TYPE, 'foobar', 1),
new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
));
$parser = new Twig_Parser(new Twig_Environment($this->getMock('Twig_LoaderInterface')));
$parser->parse($stream);
}
/**
* @dataProvider getFilterBodyNodesData
*/