Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dc55db2

Browse files
k0pernikusstof
authored andcommitted
add expression text to SyntaxError
fixes #19445
1 parent 11a06cc commit dc55db2

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

src/Symfony/Component/ExpressionLanguage/Lexer.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,16 @@ public function tokenize($expression)
8787
$cursor += strlen($match[0]);
8888
} else {
8989
// unlexable
90-
throw new SyntaxError(sprintf('Unexpected character "%s"', $expression[$cursor]), $cursor);
90+
$message = sprintf('Unexpected character "%s"', $expression[$cursor]);
91+
throw new SyntaxError($message, $cursor, $expression);
9192
}
9293
}
9394

9495
$tokens[] = new Token(Token::EOF_TYPE, null, $cursor + 1);
9596

9697
if (!empty($brackets)) {
9798
list($expect, $cur) = array_pop($brackets);
98-
throw new SyntaxError(sprintf('Unclosed "%s"', $expect), $cur);
99+
throw new SyntaxError(sprintf('Unclosed "%s"', $expect), $cur, $expression);
99100
}
100101

101102
return new TokenStream($tokens);

src/Symfony/Component/ExpressionLanguage/SyntaxError.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,14 @@
1313

1414
class SyntaxError extends \LogicException
1515
{
16-
public function __construct($message, $cursor = 0)
16+
public function __construct($message, $cursor = 0, $expression = '')
1717
{
18-
parent::__construct(sprintf('%s around position %d.', $message, $cursor));
18+
$message = sprintf('%s around position %d', $message, $cursor);
19+
if ($expression) {
20+
$message = sprintf('%s for expression "%s"', $message, $expression);
21+
}
22+
$message .= '.';
23+
24+
parent::__construct($message);
1925
}
2026
}

src/Symfony/Component/ExpressionLanguage/Tests/LexerTest.php

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,43 @@
1818

1919
class LexerTest extends TestCase
2020
{
21+
/**
22+
* @var Lexer
23+
*/
24+
private $lexer;
25+
26+
protected function setUp()
27+
{
28+
$this->lexer = new Lexer();
29+
}
30+
2131
/**
2232
* @dataProvider getTokenizeData
2333
*/
2434
public function testTokenize($tokens, $expression)
2535
{
2636
$tokens[] = new Token('end of expression', null, strlen($expression) + 1);
27-
$lexer = new Lexer();
28-
$this->assertEquals(new TokenStream($tokens), $lexer->tokenize($expression));
37+
$this->assertEquals(new TokenStream($tokens), $this->lexer->tokenize($expression));
38+
}
39+
40+
/**
41+
* @expectedException Symfony\Component\ExpressionLanguage\SyntaxError
42+
* @expectedExceptionMessage Unexpected character "'" around position 33 for expression "service(faulty.expression.example').dummyMethod()".
43+
*/
44+
public function testTokenizeThrowsErrorWithMessage()
45+
{
46+
$expression = "service(faulty.expression.example').dummyMethod()";
47+
$this->lexer->tokenize($expression);
48+
}
49+
50+
/**
51+
* @expectedException Symfony\Component\ExpressionLanguage\SyntaxError
52+
* @expectedExceptionMessage Unclosed "(" around position 7 for expression "service(unclosed.expression.dummyMethod()".
53+
*/
54+
public function testTokenizeThrowsErrorOnUnclosedBrace()
55+
{
56+
$expression = 'service(unclosed.expression.dummyMethod()';
57+
$this->lexer->tokenize($expression);
2958
}
3059

3160
public function getTokenizeData()

0 commit comments

Comments
 (0)