Skip to content

Commit 4531726

Browse files
authored
Merge pull request #15 from phpactor/phan-phactor-fixes
Fixes to enable this fork to work with Phactor
2 parents 57264d1 + 9609136 commit 4531726

File tree

4 files changed

+384
-482
lines changed

4 files changed

+384
-482
lines changed

src/Node/PropertyHook.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66

77
namespace Microsoft\PhpParser\Node;
88

9+
use Microsoft\PhpParser\FunctionLike;
910
use Microsoft\PhpParser\ModifiedTypeInterface;
1011
use Microsoft\PhpParser\ModifiedTypeTrait;
1112
use Microsoft\PhpParser\Node;
1213
use Microsoft\PhpParser\Node\DelimitedList\ParameterDeclarationList;
1314
use Microsoft\PhpParser\Node\Statement\CompoundStatementNode;
1415
use Microsoft\PhpParser\Token;
1516

16-
class PropertyHook extends Node implements ModifiedTypeInterface {
17+
class PropertyHook extends Node implements ModifiedTypeInterface, FunctionLike {
1718
use ModifiedTypeTrait;
1819
/** @var AttributeGroup[]|null */
1920
public $attributes;

src/Parser.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,7 @@ private function isExpressionStartFn() {
13221322
case TokenKind::IntegerLiteralToken:
13231323

13241324
case TokenKind::StringLiteralToken:
1325+
case TokenKind::EncapsedAndWhitespace:
13251326

13261327
case TokenKind::SingleQuoteToken:
13271328
case TokenKind::DoubleQuoteToken:
@@ -1415,6 +1416,7 @@ private function parsePrimaryExpression($parentNode) {
14151416
return $this->parseNumericLiteralExpression($parentNode);
14161417

14171418
case TokenKind::StringLiteralToken:
1419+
case TokenKind::EncapsedAndWhitespace:
14181420
return $this->parseStringLiteralExpression($parentNode);
14191421

14201422
case TokenKind::DoubleQuoteToken:
@@ -2311,6 +2313,7 @@ private function parseBinaryExpressionOrHigher($precedence, $parentNode) {
23112313
// the original operator, and the newly constructed exponentiation-expression as the operand.
23122314
$shouldOperatorTakePrecedenceOverUnary = false;
23132315
switch ($token->kind) {
2316+
case TokenKind::OpenBraceToken:
23142317
case TokenKind::AsteriskAsteriskToken:
23152318
$shouldOperatorTakePrecedenceOverUnary = $leftOperand instanceof UnaryExpression;
23162319
break;
@@ -2823,7 +2826,7 @@ private function parseDeclareDirectiveFn() {
28232826
TokenKind::InvalidOctalLiteralToken,
28242827
TokenKind::InvalidHexadecimalLiteral,
28252828
TokenKind::InvalidBinaryLiteral,
2826-
TokenKind::StringLiteralToken
2829+
TokenKind::StringLiteralToken,
28272830
); // TODO simplify
28282831

28292832
return $declareDirective;
@@ -3182,6 +3185,7 @@ private function parsePostfixExpressionRest($expression, $allowUpdateExpression
31823185
)) {
31833186
return $expression;
31843187
}
3188+
31853189
if ($tokenKind === TokenKind::ColonColonToken) {
31863190
$expression = $this->parseScopedPropertyAccessExpression($expression, null);
31873191
return $this->parsePostfixExpressionRest($expression);
@@ -3191,6 +3195,14 @@ private function parsePostfixExpressionRest($expression, $allowUpdateExpression
31913195

31923196
if ($tokenKind === TokenKind::OpenBraceToken ||
31933197
$tokenKind === TokenKind::OpenBracketToken) {
3198+
// Property hooks: don't parse `{` after certain expression types
3199+
// as those are property hook lists, not subscript expressions
3200+
if ($tokenKind === TokenKind::OpenBraceToken &&
3201+
($expression instanceof StringLiteral ||
3202+
$expression instanceof ArrayCreationExpression ||
3203+
$expression instanceof ObjectCreationExpression)) {
3204+
return $expression;
3205+
}
31943206
$expression = $this->parseSubscriptExpression($expression);
31953207
return $this->parsePostfixExpressionRest($expression);
31963208
}
Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1 @@
1-
[
2-
{
3-
"kind": 0,
4-
"message": "'}' expected.",
5-
"start": 158,
6-
"length": 0
7-
},
8-
{
9-
"kind": 0,
10-
"message": "'}' expected.",
11-
"start": 158,
12-
"length": 0
13-
},
14-
{
15-
"kind": 0,
16-
"message": "';' expected.",
17-
"start": 158,
18-
"length": 0
19-
},
20-
{
21-
"kind": 0,
22-
"message": "'}' expected.",
23-
"start": 158,
24-
"length": 0
25-
},
26-
{
27-
"kind": 0,
28-
"message": "Unexpected '}'",
29-
"start": 214,
30-
"length": 1
31-
},
32-
{
33-
"kind": 0,
34-
"message": "')' expected.",
35-
"start": 234,
36-
"length": 0
37-
},
38-
{
39-
"kind": 0,
40-
"message": "';' expected.",
41-
"start": 234,
42-
"length": 0
43-
},
44-
{
45-
"kind": 0,
46-
"message": "';' expected.",
47-
"start": 241,
48-
"length": 0
49-
},
50-
{
51-
"kind": 0,
52-
"message": "Unexpected ')'",
53-
"start": 241,
54-
"length": 1
55-
},
56-
{
57-
"kind": 0,
58-
"message": "Unexpected '}'",
59-
"start": 326,
60-
"length": 1
61-
},
62-
{
63-
"kind": 0,
64-
"message": "Unexpected '}'",
65-
"start": 328,
66-
"length": 1
67-
}
68-
]
1+
[]

0 commit comments

Comments
 (0)