Skip to content

Commit f83efcc

Browse files
Merge pull request #2895 from Microsoft/reservedNamesImportsExports
Allow contextually reserved names in import/export clauses
2 parents bc5e5a2 + 938cfde commit f83efcc

9 files changed

+235
-3
lines changed

src/compiler/checker.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -11998,7 +11998,7 @@ module ts {
1199811998
function isReservedWordInStrictMode(node: Identifier): boolean {
1199911999
// Check that originalKeywordKind is less than LastFutureReservedWord to see if an Identifier is a strict-mode reserved word
1200012000
return (node.parserContextFlags & ParserContextFlags.StrictMode) &&
12001-
(node.originalKeywordKind >= SyntaxKind.FirstFutureReservedWord && node.originalKeywordKind <= SyntaxKind.LastFutureReservedWord);
12001+
(SyntaxKind.FirstFutureReservedWord <= node.originalKeywordKind && node.originalKeywordKind <= SyntaxKind.LastFutureReservedWord);
1200212002
}
1200312003

1200412004
function reportStrictModeGrammarErrorInClassDeclaration(identifier: Identifier, message: DiagnosticMessage, arg0?: any, arg1?: any, arg2?: any): boolean {
@@ -12018,7 +12018,7 @@ module ts {
1201812018
let nameBindings = impotClause.namedBindings;
1201912019
if (nameBindings.kind === SyntaxKind.NamespaceImport) {
1202012020
let name = <Identifier>(<NamespaceImport>nameBindings).name;
12021-
if (name.originalKeywordKind) {
12021+
if (isReservedWordInStrictMode(name)) {
1202212022
let nameText = declarationNameToString(name);
1202312023
return grammarErrorOnNode(name, Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
1202412024
}
@@ -12027,7 +12027,7 @@ module ts {
1202712027
let reportError = false;
1202812028
for (let element of (<NamedImports>nameBindings).elements) {
1202912029
let name = element.name;
12030-
if (name.originalKeywordKind) {
12030+
if (isReservedWordInStrictMode(name)) {
1203112031
let nameText = declarationNameToString(name);
1203212032
reportError = reportError || grammarErrorOnNode(name, Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
1203312033
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//// [tests/cases/conformance/es6/modules/exportsAndImportsWithContextualKeywordNames01.ts] ////
2+
3+
//// [t1.ts]
4+
5+
let set = {
6+
set foo(x: number) {
7+
}
8+
}
9+
let get = 10;
10+
11+
export { set, get };
12+
13+
//// [t2.ts]
14+
import * as set from "./t1";
15+
16+
//// [t3.ts]
17+
import { set as yield } from "./t1";
18+
19+
//// [t4.ts]
20+
import { get } from "./t1";
21+
22+
//// [t1.js]
23+
var set = {
24+
set foo(x) {
25+
}
26+
};
27+
exports.set = set;
28+
var get = 10;
29+
exports.get = get;
30+
//// [t2.js]
31+
//// [t3.js]
32+
//// [t4.js]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
=== tests/cases/conformance/es6/modules/t1.ts ===
2+
3+
let set = {
4+
>set : Symbol(set, Decl(t1.ts, 1, 3))
5+
6+
set foo(x: number) {
7+
>foo : Symbol(foo, Decl(t1.ts, 1, 11))
8+
>x : Symbol(x, Decl(t1.ts, 2, 12))
9+
}
10+
}
11+
let get = 10;
12+
>get : Symbol(get, Decl(t1.ts, 5, 3))
13+
14+
export { set, get };
15+
>set : Symbol(set, Decl(t1.ts, 7, 8))
16+
>get : Symbol(get, Decl(t1.ts, 7, 13))
17+
18+
=== tests/cases/conformance/es6/modules/t2.ts ===
19+
import * as set from "./t1";
20+
>set : Symbol(set, Decl(t2.ts, 0, 6))
21+
22+
=== tests/cases/conformance/es6/modules/t3.ts ===
23+
import { set as yield } from "./t1";
24+
>set : Symbol(yield, Decl(t3.ts, 0, 8))
25+
>yield : Symbol(yield, Decl(t3.ts, 0, 8))
26+
27+
=== tests/cases/conformance/es6/modules/t4.ts ===
28+
import { get } from "./t1";
29+
>get : Symbol(get, Decl(t4.ts, 0, 8))
30+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
=== tests/cases/conformance/es6/modules/t1.ts ===
2+
3+
let set = {
4+
>set : { foo: number; }
5+
>{ set foo(x: number) { }} : { foo: number; }
6+
7+
set foo(x: number) {
8+
>foo : number
9+
>x : number
10+
}
11+
}
12+
let get = 10;
13+
>get : number
14+
>10 : number
15+
16+
export { set, get };
17+
>set : { foo: number; }
18+
>get : number
19+
20+
=== tests/cases/conformance/es6/modules/t2.ts ===
21+
import * as set from "./t1";
22+
>set : typeof set
23+
24+
=== tests/cases/conformance/es6/modules/t3.ts ===
25+
import { set as yield } from "./t1";
26+
>set : { foo: number; }
27+
>yield : { foo: number; }
28+
29+
=== tests/cases/conformance/es6/modules/t4.ts ===
30+
import { get } from "./t1";
31+
>get : number
32+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//// [tests/cases/conformance/es6/modules/exportsAndImportsWithContextualKeywordNames02.ts] ////
2+
3+
//// [t1.ts]
4+
5+
let as = 100;
6+
7+
export { as as return, as };
8+
9+
//// [t2.ts]
10+
import * as as from "./t1";
11+
var x = as.as;
12+
var y = as.return;
13+
14+
//// [t3.ts]
15+
import { as as as } from "./t1";
16+
17+
//// [t4.ts]
18+
import { as } from "./t1";
19+
20+
//// [t1.js]
21+
var as = 100;
22+
exports.return = as;
23+
exports.as = as;
24+
//// [t2.js]
25+
var as = require("./t1");
26+
var x = as.as;
27+
var y = as.return;
28+
//// [t3.js]
29+
//// [t4.js]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
=== tests/cases/conformance/es6/modules/t1.ts ===
2+
3+
let as = 100;
4+
>as : Symbol(as, Decl(t1.ts, 1, 3))
5+
6+
export { as as return, as };
7+
>as : Symbol(return, Decl(t1.ts, 3, 8))
8+
>return : Symbol(return, Decl(t1.ts, 3, 8))
9+
>as : Symbol(as, Decl(t1.ts, 3, 22))
10+
11+
=== tests/cases/conformance/es6/modules/t2.ts ===
12+
import * as as from "./t1";
13+
>as : Symbol(as, Decl(t2.ts, 0, 6))
14+
15+
var x = as.as;
16+
>x : Symbol(x, Decl(t2.ts, 1, 3))
17+
>as.as : Symbol(as.as, Decl(t1.ts, 3, 22))
18+
>as : Symbol(as, Decl(t2.ts, 0, 6))
19+
>as : Symbol(as.as, Decl(t1.ts, 3, 22))
20+
21+
var y = as.return;
22+
>y : Symbol(y, Decl(t2.ts, 2, 3))
23+
>as.return : Symbol(as.return, Decl(t1.ts, 3, 8))
24+
>as : Symbol(as, Decl(t2.ts, 0, 6))
25+
>return : Symbol(as.return, Decl(t1.ts, 3, 8))
26+
27+
=== tests/cases/conformance/es6/modules/t3.ts ===
28+
import { as as as } from "./t1";
29+
>as : Symbol(as, Decl(t3.ts, 0, 8))
30+
>as : Symbol(as, Decl(t3.ts, 0, 8))
31+
32+
=== tests/cases/conformance/es6/modules/t4.ts ===
33+
import { as } from "./t1";
34+
>as : Symbol(as, Decl(t4.ts, 0, 8))
35+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
=== tests/cases/conformance/es6/modules/t1.ts ===
2+
3+
let as = 100;
4+
>as : number
5+
>100 : number
6+
7+
export { as as return, as };
8+
>as : number
9+
>return : number
10+
>as : number
11+
12+
=== tests/cases/conformance/es6/modules/t2.ts ===
13+
import * as as from "./t1";
14+
>as : typeof as
15+
16+
var x = as.as;
17+
>x : number
18+
>as.as : number
19+
>as : typeof as
20+
>as : number
21+
22+
var y = as.return;
23+
>y : number
24+
>as.return : number
25+
>as : typeof as
26+
>return : number
27+
28+
=== tests/cases/conformance/es6/modules/t3.ts ===
29+
import { as as as } from "./t1";
30+
>as : number
31+
>as : number
32+
33+
=== tests/cases/conformance/es6/modules/t4.ts ===
34+
import { as } from "./t1";
35+
>as : number
36+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// @module: commonjs
2+
// @target: es5
3+
4+
// @filename: t1.ts
5+
let set = {
6+
set foo(x: number) {
7+
}
8+
}
9+
let get = 10;
10+
11+
export { set, get };
12+
13+
// @filename: t2.ts
14+
import * as set from "./t1";
15+
16+
// @filename: t3.ts
17+
import { set as yield } from "./t1";
18+
19+
// @filename: t4.ts
20+
import { get } from "./t1";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// @module: commonjs
2+
// @target: es5
3+
4+
// @filename: t1.ts
5+
let as = 100;
6+
7+
export { as as return, as };
8+
9+
// @filename: t2.ts
10+
import * as as from "./t1";
11+
var x = as.as;
12+
var y = as.return;
13+
14+
// @filename: t3.ts
15+
import { as as as } from "./t1";
16+
17+
// @filename: t4.ts
18+
import { as } from "./t1";

0 commit comments

Comments
 (0)