Skip to content

Commit 3a2c723

Browse files
author
Andy
authored
Allow parsing a qualified type name containing a reserved word (microsoft#18888)
1 parent b244cd4 commit 3a2c723

15 files changed

+81
-52
lines changed

src/compiler/parser.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,8 +1217,8 @@ namespace ts {
12171217
return createIdentifier(isIdentifier(), diagnosticMessage);
12181218
}
12191219

1220-
function parseIdentifierName(): Identifier {
1221-
return createIdentifier(tokenIsIdentifierOrKeyword(token()));
1220+
function parseIdentifierName(diagnosticMessage?: DiagnosticMessage): Identifier {
1221+
return createIdentifier(tokenIsIdentifierOrKeyword(token()), diagnosticMessage);
12221222
}
12231223

12241224
function isLiteralPropertyName(): boolean {
@@ -1956,7 +1956,7 @@ namespace ts {
19561956
}
19571957

19581958
function parseEntityName(allowReservedWords: boolean, diagnosticMessage?: DiagnosticMessage): EntityName {
1959-
let entity: EntityName = allowReservedWords ? parseIdentifierName() : parseIdentifier(diagnosticMessage);
1959+
let entity: EntityName = allowReservedWords ? parseIdentifierName(diagnosticMessage) : parseIdentifier(diagnosticMessage);
19601960
let dotPos = scanner.getStartPos();
19611961
while (parseOptional(SyntaxKind.DotToken)) {
19621962
if (token() === SyntaxKind.LessThanToken) {
@@ -2096,7 +2096,7 @@ namespace ts {
20962096

20972097
function parseTypeReference(): TypeReferenceNode {
20982098
const node = <TypeReferenceNode>createNode(SyntaxKind.TypeReference);
2099-
node.typeName = parseEntityName(/*allowReservedWords*/ !!(contextFlags & NodeFlags.JSDoc), Diagnostics.Type_expected);
2099+
node.typeName = parseEntityName(/*allowReservedWords*/ true, Diagnostics.Type_expected);
21002100
if (!scanner.hasPrecedingLineBreak() && token() === SyntaxKind.LessThanToken) {
21012101
node.typeArguments = parseBracketedList(ParsingContext.TypeArguments, parseType, SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken);
21022102
}

tests/baselines/reference/derivedClassSuperCallsInNonConstructorMembers.errors.txt

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,8): error TS1110: Type expected.
2-
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,8): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
1+
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,8): error TS2304: Cannot find name 'super'.
2+
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,13): error TS1005: '=' expected.
3+
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(8,14): error TS1109: Expression expected.
34
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(10,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
45
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(13,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
56
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(17,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
6-
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,15): error TS1110: Type expected.
7-
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,15): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
7+
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,15): error TS2304: Cannot find name 'super'.
8+
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,20): error TS1005: '=' expected.
9+
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(20,21): error TS1109: Expression expected.
810
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(22,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
911
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(25,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
1012
tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts(29,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
1113

1214

13-
==== tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts (10 errors) ====
15+
==== tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsInNonConstructorMembers.ts (12 errors) ====
1416
// error to use super calls outside a constructor
1517

1618
class Base {
@@ -20,9 +22,11 @@ tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassS
2022
class Derived extends Base {
2123
a: super();
2224
~~~~~
23-
!!! error TS1110: Type expected.
24-
~~~~~
25-
!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
25+
!!! error TS2304: Cannot find name 'super'.
26+
~
27+
!!! error TS1005: '=' expected.
28+
~
29+
!!! error TS1109: Expression expected.
2630
b() {
2731
super();
2832
~~~~~
@@ -42,9 +46,11 @@ tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassS
4246

4347
static a: super();
4448
~~~~~
45-
!!! error TS1110: Type expected.
46-
~~~~~
47-
!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors.
49+
!!! error TS2304: Cannot find name 'super'.
50+
~
51+
!!! error TS1005: '=' expected.
52+
~
53+
!!! error TS1109: Expression expected.
4854
static b() {
4955
super();
5056
~~~~~

tests/baselines/reference/derivedClassSuperCallsInNonConstructorMembers.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ var Derived = /** @class */ (function (_super) {
5252
__extends(Derived, _super);
5353
function Derived() {
5454
var _this = _super !== null && _super.apply(this, arguments) || this;
55-
_this.a = _this = _super.call(this) || this;
55+
_this.a = ();
5656
return _this;
5757
}
5858
Derived.prototype.b = function () {
@@ -83,6 +83,6 @@ var Derived = /** @class */ (function (_super) {
8383
enumerable: true,
8484
configurable: true
8585
});
86-
Derived.a = _this = _super.call(this) || this;
86+
Derived.a = ();
8787
return Derived;
8888
}(Base));

tests/baselines/reference/derivedClassSuperCallsInNonConstructorMembers.types

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ class Derived extends Base {
1414

1515
a: super();
1616
>a : any
17-
> : No type information available!
18-
>super() : void
19-
>super : any
17+
>super : No type information available!
18+
>() : any
19+
> : any
2020

2121
b() {
2222
>b : () => void
@@ -46,9 +46,9 @@ class Derived extends Base {
4646

4747
static a: super();
4848
>a : any
49-
> : No type information available!
50-
>super() : void
51-
>super : any
49+
>super : No type information available!
50+
>() : any
51+
> : any
5252

5353
static b() {
5454
>b : () => void
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
tests/cases/compiler/example.js(3,20): error TS1003: Identifier expected.
1+
tests/cases/compiler/example.js(3,20): error TS1110: Type expected.
22

33

44
==== tests/cases/compiler/example.js (1 errors) ====
55
// @ts-check
66
/**
77
* @type {function(@foo)}
88
~
9-
!!! error TS1003: Identifier expected.
9+
!!! error TS1110: Type expected.
1010
*/
1111
let x;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//// [parseEntityNameWithReservedWord.ts]
2+
enum Bool { false }
3+
const x: Bool.false = Bool.false;
4+
5+
6+
//// [parseEntityNameWithReservedWord.js]
7+
var Bool;
8+
(function (Bool) {
9+
Bool[Bool["false"] = 0] = "false";
10+
})(Bool || (Bool = {}));
11+
var x = Bool["false"];
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/compiler/parseEntityNameWithReservedWord.ts ===
2+
enum Bool { false }
3+
>Bool : Symbol(Bool, Decl(parseEntityNameWithReservedWord.ts, 0, 0))
4+
>false : Symbol(Bool.false, Decl(parseEntityNameWithReservedWord.ts, 0, 11))
5+
6+
const x: Bool.false = Bool.false;
7+
>x : Symbol(x, Decl(parseEntityNameWithReservedWord.ts, 1, 5))
8+
>Bool : Symbol(Bool, Decl(parseEntityNameWithReservedWord.ts, 0, 0))
9+
>false : Symbol(Bool.false, Decl(parseEntityNameWithReservedWord.ts, 0, 11))
10+
>Bool.false : Symbol(Bool.false, Decl(parseEntityNameWithReservedWord.ts, 0, 11))
11+
>Bool : Symbol(Bool, Decl(parseEntityNameWithReservedWord.ts, 0, 0))
12+
>false : Symbol(Bool.false, Decl(parseEntityNameWithReservedWord.ts, 0, 11))
13+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
=== tests/cases/compiler/parseEntityNameWithReservedWord.ts ===
2+
enum Bool { false }
3+
>Bool : Bool
4+
>false : Bool
5+
6+
const x: Bool.false = Bool.false;
7+
>x : Bool
8+
>Bool : any
9+
>false : Bool
10+
>Bool.false : Bool
11+
>Bool : typeof Bool
12+
>false : Bool
13+
Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
1-
tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts(2,23): error TS1110: Type expected.
2-
tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts(2,28): error TS1003: Identifier expected.
3-
tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts(3,1): error TS1128: Declaration or statement expected.
1+
tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts(2,23): error TS2304: Cannot find name 'break'.
42

53

6-
==== tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts (3 errors) ====
4+
==== tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ParameterLists/parserErrorRecovery_ParameterList6.ts (1 errors) ====
75
class Foo {
86
public banana (x: break) { }
97
~~~~~
10-
!!! error TS1110: Type expected.
11-
~
12-
!!! error TS1003: Identifier expected.
13-
}
14-
~
15-
!!! error TS1128: Declaration or statement expected.
8+
!!! error TS2304: Cannot find name 'break'.
9+
}

tests/baselines/reference/parserErrorRecovery_ParameterList6.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ class Foo {
77
var Foo = /** @class */ (function () {
88
function Foo() {
99
}
10+
Foo.prototype.banana = function (x) { };
1011
return Foo;
1112
}());
12-
break ;
13-
{ }

tests/baselines/reference/parserErrorRecovery_ParameterList6.types

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ class Foo {
33
>Foo : Foo
44

55
public banana (x: break) { }
6-
>banana : (x: any) => any
6+
>banana : (x: any) => void
77
>x : any
8-
> : No type information available!
9-
> : any
8+
>break : No type information available!
109
}
Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts(1,9): error TS2503: Cannot find namespace 'x'.
2-
tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts(1,11): error TS1003: Identifier expected.
3-
tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts(1,15): error TS1109: Expression expected.
42

53

6-
==== tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts (3 errors) ====
4+
==== tests/cases/conformance/parser/ecmascript5/parservoidInQualifiedName2.ts (1 errors) ====
75
var v : x.void;
86
~
9-
!!! error TS2503: Cannot find namespace 'x'.
10-
~~~~
11-
!!! error TS1003: Identifier expected.
12-
~
13-
!!! error TS1109: Expression expected.
7+
!!! error TS2503: Cannot find namespace 'x'.

tests/baselines/reference/parservoidInQualifiedName2.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
var v : x.void;
33

44
//// [parservoidInQualifiedName2.js]
5-
var v = void ;
5+
var v;

tests/baselines/reference/parservoidInQualifiedName2.types

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,5 @@
22
var v : x.void;
33
>v : any
44
>x : any
5-
> : No type information available!
6-
>void : undefined
7-
> : any
5+
>void : No type information available!
86

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
enum Bool { false }
2+
const x: Bool.false = Bool.false;

0 commit comments

Comments
 (0)