From ac97987ee00f4f6c5eb44c3f76abc2677c99f785 Mon Sep 17 00:00:00 2001 From: Dhruv Rajvanshi Date: Thu, 29 Mar 2018 22:59:58 +0530 Subject: [PATCH] Allow strict mode reserved keywords in qualified type names; Fixes 22785 --- src/compiler/utilities.ts | 4 ++-- .../strictModeEnumMemberNameReserved.js | 15 +++++++++++++++ .../strictModeEnumMemberNameReserved.symbols | 17 +++++++++++++++++ .../strictModeEnumMemberNameReserved.types | 19 +++++++++++++++++++ .../strictModeReservedWord.errors.txt | 17 +---------------- .../strictModeEnumMemberNameReserved.ts | 6 ++++++ 6 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 tests/baselines/reference/strictModeEnumMemberNameReserved.js create mode 100644 tests/baselines/reference/strictModeEnumMemberNameReserved.symbols create mode 100644 tests/baselines/reference/strictModeEnumMemberNameReserved.types create mode 100644 tests/cases/compiler/strictModeEnumMemberNameReserved.ts diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 1cc3add43e3..4f9dcf69310 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2059,12 +2059,12 @@ namespace ts { // Name in member declaration or property name in property access return (parent).name === node; case SyntaxKind.QualifiedName: - // Name on right hand side of dot in a type query + // Name on right hand side of dot in a type query or type reference if ((parent).right === node) { while (parent.kind === SyntaxKind.QualifiedName) { parent = parent.parent; } - return parent.kind === SyntaxKind.TypeQuery; + return parent.kind === SyntaxKind.TypeQuery || parent.kind === SyntaxKind.TypeReference; } return false; case SyntaxKind.BindingElement: diff --git a/tests/baselines/reference/strictModeEnumMemberNameReserved.js b/tests/baselines/reference/strictModeEnumMemberNameReserved.js new file mode 100644 index 00000000000..1dd89af1686 --- /dev/null +++ b/tests/baselines/reference/strictModeEnumMemberNameReserved.js @@ -0,0 +1,15 @@ +//// [strictModeEnumMemberNameReserved.ts] +"use strict"; +enum E { + static +} + +const x1: E.static = E.static; + +//// [strictModeEnumMemberNameReserved.js] +"use strict"; +var E; +(function (E) { + E[E["static"] = 0] = "static"; +})(E || (E = {})); +var x1 = E.static; diff --git a/tests/baselines/reference/strictModeEnumMemberNameReserved.symbols b/tests/baselines/reference/strictModeEnumMemberNameReserved.symbols new file mode 100644 index 00000000000..282c5ebab4e --- /dev/null +++ b/tests/baselines/reference/strictModeEnumMemberNameReserved.symbols @@ -0,0 +1,17 @@ +=== tests/cases/compiler/strictModeEnumMemberNameReserved.ts === +"use strict"; +enum E { +>E : Symbol(E, Decl(strictModeEnumMemberNameReserved.ts, 0, 13)) + + static +>static : Symbol(E.static, Decl(strictModeEnumMemberNameReserved.ts, 1, 8)) +} + +const x1: E.static = E.static; +>x1 : Symbol(x1, Decl(strictModeEnumMemberNameReserved.ts, 5, 5)) +>E : Symbol(E, Decl(strictModeEnumMemberNameReserved.ts, 0, 13)) +>static : Symbol(E.static, Decl(strictModeEnumMemberNameReserved.ts, 1, 8)) +>E.static : Symbol(E.static, Decl(strictModeEnumMemberNameReserved.ts, 1, 8)) +>E : Symbol(E, Decl(strictModeEnumMemberNameReserved.ts, 0, 13)) +>static : Symbol(E.static, Decl(strictModeEnumMemberNameReserved.ts, 1, 8)) + diff --git a/tests/baselines/reference/strictModeEnumMemberNameReserved.types b/tests/baselines/reference/strictModeEnumMemberNameReserved.types new file mode 100644 index 00000000000..867df395ced --- /dev/null +++ b/tests/baselines/reference/strictModeEnumMemberNameReserved.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/strictModeEnumMemberNameReserved.ts === +"use strict"; +>"use strict" : "use strict" + +enum E { +>E : E + + static +>static : E +} + +const x1: E.static = E.static; +>x1 : E +>E : any +>static : E +>E.static : E +>E : typeof E +>static : E + diff --git a/tests/baselines/reference/strictModeReservedWord.errors.txt b/tests/baselines/reference/strictModeReservedWord.errors.txt index f2f74c81a93..87f73c5780a 100644 --- a/tests/baselines/reference/strictModeReservedWord.errors.txt +++ b/tests/baselines/reference/strictModeReservedWord.errors.txt @@ -28,22 +28,17 @@ tests/cases/compiler/strictModeReservedWord.ts(19,21): error TS1212: Identifier tests/cases/compiler/strictModeReservedWord.ts(19,21): error TS2503: Cannot find namespace 'private'. tests/cases/compiler/strictModeReservedWord.ts(20,22): error TS1212: Identifier expected. 'private' is a reserved word in strict mode. tests/cases/compiler/strictModeReservedWord.ts(20,22): error TS2503: Cannot find namespace 'private'. -tests/cases/compiler/strictModeReservedWord.ts(20,30): error TS1212: Identifier expected. 'package' is a reserved word in strict mode. tests/cases/compiler/strictModeReservedWord.ts(21,22): error TS1212: Identifier expected. 'private' is a reserved word in strict mode. tests/cases/compiler/strictModeReservedWord.ts(21,22): error TS2503: Cannot find namespace 'private'. -tests/cases/compiler/strictModeReservedWord.ts(21,30): error TS1212: Identifier expected. 'package' is a reserved word in strict mode. -tests/cases/compiler/strictModeReservedWord.ts(21,38): error TS1212: Identifier expected. 'protected' is a reserved word in strict mode. tests/cases/compiler/strictModeReservedWord.ts(22,9): error TS2300: Duplicate identifier 'b'. tests/cases/compiler/strictModeReservedWord.ts(22,12): error TS1212: Identifier expected. 'interface' is a reserved word in strict mode. tests/cases/compiler/strictModeReservedWord.ts(22,12): error TS2503: Cannot find namespace 'interface'. -tests/cases/compiler/strictModeReservedWord.ts(22,22): error TS1212: Identifier expected. 'package' is a reserved word in strict mode. -tests/cases/compiler/strictModeReservedWord.ts(22,30): error TS1212: Identifier expected. 'implements' is a reserved word in strict mode. tests/cases/compiler/strictModeReservedWord.ts(23,5): error TS2552: Cannot find name 'ublic'. Did you mean 'public'? tests/cases/compiler/strictModeReservedWord.ts(24,5): error TS1212: Identifier expected. 'static' is a reserved word in strict mode. tests/cases/compiler/strictModeReservedWord.ts(24,5): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'String' has no compatible call signatures. -==== tests/cases/compiler/strictModeReservedWord.ts (43 errors) ==== +==== tests/cases/compiler/strictModeReservedWord.ts (38 errors) ==== let let = 10; ~~~ !!! error TS2480: 'let' is not allowed to be used as a name in 'let' or 'const' declarations. @@ -124,17 +119,11 @@ tests/cases/compiler/strictModeReservedWord.ts(24,5): error TS2349: Cannot invok !!! error TS1212: Identifier expected. 'private' is a reserved word in strict mode. ~~~~~~~ !!! error TS2503: Cannot find namespace 'private'. - ~~~~~~~ -!!! error TS1212: Identifier expected. 'package' is a reserved word in strict mode. function foo2(x: private.package.protected) { } ~~~~~~~ !!! error TS1212: Identifier expected. 'private' is a reserved word in strict mode. ~~~~~~~ !!! error TS2503: Cannot find namespace 'private'. - ~~~~~~~ -!!! error TS1212: Identifier expected. 'package' is a reserved word in strict mode. - ~~~~~~~~~ -!!! error TS1212: Identifier expected. 'protected' is a reserved word in strict mode. let b: interface.package.implements.B; ~ !!! error TS2300: Duplicate identifier 'b'. @@ -142,10 +131,6 @@ tests/cases/compiler/strictModeReservedWord.ts(24,5): error TS2349: Cannot invok !!! error TS1212: Identifier expected. 'interface' is a reserved word in strict mode. ~~~~~~~~~ !!! error TS2503: Cannot find namespace 'interface'. - ~~~~~~~ -!!! error TS1212: Identifier expected. 'package' is a reserved word in strict mode. - ~~~~~~~~~~ -!!! error TS1212: Identifier expected. 'implements' is a reserved word in strict mode. ublic(); ~~~~~ !!! error TS2552: Cannot find name 'ublic'. Did you mean 'public'? diff --git a/tests/cases/compiler/strictModeEnumMemberNameReserved.ts b/tests/cases/compiler/strictModeEnumMemberNameReserved.ts new file mode 100644 index 00000000000..a41985b16f8 --- /dev/null +++ b/tests/cases/compiler/strictModeEnumMemberNameReserved.ts @@ -0,0 +1,6 @@ +"use strict"; +enum E { + static +} + +const x1: E.static = E.static; \ No newline at end of file