Skip to content

Commit 84ce745

Browse files
authored
Merge pull request #398 from dantleech/enum-interface-cluase
Support Enum Interface clause
2 parents b443ec8 + 1a59cc2 commit 84ce745

File tree

12 files changed

+136
-0
lines changed

12 files changed

+136
-0
lines changed

src/Node/EnumInterfaceClause.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/*---------------------------------------------------------------------------------------------
3+
* Copyright (c) Microsoft Corporation. All rights reserved.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*--------------------------------------------------------------------------------------------*/
6+
7+
namespace Microsoft\PhpParser\Node;
8+
9+
use Microsoft\PhpParser\Node;
10+
use Microsoft\PhpParser\Token;
11+
12+
class EnumInterfaceClause extends Node {
13+
/** @var Token */
14+
public $implementsKeyword;
15+
16+
/** @var DelimitedList\QualifiedNameList|null */
17+
public $interfaceNameList;
18+
19+
const CHILD_NAMES = [
20+
'implementsKeyword',
21+
'interfaceNameList'
22+
];
23+
}

src/Node/Statement/EnumDeclaration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Microsoft\PhpParser\NamespacedNameInterface;
1111
use Microsoft\PhpParser\NamespacedNameTrait;
1212
use Microsoft\PhpParser\Node\AttributeGroup;
13+
use Microsoft\PhpParser\Node\EnumInterfaceClause;
1314
use Microsoft\PhpParser\Node\StatementNode;
1415
use Microsoft\PhpParser\Node\EnumMembers;
1516
use Microsoft\PhpParser\Token;
@@ -23,6 +24,9 @@ class EnumDeclaration extends StatementNode implements NamespacedNameInterface,
2324
/** @var Token */
2425
public $enumKeyword;
2526

27+
/** @var EnumInterfaceClause|null */
28+
public $enumInterfaceClause;
29+
2630
/** @var Token */
2731
public $name;
2832

@@ -41,6 +45,7 @@ class EnumDeclaration extends StatementNode implements NamespacedNameInterface,
4145
'name',
4246
'colonToken',
4347
'enumType',
48+
'enumInterfaceClause',
4449
'enumMembers',
4550
];
4651

src/Parser.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Microsoft\PhpParser\Node\ClassMembersNode;
1919
use Microsoft\PhpParser\Node\ConstElement;
2020
use Microsoft\PhpParser\Node\EnumCaseDeclaration;
21+
use Microsoft\PhpParser\Node\EnumInterfaceClause;
2122
use Microsoft\PhpParser\Node\EnumMembers;
2223
use Microsoft\PhpParser\Node\Expression;
2324
use Microsoft\PhpParser\Node\Expression\{
@@ -3737,11 +3738,27 @@ private function parseEnumDeclaration($parentNode) {
37373738
?: new MissingToken(TokenKind::EnumType, $this->token->fullStart);
37383739
}
37393740

3741+
$enumDeclaration->enumInterfaceClause = $this->parseEnumInterfaceClause($enumDeclaration);
37403742
$enumDeclaration->enumMembers = $this->parseEnumMembers($enumDeclaration);
37413743

37423744
return $enumDeclaration;
37433745
}
37443746

