Merge pull request #2895 from Microsoft/reservedNamesImportsExports

Allow contextually reserved names in import/export clauses
This commit is contained in:
Daniel Rosenwasser 2015-04-23 14:52:57 -07:00
commit f83efcc7aa
9 changed files with 235 additions and 3 deletions

View File

@ -11998,7 +11998,7 @@ module ts {
function isReservedWordInStrictMode(node: Identifier): boolean {
// Check that originalKeywordKind is less than LastFutureReservedWord to see if an Identifier is a strict-mode reserved word
return (node.parserContextFlags & ParserContextFlags.StrictMode) &&
(node.originalKeywordKind >= SyntaxKind.FirstFutureReservedWord && node.originalKeywordKind <= SyntaxKind.LastFutureReservedWord);
(SyntaxKind.FirstFutureReservedWord <= node.originalKeywordKind && node.originalKeywordKind <= SyntaxKind.LastFutureReservedWord);
}
function reportStrictModeGrammarErrorInClassDeclaration(identifier: Identifier, message: DiagnosticMessage, arg0?: any, arg1?: any, arg2?: any): boolean {
@ -12018,7 +12018,7 @@ module ts {
let nameBindings = impotClause.namedBindings;
if (nameBindings.kind === SyntaxKind.NamespaceImport) {
let name = <Identifier>(<NamespaceImport>nameBindings).name;
if (name.originalKeywordKind) {
if (isReservedWordInStrictMode(name)) {
let nameText = declarationNameToString(name);
return grammarErrorOnNode(name, Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
}
@ -12027,7 +12027,7 @@ module ts {
let reportError = false;
for (let element of (<NamedImports>nameBindings).elements) {
let name = element.name;
if (name.originalKeywordKind) {
if (isReservedWordInStrictMode(name)) {
let nameText = declarationNameToString(name);
reportError = reportError || grammarErrorOnNode(name, Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
}

View File

@ -0,0 +1,32 @@
//// [tests/cases/conformance/es6/modules/exportsAndImportsWithContextualKeywordNames01.ts] ////
//// [t1.ts]
let set = {
set foo(x: number) {
}
}
let get = 10;
export { set, get };
//// [t2.ts]
import * as set from "./t1";
//// [t3.ts]
import { set as yield } from "./t1";
//// [t4.ts]
import { get } from "./t1";
//// [t1.js]
var set = {
set foo(x) {
}
};
exports.set = set;
var get = 10;
exports.get = get;
//// [t2.js]
//// [t3.js]
//// [t4.js]

View File

@ -0,0 +1,30 @@
=== tests/cases/conformance/es6/modules/t1.ts ===
let set = {
>set : Symbol(set, Decl(t1.ts, 1, 3))
set foo(x: number) {
>foo : Symbol(foo, Decl(t1.ts, 1, 11))
>x : Symbol(x, Decl(t1.ts, 2, 12))
}
}
let get = 10;
>get : Symbol(get, Decl(t1.ts, 5, 3))
export { set, get };
>set : Symbol(set, Decl(t1.ts, 7, 8))
>get : Symbol(get, Decl(t1.ts, 7, 13))
=== tests/cases/conformance/es6/modules/t2.ts ===
import * as set from "./t1";
>set : Symbol(set, Decl(t2.ts, 0, 6))
=== tests/cases/conformance/es6/modules/t3.ts ===
import { set as yield } from "./t1";
>set : Symbol(yield, Decl(t3.ts, 0, 8))
>yield : Symbol(yield, Decl(t3.ts, 0, 8))
=== tests/cases/conformance/es6/modules/t4.ts ===
import { get } from "./t1";
>get : Symbol(get, Decl(t4.ts, 0, 8))

View File

@ -0,0 +1,32 @@
=== tests/cases/conformance/es6/modules/t1.ts ===
let set = {
>set : { foo: number; }
>{ set foo(x: number) { }} : { foo: number; }
set foo(x: number) {
>foo : number
>x : number
}
}
let get = 10;
>get : number
>10 : number
export { set, get };
>set : { foo: number; }
>get : number
=== tests/cases/conformance/es6/modules/t2.ts ===
import * as set from "./t1";
>set : typeof set
=== tests/cases/conformance/es6/modules/t3.ts ===
import { set as yield } from "./t1";
>set : { foo: number; }
>yield : { foo: number; }
=== tests/cases/conformance/es6/modules/t4.ts ===
import { get } from "./t1";
>get : number

View File

@ -0,0 +1,29 @@
//// [tests/cases/conformance/es6/modules/exportsAndImportsWithContextualKeywordNames02.ts] ////
//// [t1.ts]
let as = 100;
export { as as return, as };
//// [t2.ts]
import * as as from "./t1";
var x = as.as;
var y = as.return;
//// [t3.ts]
import { as as as } from "./t1";
//// [t4.ts]
import { as } from "./t1";
//// [t1.js]
var as = 100;
exports.return = as;
exports.as = as;
//// [t2.js]
var as = require("./t1");
var x = as.as;
var y = as.return;
//// [t3.js]
//// [t4.js]

View File

@ -0,0 +1,35 @@
=== tests/cases/conformance/es6/modules/t1.ts ===
let as = 100;
>as : Symbol(as, Decl(t1.ts, 1, 3))
export { as as return, as };
>as : Symbol(return, Decl(t1.ts, 3, 8))
>return : Symbol(return, Decl(t1.ts, 3, 8))
>as : Symbol(as, Decl(t1.ts, 3, 22))
=== tests/cases/conformance/es6/modules/t2.ts ===
import * as as from "./t1";
>as : Symbol(as, Decl(t2.ts, 0, 6))
var x = as.as;
>x : Symbol(x, Decl(t2.ts, 1, 3))
>as.as : Symbol(as.as, Decl(t1.ts, 3, 22))
>as : Symbol(as, Decl(t2.ts, 0, 6))
>as : Symbol(as.as, Decl(t1.ts, 3, 22))
var y = as.return;
>y : Symbol(y, Decl(t2.ts, 2, 3))
>as.return : Symbol(as.return, Decl(t1.ts, 3, 8))
>as : Symbol(as, Decl(t2.ts, 0, 6))
>return : Symbol(as.return, Decl(t1.ts, 3, 8))
=== tests/cases/conformance/es6/modules/t3.ts ===
import { as as as } from "./t1";
>as : Symbol(as, Decl(t3.ts, 0, 8))
>as : Symbol(as, Decl(t3.ts, 0, 8))
=== tests/cases/conformance/es6/modules/t4.ts ===
import { as } from "./t1";
>as : Symbol(as, Decl(t4.ts, 0, 8))

View File

@ -0,0 +1,36 @@
=== tests/cases/conformance/es6/modules/t1.ts ===
let as = 100;
>as : number
>100 : number
export { as as return, as };
>as : number
>return : number
>as : number
=== tests/cases/conformance/es6/modules/t2.ts ===
import * as as from "./t1";
>as : typeof as
var x = as.as;
>x : number
>as.as : number
>as : typeof as
>as : number
var y = as.return;
>y : number
>as.return : number
>as : typeof as
>return : number
=== tests/cases/conformance/es6/modules/t3.ts ===
import { as as as } from "./t1";
>as : number
>as : number
=== tests/cases/conformance/es6/modules/t4.ts ===
import { as } from "./t1";
>as : number

View File

@ -0,0 +1,20 @@
// @module: commonjs
// @target: es5
// @filename: t1.ts
let set = {
set foo(x: number) {
}
}
let get = 10;
export { set, get };
// @filename: t2.ts
import * as set from "./t1";
// @filename: t3.ts
import { set as yield } from "./t1";
// @filename: t4.ts
import { get } from "./t1";

View File

@ -0,0 +1,18 @@
// @module: commonjs
// @target: es5
// @filename: t1.ts
let as = 100;
export { as as return, as };
// @filename: t2.ts
import * as as from "./t1";
var x = as.as;
var y = as.return;
// @filename: t3.ts
import { as as as } from "./t1";
// @filename: t4.ts
import { as } from "./t1";