Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5a3df11

Browse files
Unescape constant strings
1 parent c857e8a commit 5a3df11

File tree

2 files changed

+53
-11
lines changed

2 files changed

+53
-11
lines changed

‎src/Parser/ConstExprParser.php‎

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
use PHPStan\PhpDocParser\Ast;
66
use PHPStan\PhpDocParser\Lexer\Lexer;
77
use function strtolower;
8-
use function trim;
8+
use function strtr;
9+
use function substr;
910

1011
class ConstExprParser
1112
{
@@ -24,18 +25,10 @@ public function parse(TokenIterator $tokens, bool $trimStrings = false): Ast\Con
2425
return new Ast\ConstExpr\ConstExprIntegerNode($value);
2526
}
2627

27-
if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) {
28+
if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING, Lexer::TOKEN_DOUBLE_QUOTED_STRING)) {
2829
$value = $tokens->currentTokenValue();
2930
if ($trimStrings) {
30-
$value = trim($tokens->currentTokenValue(), "'");
31-
}
32-
$tokens->next();
33-
return new Ast\ConstExpr\ConstExprStringNode($value);
34-
35-
} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) {
36-
$value = $tokens->currentTokenValue();
37-
if ($trimStrings) {
38-
$value = trim($tokens->currentTokenValue(), '"');
31+
$value = $this->trimString($value);
3932
}
4033
$tokens->next();
4134
return new Ast\ConstExpr\ConstExprStringNode($value);
@@ -137,4 +130,17 @@ private function parseArrayItem(TokenIterator $tokens): Ast\ConstExpr\ConstExprA
137130
return new Ast\ConstExpr\ConstExprArrayItemNode($key, $value);
138131
}
139132

133+
private function trimString(string $string): string
134+
{
135+
$quote = substr($string, 0, 1);
136+
137+
return strtr(
138+
substr($string, 1, -1),
139+
[
140+
'\\\\' => '\\',
141+
'\\' . $quote => $quote,
142+
]
143+
);
144+
}
145+
140146
}

‎tests/PHPStan/Parser/ConstExprParserTest.php‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,40 @@ public function provideFetchNodeParseData(): Iterator
358358
];
359359
}
360360

361+
/**
362+
* @dataProvider provideWithTrimStringsStringNodeParseData
363+
*/
364+
public function testParseWithTrimStrings(string $input, ConstExprNode $expectedExpr, int $nextTokenType = Lexer::TOKEN_END): void
365+
{
366+
$tokens = new TokenIterator($this->lexer->tokenize($input));
367+
$exprNode = $this->constExprParser->parse($tokens, true);
368+
369+
$this->assertSame((string) $expectedExpr, (string) $exprNode);
370+
$this->assertEquals($expectedExpr, $exprNode);
371+
$this->assertSame($nextTokenType, $tokens->currentTokenType());
372+
}
373+
374+
public function provideWithTrimStringsStringNodeParseData(): Iterator
375+
{
376+
yield [
377+
'"foo"',
378+
new ConstExprStringNode('foo'),
379+
];
380+
381+
yield [
382+
'"Foo \\n\\"\\r Bar"',
383+
new ConstExprStringNode('Foo \\n"\\r Bar'),
384+
];
385+
386+
yield [
387+
'\'bar\'',
388+
new ConstExprStringNode('bar'),
389+
];
390+
391+
yield [
392+
'\'Foo \\\' Bar\'',
393+
new ConstExprStringNode('Foo \' Bar'),
394+
];
395+
}
396+
361397
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /