add expression text to SyntaxError

fixes #19445
This commit is contained in:
Philipp Kretzschmar 2016-07-27 18:41:51 +02:00 committed by Christophe Coevoet
parent 11a06ccced
commit dc55db2a9d
3 changed files with 42 additions and 6 deletions

View File

@ -87,7 +87,8 @@ class Lexer
$cursor += strlen($match[0]); $cursor += strlen($match[0]);
} else { } else {
// unlexable // unlexable
throw new SyntaxError(sprintf('Unexpected character "%s"', $expression[$cursor]), $cursor); $message = sprintf('Unexpected character "%s"', $expression[$cursor]);
throw new SyntaxError($message, $cursor, $expression);
} }
} }
@ -95,7 +96,7 @@ class Lexer
if (!empty($brackets)) { if (!empty($brackets)) {
list($expect, $cur) = array_pop($brackets); list($expect, $cur) = array_pop($brackets);
throw new SyntaxError(sprintf('Unclosed "%s"', $expect), $cur); throw new SyntaxError(sprintf('Unclosed "%s"', $expect), $cur, $expression);
} }
return new TokenStream($tokens); return new TokenStream($tokens);

View File

@ -13,8 +13,14 @@ namespace Symfony\Component\ExpressionLanguage;
class SyntaxError extends \LogicException class SyntaxError extends \LogicException
{ {
public function __construct($message, $cursor = 0) public function __construct($message, $cursor = 0, $expression = '')
{ {
parent::__construct(sprintf('%s around position %d.', $message, $cursor)); $message = sprintf('%s around position %d', $message, $cursor);
if ($expression) {
$message = sprintf('%s for expression "%s"', $message, $expression);
}
$message .= '.';
parent::__construct($message);
} }
} }

View File

@ -18,14 +18,43 @@ use Symfony\Component\ExpressionLanguage\TokenStream;
class LexerTest extends TestCase class LexerTest extends TestCase
{ {
/**
* @var Lexer
*/
private $lexer;
protected function setUp()
{
$this->lexer = new Lexer();
}
/** /**
* @dataProvider getTokenizeData * @dataProvider getTokenizeData
*/ */
public function testTokenize($tokens, $expression) public function testTokenize($tokens, $expression)
{ {
$tokens[] = new Token('end of expression', null, strlen($expression) + 1); $tokens[] = new Token('end of expression', null, strlen($expression) + 1);
$lexer = new Lexer(); $this->assertEquals(new TokenStream($tokens), $this->lexer->tokenize($expression));
$this->assertEquals(new TokenStream($tokens), $lexer->tokenize($expression)); }
/**
* @expectedException Symfony\Component\ExpressionLanguage\SyntaxError
* @expectedExceptionMessage Unexpected character "'" around position 33 for expression "service(faulty.expression.example').dummyMethod()".
*/
public function testTokenizeThrowsErrorWithMessage()
{
$expression = "service(faulty.expression.example').dummyMethod()";
$this->lexer->tokenize($expression);
}
/**
* @expectedException Symfony\Component\ExpressionLanguage\SyntaxError
* @expectedExceptionMessage Unclosed "(" around position 7 for expression "service(unclosed.expression.dummyMethod()".
*/
public function testTokenizeThrowsErrorOnUnclosedBrace()
{
$expression = 'service(unclosed.expression.dummyMethod()';
$this->lexer->tokenize($expression);
} }
public function getTokenizeData() public function getTokenizeData()