From 9ef9bb04f16b6ade4059c70fa71bce9ab115a7dc Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Fri, 24 Jan 2020 15:00:15 -0800 Subject: [PATCH] Fix crash on erroneous enum member merged with exported type alias (#36429) --- src/compiler/checker.ts | 1 + ...rMergedWithExportedAliasIsError.errors.txt | 23 ++++++++++++++++ ...numMemberMergedWithExportedAliasIsError.js | 26 +++++++++++++++++++ ...mberMergedWithExportedAliasIsError.symbols | 22 ++++++++++++++++ ...MemberMergedWithExportedAliasIsError.types | 22 ++++++++++++++++ ...numMemberMergedWithExportedAliasIsError.ts | 11 ++++++++ 6 files changed, 105 insertions(+) create mode 100644 tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.errors.txt create mode 100644 tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.js create mode 100644 tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.symbols create mode 100644 tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.types create mode 100644 tests/cases/compiler/importedEnumMemberMergedWithExportedAliasIsError.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6e70c19e005..602a37992b4 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -29266,6 +29266,7 @@ namespace ts { : DeclarationSpaces.ExportNamespace; case SyntaxKind.ClassDeclaration: case SyntaxKind.EnumDeclaration: + case SyntaxKind.EnumMember: return DeclarationSpaces.ExportType | DeclarationSpaces.ExportValue; case SyntaxKind.SourceFile: return DeclarationSpaces.ExportType | DeclarationSpaces.ExportValue | DeclarationSpaces.ExportNamespace; diff --git a/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.errors.txt b/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.errors.txt new file mode 100644 index 00000000000..4df69decd77 --- /dev/null +++ b/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.errors.txt @@ -0,0 +1,23 @@ +tests/cases/compiler/alias.ts(3,1): error TS2440: Import declaration conflicts with local declaration of 'EnumA'. +tests/cases/compiler/alias.ts(3,8): error TS2395: Individual declarations in merged declaration 'EnumA' must be all exported or all local. +tests/cases/compiler/alias.ts(5,13): error TS2395: Individual declarations in merged declaration 'EnumA' must be all exported or all local. + + +==== tests/cases/compiler/enum.ts (0 errors) ==== + export enum Enum { + A, + B + } +==== tests/cases/compiler/alias.ts (3 errors) ==== + import {Enum} from "./enum"; + + import EnumA = Enum.A; + ~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2440: Import declaration conflicts with local declaration of 'EnumA'. + ~~~~~ +!!! error TS2395: Individual declarations in merged declaration 'EnumA' must be all exported or all local. + + export type EnumA = [string] | [string, number]; + ~~~~~ +!!! error TS2395: Individual declarations in merged declaration 'EnumA' must be all exported or all local. + \ No newline at end of file diff --git a/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.js b/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.js new file mode 100644 index 00000000000..c0d5954b9a8 --- /dev/null +++ b/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.js @@ -0,0 +1,26 @@ +//// [tests/cases/compiler/importedEnumMemberMergedWithExportedAliasIsError.ts] //// + +//// [enum.ts] +export enum Enum { + A, + B +} +//// [alias.ts] +import {Enum} from "./enum"; + +import EnumA = Enum.A; + +export type EnumA = [string] | [string, number]; + + +//// [enum.js] +"use strict"; +exports.__esModule = true; +var Enum; +(function (Enum) { + Enum[Enum["A"] = 0] = "A"; + Enum[Enum["B"] = 1] = "B"; +})(Enum = exports.Enum || (exports.Enum = {})); +//// [alias.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.symbols b/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.symbols new file mode 100644 index 00000000000..0c15c51bba1 --- /dev/null +++ b/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/enum.ts === +export enum Enum { +>Enum : Symbol(Enum, Decl(enum.ts, 0, 0)) + + A, +>A : Symbol(Enum.A, Decl(enum.ts, 0, 18)) + + B +>B : Symbol(Enum.B, Decl(enum.ts, 1, 6)) +} +=== tests/cases/compiler/alias.ts === +import {Enum} from "./enum"; +>Enum : Symbol(Enum, Decl(alias.ts, 0, 8)) + +import EnumA = Enum.A; +>EnumA : Symbol(EnumA, Decl(alias.ts, 0, 28), Decl(alias.ts, 2, 22)) +>Enum : Symbol(Enum, Decl(alias.ts, 0, 8)) +>A : Symbol(Enum.A, Decl(enum.ts, 0, 18)) + +export type EnumA = [string] | [string, number]; +>EnumA : Symbol(EnumA, Decl(alias.ts, 2, 22)) + diff --git a/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.types b/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.types new file mode 100644 index 00000000000..a1b9f895e9a --- /dev/null +++ b/tests/baselines/reference/importedEnumMemberMergedWithExportedAliasIsError.types @@ -0,0 +1,22 @@ +=== tests/cases/compiler/enum.ts === +export enum Enum { +>Enum : Enum + + A, +>A : Enum.A + + B +>B : Enum.B +} +=== tests/cases/compiler/alias.ts === +import {Enum} from "./enum"; +>Enum : typeof Enum + +import EnumA = Enum.A; +>EnumA : Enum.A +>Enum : Enum +>A : Enum.A + +export type EnumA = [string] | [string, number]; +>EnumA : import("tests/cases/compiler/alias").EnumA + diff --git a/tests/cases/compiler/importedEnumMemberMergedWithExportedAliasIsError.ts b/tests/cases/compiler/importedEnumMemberMergedWithExportedAliasIsError.ts new file mode 100644 index 00000000000..21e5cab094f --- /dev/null +++ b/tests/cases/compiler/importedEnumMemberMergedWithExportedAliasIsError.ts @@ -0,0 +1,11 @@ +// @filename: enum.ts +export enum Enum { + A, + B +} +// @filename: alias.ts +import {Enum} from "./enum"; + +import EnumA = Enum.A; + +export type EnumA = [string] | [string, number];