From 8f9724811d4920600a2660e2e45fb3b372bc584f Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Mon, 25 Sep 2017 13:07:44 -0700 Subject: [PATCH] Add fix for crash in #18712 (#18751) --- src/compiler/checker.ts | 5 +- ...owImportClausesToMergeWithTypes.errors.txt | 34 +++++++++++ .../allowImportClausesToMergeWithTypes.js | 49 ++++++++++++++++ ...allowImportClausesToMergeWithTypes.symbols | 51 ++++++++++++++++ .../allowImportClausesToMergeWithTypes.types | 58 +++++++++++++++++++ .../allowImportClausesToMergeWithTypes.ts | 26 +++++++++ 6 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/allowImportClausesToMergeWithTypes.errors.txt create mode 100644 tests/baselines/reference/allowImportClausesToMergeWithTypes.js create mode 100644 tests/baselines/reference/allowImportClausesToMergeWithTypes.symbols create mode 100644 tests/baselines/reference/allowImportClausesToMergeWithTypes.types create mode 100644 tests/cases/compiler/allowImportClausesToMergeWithTypes.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index eb8adb84072..18232280730 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19274,10 +19274,11 @@ namespace ts { : DeclarationSpaces.ExportNamespace; case SyntaxKind.ClassDeclaration: case SyntaxKind.EnumDeclaration: - // A NamespaceImport declares an Alias, which is allowed to merge with other values within the module - case SyntaxKind.NamespaceImport: return DeclarationSpaces.ExportType | DeclarationSpaces.ExportValue; + // The below options all declare an Alias, which is allowed to merge with other values within the importing module case SyntaxKind.ImportEqualsDeclaration: + case SyntaxKind.NamespaceImport: + case SyntaxKind.ImportClause: let result = DeclarationSpaces.None; const target = resolveAlias(getSymbolOfNode(d)); forEach(target.declarations, d => { result |= getDeclarationSpaces(d); }); diff --git a/tests/baselines/reference/allowImportClausesToMergeWithTypes.errors.txt b/tests/baselines/reference/allowImportClausesToMergeWithTypes.errors.txt new file mode 100644 index 00000000000..684921ae126 --- /dev/null +++ b/tests/baselines/reference/allowImportClausesToMergeWithTypes.errors.txt @@ -0,0 +1,34 @@ +tests/cases/compiler/index.ts(4,1): error TS2693: 'zzz' only refers to a type, but is being used as a value here. +tests/cases/compiler/index.ts(9,10): error TS2304: Cannot find name 'originalZZZ'. + + +==== tests/cases/compiler/b.ts (0 errors) ==== + export const zzz = 123; + export default zzz; + +==== tests/cases/compiler/a.ts (0 errors) ==== + export default interface zzz { + x: string; + } + + import zzz from "./b"; + + const x: zzz = { x: "" }; + zzz; + + export { zzz as default }; + +==== tests/cases/compiler/index.ts (2 errors) ==== + import zzz from "./a"; + + const x: zzz = { x: "" }; + zzz; + ~~~ +!!! error TS2693: 'zzz' only refers to a type, but is being used as a value here. + + import originalZZZ from "./b"; + originalZZZ; + + const y: originalZZZ = x; + ~~~~~~~~~~~ +!!! error TS2304: Cannot find name 'originalZZZ'. \ No newline at end of file diff --git a/tests/baselines/reference/allowImportClausesToMergeWithTypes.js b/tests/baselines/reference/allowImportClausesToMergeWithTypes.js new file mode 100644 index 00000000000..1679fa10372 --- /dev/null +++ b/tests/baselines/reference/allowImportClausesToMergeWithTypes.js @@ -0,0 +1,49 @@ +//// [tests/cases/compiler/allowImportClausesToMergeWithTypes.ts] //// + +//// [b.ts] +export const zzz = 123; +export default zzz; + +//// [a.ts] +export default interface zzz { + x: string; +} + +import zzz from "./b"; + +const x: zzz = { x: "" }; +zzz; + +export { zzz as default }; + +//// [index.ts] +import zzz from "./a"; + +const x: zzz = { x: "" }; +zzz; + +import originalZZZ from "./b"; +originalZZZ; + +const y: originalZZZ = x; + +//// [b.js] +"use strict"; +exports.__esModule = true; +exports.zzz = 123; +exports["default"] = exports.zzz; +//// [a.js] +"use strict"; +exports.__esModule = true; +var b_1 = require("./b"); +exports["default"] = b_1["default"]; +var x = { x: "" }; +b_1["default"]; +//// [index.js] +"use strict"; +exports.__esModule = true; +var x = { x: "" }; +zzz; +var b_1 = require("./b"); +b_1["default"]; +var y = x; diff --git a/tests/baselines/reference/allowImportClausesToMergeWithTypes.symbols b/tests/baselines/reference/allowImportClausesToMergeWithTypes.symbols new file mode 100644 index 00000000000..2195912a395 --- /dev/null +++ b/tests/baselines/reference/allowImportClausesToMergeWithTypes.symbols @@ -0,0 +1,51 @@ +=== tests/cases/compiler/b.ts === +export const zzz = 123; +>zzz : Symbol(zzz, Decl(b.ts, 0, 12)) + +export default zzz; +>zzz : Symbol(zzz, Decl(b.ts, 0, 12)) + +=== tests/cases/compiler/a.ts === +export default interface zzz { +>zzz : Symbol(zzz, Decl(a.ts, 0, 0), Decl(a.ts, 9, 8)) + + x: string; +>x : Symbol(zzz.x, Decl(a.ts, 0, 30)) +} + +import zzz from "./b"; +>zzz : Symbol(zzz, Decl(a.ts, 0, 0), Decl(a.ts, 4, 6)) + +const x: zzz = { x: "" }; +>x : Symbol(x, Decl(a.ts, 6, 5)) +>zzz : Symbol(zzz, Decl(a.ts, 0, 0), Decl(a.ts, 9, 8)) +>x : Symbol(x, Decl(a.ts, 6, 16)) + +zzz; +>zzz : Symbol(zzz, Decl(a.ts, 0, 0), Decl(a.ts, 4, 6)) + +export { zzz as default }; +>zzz : Symbol(zzz, Decl(a.ts, 0, 0), Decl(a.ts, 9, 8)) +>default : Symbol(zzz, Decl(a.ts, 0, 0), Decl(a.ts, 9, 8)) + +=== tests/cases/compiler/index.ts === +import zzz from "./a"; +>zzz : Symbol(zzz, Decl(index.ts, 0, 6)) + +const x: zzz = { x: "" }; +>x : Symbol(x, Decl(index.ts, 2, 5)) +>zzz : Symbol(zzz, Decl(index.ts, 0, 6)) +>x : Symbol(x, Decl(index.ts, 2, 16)) + +zzz; + +import originalZZZ from "./b"; +>originalZZZ : Symbol(originalZZZ, Decl(index.ts, 5, 6)) + +originalZZZ; +>originalZZZ : Symbol(originalZZZ, Decl(index.ts, 5, 6)) + +const y: originalZZZ = x; +>y : Symbol(y, Decl(index.ts, 8, 5)) +>x : Symbol(x, Decl(index.ts, 2, 5)) + diff --git a/tests/baselines/reference/allowImportClausesToMergeWithTypes.types b/tests/baselines/reference/allowImportClausesToMergeWithTypes.types new file mode 100644 index 00000000000..89d6a416ff3 --- /dev/null +++ b/tests/baselines/reference/allowImportClausesToMergeWithTypes.types @@ -0,0 +1,58 @@ +=== tests/cases/compiler/b.ts === +export const zzz = 123; +>zzz : 123 +>123 : 123 + +export default zzz; +>zzz : 123 + +=== tests/cases/compiler/a.ts === +export default interface zzz { +>zzz : zzz + + x: string; +>x : string +} + +import zzz from "./b"; +>zzz : 123 + +const x: zzz = { x: "" }; +>x : zzz +>zzz : zzz +>{ x: "" } : { x: string; } +>x : string +>"" : "" + +zzz; +>zzz : 123 + +export { zzz as default }; +>zzz : 123 +>default : 123 + +=== tests/cases/compiler/index.ts === +import zzz from "./a"; +>zzz : any + +const x: zzz = { x: "" }; +>x : zzz +>zzz : zzz +>{ x: "" } : { x: string; } +>x : string +>"" : "" + +zzz; +>zzz : any + +import originalZZZ from "./b"; +>originalZZZ : 123 + +originalZZZ; +>originalZZZ : 123 + +const y: originalZZZ = x; +>y : any +>originalZZZ : No type information available! +>x : zzz + diff --git a/tests/cases/compiler/allowImportClausesToMergeWithTypes.ts b/tests/cases/compiler/allowImportClausesToMergeWithTypes.ts new file mode 100644 index 00000000000..caa51419801 --- /dev/null +++ b/tests/cases/compiler/allowImportClausesToMergeWithTypes.ts @@ -0,0 +1,26 @@ +// @filename: b.ts +export const zzz = 123; +export default zzz; + +// @filename: a.ts +export default interface zzz { + x: string; +} + +import zzz from "./b"; + +const x: zzz = { x: "" }; +zzz; + +export { zzz as default }; + +// @filename: index.ts +import zzz from "./a"; + +const x: zzz = { x: "" }; +zzz; + +import originalZZZ from "./b"; +originalZZZ; + +const y: originalZZZ = x; \ No newline at end of file