3747+
private function parseEnumInterfaceClause(EnumDeclaration $enumDeclaration): ?EnumInterfaceClause {
3748+
$enumInterfaceClause = new EnumInterfaceClause();
3749+
$enumInterfaceClause->parent = $enumDeclaration;
3750+
$enumInterfaceClause->implementsKeyword = $this->eatOptional1(TokenKind::ImplementsKeyword);
3751+
3752+
if ($enumInterfaceClause->implementsKeyword === null) {
3753+
return null;
3754+
}
3755+
3756+
$enumInterfaceClause->interfaceNameList =
3757+
$this->parseQualifiedNameList($enumInterfaceClause);
3758+
return $enumInterfaceClause;
3759+
}
3760+
3761+
37453762
private function parseEnumMembers($parentNode) {
37463763
$enumMembers = new EnumMembers();
37473764
$enumMembers->parent = $parentNode;

tests/cases/parser81/enums1.php.tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
},
2525
"colonToken": null,
2626
"enumType": null,
27+
"enumInterfaceClause": null,
2728
"enumMembers": {
2829
"EnumMembers": {
2930
"openBrace": {

tests/cases/parser81/enums2.php.tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"kind": "IntReservedWord",
3131
"textLength": 3
3232
},
33+
"enumInterfaceClause": null,
3334
"enumMembers": {
3435
"EnumMembers": {
3536
"openBrace": {

tests/cases/parser81/enums3.php.tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
},
6363
"colonToken": null,
6464
"enumType": null,
65+
"enumInterfaceClause": null,
6566
"enumMembers": {
6667
"EnumMembers": {
6768
"openBrace": {

tests/cases/parser81/enums4.php.tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"kind": "StringReservedWord",
3131
"textLength": 6
3232
},
33+
"enumInterfaceClause": null,
3334
"enumMembers": {
3435
"EnumMembers": {
3536
"openBrace": {

tests/cases/parser81/enums5.php.tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"kind": "EnumType",
3232
"textLength": 0
3333
},
34+
"enumInterfaceClause": null,
3435
"enumMembers": {
3536
"EnumMembers": {
3637
"openBrace": {

tests/cases/parser81/enums6.php.tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"kind": "IntReservedWord",
3131
"textLength": 3
3232
},
33+
"enumInterfaceClause": null,
3334
"enumMembers": {
3435
"EnumMembers": {
3536
"openBrace": {

tests/cases/parser81/enums7.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?php
2+
enum Foo: int implements Foo
3+
{
4+
}

tests/cases/parser81/enums7.php.diag

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]

tests/cases/parser81/enums7.php.tree

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
{
2+
"SourceFileNode": {
3+
"statementList": [
4+
{
5+
"InlineHtml": {
6+
"scriptSectionEndTag": null,
7+
"text": null,
8+
"scriptSectionStartTag": {
9+
"kind": "ScriptSectionStartTag",
10+
"textLength": 6
11+
}
12+
}
13+
},
14+
{
15+
"EnumDeclaration": {
16+
"attributes": null,
17+
"enumKeyword": {
18+
"kind": "EnumKeyword",
19+
"textLength": 4
20+
},
21+
"name": {
22+
"kind": "Name",
23+
"textLength": 3
24+
},
25+
"colonToken": {
26+
"kind": "ColonToken",
27+
"textLength": 1
28+
},
29+
"enumType": {
30+
"kind": "IntReservedWord",
31+
"textLength": 3
32+
},
33+
"enumInterfaceClause": {
34+
"EnumInterfaceClause": {
35+
"implementsKeyword": {
36+
"kind": "ImplementsKeyword",
37+
"textLength": 10
38+
},
39+
"interfaceNameList": {
40+
"QualifiedNameList": {
41+
"children": [
42+
{
43+
"QualifiedName": {
44+
"globalSpecifier": null,
45+
"relativeSpecifier": null,
46+
"nameParts": [
47+
{
48+
"kind": "Name",
49+
"textLength": 3
50+
}
51+
]
52+
}
53+
}
54+
]
55+
}
56+
}
57+
}
58+
},
59+
"enumMembers": {
60+
"EnumMembers": {
61+
"openBrace": {
62+
"kind": "OpenBraceToken",
63+
"textLength": 1
64+
},
65+
"enumMemberDeclarations": [],
66+
"closeBrace": {
67+
"kind": "CloseBraceToken",
68+
"textLength": 1
69+
}
70+
}
71+
}
72+
}
73+
}
74+
],
75+
"endOfFileToken": {
76+
"kind": "EndOfFileToken",
77+
"textLength": 0
78+
}
79+
}
80+
}

0 commit comments

Comments
 (0)