Skip to content

Commit c940402

Browse files
committed
Support php 'never' type, change parsing of 'void'
Similar to 'void', it's a compile time error to use void as a parameter/property type, not a parse time error. But `static` is a parse error. (It can also be used in union types) Remove redundant tokens added to merged returnTypeDeclarationTokens Closes microsoft#373 Closes microsoft#372
1 parent 1261275 commit c940402

File tree

6 files changed

+79
-3
lines changed

6 files changed

+79
-3
lines changed

src/Parser.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ public function __construct() {
144144
[TokenKind::ArrayKeyword, TokenKind::CallableKeyword, TokenKind::BoolReservedWord,
145145
TokenKind::FloatReservedWord, TokenKind::IntReservedWord, TokenKind::StringReservedWord,
146146
TokenKind::ObjectReservedWord, TokenKind::NullReservedWord, TokenKind::FalseReservedWord,
147-
TokenKind::TrueReservedWord,
148-
TokenKind::IterableReservedWord, TokenKind::MixedReservedWord]; // TODO update spec
149-
$this->returnTypeDeclarationTokens = \array_merge([TokenKind::VoidReservedWord, TokenKind::NullReservedWord, TokenKind::FalseReservedWord, TokenKind::TrueReservedWord, TokenKind::StaticKeyword], $this->parameterTypeDeclarationTokens);
147+
TokenKind::TrueReservedWord, TokenKind::IterableReservedWord, TokenKind::MixedReservedWord,
148+
TokenKind::VoidReservedWord, TokenKind::NeverReservedWord]; // TODO update spec
149+
$this->returnTypeDeclarationTokens = \array_merge([TokenKind::StaticKeyword], $this->parameterTypeDeclarationTokens);
150150
}
151151

152152
/**

src/TokenKind.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ class TokenKind {
175175
const NullReservedWord = 322;
176176
const MixedReservedWord = 340;
177177
const IterableReservedWord = 170;
178+
const NeverReservedWord = 341;
178179

179180
const ScriptSectionStartTag = 323;
180181
const ScriptSectionEndTag = 324;

src/TokenStringMaps.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ class TokenStringMaps {
109109
"void" => TokenKind::VoidReservedWord,
110110
"iterable" => TokenKind::IterableReservedWord,
111111
"mixed" => TokenKind::MixedReservedWord,
112+
"never" => TokenKind::NeverReservedWord,
112113
];
113114

114115
const OPERATORS_AND_PUNCTUATORS = [
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?php
2+
function example() : never {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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+
"FunctionDeclaration": {
16+
"attributes": null,
17+
"functionKeyword": {
18+
"kind": "FunctionKeyword",
19+
"textLength": 8
20+
},
21+
"byRefToken": null,
22+
"name": {
23+
"kind": "Name",
24+
"textLength": 7
25+
},
26+
"openParen": {
27+
"kind": "OpenParenToken",
28+
"textLength": 1
29+
},
30+
"parameters": null,
31+
"closeParen": {
32+
"kind": "CloseParenToken",
33+
"textLength": 1
34+
},
35+
"colonToken": {
36+
"kind": "ColonToken",
37+
"textLength": 1
38+
},
39+
"questionToken": null,
40+
"returnTypeList": {
41+
"QualifiedNameList": {
42+
"children": [
43+
{
44+
"kind": "NeverReservedWord",
45+
"textLength": 5
46+
}
47+
]
48+
}
49+
},
50+
"compoundStatementOrSemicolon": {
51+
"CompoundStatementNode": {
52+
"openBrace": {
53+
"kind": "OpenBraceToken",
54+
"textLength": 1
55+
},
56+
"statements": [],
57+
"closeBrace": {
58+
"kind": "CloseBraceToken",
59+
"textLength": 1
60+
}
61+
}
62+
}
63+
}
64+
}
65+
],
66+
"endOfFileToken": {
67+
"kind": "EndOfFileToken",
68+
"textLength": 0
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)