Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/compiler/binder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,10 @@ namespace ts {
? Diagnostics.Cannot_redeclare_block_scoped_variable_0
: Diagnostics.Duplicate_identifier_0;

if (symbol.flags & SymbolFlags.Enum || includes & SymbolFlags.Enum) {
message = Diagnostics.Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations;
}

if (symbol.declarations && symbol.declarations.length) {
// If the current node is a default export of some sort, then check if
// there are any other default exports that we need to error on.
Expand Down
7 changes: 5 additions & 2 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -847,8 +847,11 @@ namespace ts {
error(getNameOfDeclaration(source.declarations[0]), Diagnostics.Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity, symbolToString(target));
}
else {
const message = target.flags & SymbolFlags.BlockScopedVariable || source.flags & SymbolFlags.BlockScopedVariable
? Diagnostics.Cannot_redeclare_block_scoped_variable_0 : Diagnostics.Duplicate_identifier_0;
const message = target.flags & SymbolFlags.Enum || source.flags & SymbolFlags.Enum
? Diagnostics.Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations
: target.flags & SymbolFlags.BlockScopedVariable || source.flags & SymbolFlags.BlockScopedVariable
? Diagnostics.Cannot_redeclare_block_scoped_variable_0
: Diagnostics.Duplicate_identifier_0;
forEach(source.declarations, node => {
error(getNameOfDeclaration(node) || node, message, symbolToString(source));
});
Expand Down
5 changes: 5 additions & 0 deletions src/compiler/diagnosticMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -1980,6 +1980,11 @@
"category": "Error",
"code": 2566
},
"Enum declarations can only merge with namespace or other enum declarations.": {
"category": "Error",
"code": 2567
},

"JSX element attributes type '{0}' may not be a union type.": {
"category": "Error",
"code": 2600
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/augmentedTypesClass.errors.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
tests/cases/compiler/augmentedTypesClass.ts(2,7): error TS2300: Duplicate identifier 'c1'.
tests/cases/compiler/augmentedTypesClass.ts(3,5): error TS2300: Duplicate identifier 'c1'.
tests/cases/compiler/augmentedTypesClass.ts(6,7): error TS2300: Duplicate identifier 'c4'.
tests/cases/compiler/augmentedTypesClass.ts(7,6): error TS2300: Duplicate identifier 'c4'.
tests/cases/compiler/augmentedTypesClass.ts(6,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesClass.ts(7,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.


==== tests/cases/compiler/augmentedTypesClass.ts (4 errors) ====
Expand All @@ -16,7 +16,7 @@ tests/cases/compiler/augmentedTypesClass.ts(7,6): error TS2300: Duplicate identi
//// class then enum
class c4 { public foo() { } }
~~
!!! error TS2300: Duplicate identifier 'c4'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
enum c4 { One } // error
~~
!!! error TS2300: Duplicate identifier 'c4'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
8 changes: 4 additions & 4 deletions tests/baselines/reference/augmentedTypesClass2.errors.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
tests/cases/compiler/augmentedTypesClass2.ts(16,7): error TS2300: Duplicate identifier 'c33'.
tests/cases/compiler/augmentedTypesClass2.ts(21,6): error TS2300: Duplicate identifier 'c33'.
tests/cases/compiler/augmentedTypesClass2.ts(16,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesClass2.ts(21,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.


==== tests/cases/compiler/augmentedTypesClass2.ts (2 errors) ====
Expand All @@ -20,14 +20,14 @@ tests/cases/compiler/augmentedTypesClass2.ts(21,6): error TS2300: Duplicate iden
// class then enum
class c33 {
~~~
!!! error TS2300: Duplicate identifier 'c33'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
foo() {
return 1;
}
}
enum c33 { One };
~~~
!!! error TS2300: Duplicate identifier 'c33'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

// class then import
class c44 {
Expand Down
32 changes: 16 additions & 16 deletions tests/baselines/reference/augmentedTypesEnum.errors.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
tests/cases/compiler/augmentedTypesEnum.ts(2,6): error TS2300: Duplicate identifier 'e1111'.
tests/cases/compiler/augmentedTypesEnum.ts(3,5): error TS2300: Duplicate identifier 'e1111'.
tests/cases/compiler/augmentedTypesEnum.ts(6,6): error TS2300: Duplicate identifier 'e2'.
tests/cases/compiler/augmentedTypesEnum.ts(7,10): error TS2300: Duplicate identifier 'e2'.
tests/cases/compiler/augmentedTypesEnum.ts(9,6): error TS2300: Duplicate identifier 'e3'.
tests/cases/compiler/augmentedTypesEnum.ts(10,5): error TS2300: Duplicate identifier 'e3'.
tests/cases/compiler/augmentedTypesEnum.ts(13,6): error TS2300: Duplicate identifier 'e4'.
tests/cases/compiler/augmentedTypesEnum.ts(14,7): error TS2300: Duplicate identifier 'e4'.
tests/cases/compiler/augmentedTypesEnum.ts(2,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum.ts(3,5): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum.ts(6,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum.ts(7,10): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum.ts(9,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum.ts(10,5): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum.ts(13,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum.ts(14,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum.ts(18,11): error TS2432: In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
tests/cases/compiler/augmentedTypesEnum.ts(20,12): error TS2300: Duplicate identifier 'One'.
tests/cases/compiler/augmentedTypesEnum.ts(21,12): error TS2300: Duplicate identifier 'One'.
Expand All @@ -16,33 +16,33 @@ tests/cases/compiler/augmentedTypesEnum.ts(21,12): error TS2432: In an enum with
// enum then var
enum e1111 { One } // error
~~~~~
!!! error TS2300: Duplicate identifier 'e1111'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
var e1111 = 1; // error
~~~~~
!!! error TS2300: Duplicate identifier 'e1111'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

// enum then function
enum e2 { One } // error
~~
!!! error TS2300: Duplicate identifier 'e2'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
function e2() { } // error
~~
!!! error TS2300: Duplicate identifier 'e2'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

enum e3 { One } // error
~~
!!! error TS2300: Duplicate identifier 'e3'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
var e3 = () => { } // error
~~
!!! error TS2300: Duplicate identifier 'e3'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

// enum then class
enum e4 { One } // error
~~
!!! error TS2300: Duplicate identifier 'e4'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
class e4 { public foo() { } } // error
~~
!!! error TS2300: Duplicate identifier 'e4'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

// enum then enum
enum e5 { One }
Expand Down
16 changes: 8 additions & 8 deletions tests/baselines/reference/augmentedTypesEnum2.errors.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
tests/cases/compiler/augmentedTypesEnum2.ts(2,6): error TS2300: Duplicate identifier 'e1'.
tests/cases/compiler/augmentedTypesEnum2.ts(4,11): error TS2300: Duplicate identifier 'e1'.
tests/cases/compiler/augmentedTypesEnum2.ts(11,6): error TS2300: Duplicate identifier 'e2'.
tests/cases/compiler/augmentedTypesEnum2.ts(12,7): error TS2300: Duplicate identifier 'e2'.
tests/cases/compiler/augmentedTypesEnum2.ts(2,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum2.ts(4,11): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum2.ts(11,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesEnum2.ts(12,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.


==== tests/cases/compiler/augmentedTypesEnum2.ts (4 errors) ====
// enum then interface
enum e1 { One } // error
~~
!!! error TS2300: Duplicate identifier 'e1'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

interface e1 { // error
~~
!!! error TS2300: Duplicate identifier 'e1'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
foo(): void;
}

Expand All @@ -21,10 +21,10 @@ tests/cases/compiler/augmentedTypesEnum2.ts(12,7): error TS2300: Duplicate ident
// enum then class
enum e2 { One }; // error
~~
!!! error TS2300: Duplicate identifier 'e2'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
class e2 { // error
~~
!!! error TS2300: Duplicate identifier 'e2'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
foo() {
return 1;
}
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/augmentedTypesFunction.errors.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ tests/cases/compiler/augmentedTypesFunction.ts(13,10): error TS2300: Duplicate i
tests/cases/compiler/augmentedTypesFunction.ts(14,7): error TS2300: Duplicate identifier 'y3'.
tests/cases/compiler/augmentedTypesFunction.ts(16,10): error TS2300: Duplicate identifier 'y3a'.
tests/cases/compiler/augmentedTypesFunction.ts(17,7): error TS2300: Duplicate identifier 'y3a'.
tests/cases/compiler/augmentedTypesFunction.ts(20,10): error TS2300: Duplicate identifier 'y4'.
tests/cases/compiler/augmentedTypesFunction.ts(21,6): error TS2300: Duplicate identifier 'y4'.
tests/cases/compiler/augmentedTypesFunction.ts(20,10): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesFunction.ts(21,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.


==== tests/cases/compiler/augmentedTypesFunction.ts (12 errors) ====
Expand Down Expand Up @@ -54,10 +54,10 @@ tests/cases/compiler/augmentedTypesFunction.ts(21,6): error TS2300: Duplicate id
// function then enum
function y4() { } // error
~~
!!! error TS2300: Duplicate identifier 'y4'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
enum y4 { One } // error
~~
!!! error TS2300: Duplicate identifier 'y4'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

// function then internal module
function y5() { }
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/augmentedTypesInterface.errors.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
tests/cases/compiler/augmentedTypesInterface.ts(23,11): error TS2300: Duplicate identifier 'i3'.
tests/cases/compiler/augmentedTypesInterface.ts(26,6): error TS2300: Duplicate identifier 'i3'.
tests/cases/compiler/augmentedTypesInterface.ts(23,11): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesInterface.ts(26,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.


==== tests/cases/compiler/augmentedTypesInterface.ts (2 errors) ====
Expand Down Expand Up @@ -27,12 +27,12 @@ tests/cases/compiler/augmentedTypesInterface.ts(26,6): error TS2300: Duplicate i
// interface then enum
interface i3 { // error
~~
!!! error TS2300: Duplicate identifier 'i3'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
foo(): void;
}
enum i3 { One }; // error
~~
!!! error TS2300: Duplicate identifier 'i3'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

// interface then import
interface i4 {
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/augmentedTypesVar.errors.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ tests/cases/compiler/augmentedTypesVar.ts(13,5): error TS2300: Duplicate identif
tests/cases/compiler/augmentedTypesVar.ts(14,7): error TS2300: Duplicate identifier 'x4'.
tests/cases/compiler/augmentedTypesVar.ts(16,5): error TS2300: Duplicate identifier 'x4a'.
tests/cases/compiler/augmentedTypesVar.ts(17,7): error TS2300: Duplicate identifier 'x4a'.
tests/cases/compiler/augmentedTypesVar.ts(20,5): error TS2300: Duplicate identifier 'x5'.
tests/cases/compiler/augmentedTypesVar.ts(21,6): error TS2300: Duplicate identifier 'x5'.
tests/cases/compiler/augmentedTypesVar.ts(20,5): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesVar.ts(21,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/augmentedTypesVar.ts(27,5): error TS2300: Duplicate identifier 'x6a'.
tests/cases/compiler/augmentedTypesVar.ts(28,8): error TS2300: Duplicate identifier 'x6a'.
tests/cases/compiler/augmentedTypesVar.ts(30,5): error TS2300: Duplicate identifier 'x6b'.
Expand Down Expand Up @@ -49,10 +49,10 @@ tests/cases/compiler/augmentedTypesVar.ts(31,8): error TS2300: Duplicate identif
// var then enum
var x5 = 1;
~~
!!! error TS2300: Duplicate identifier 'x5'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
enum x5 { One } // error
~~
!!! error TS2300: Duplicate identifier 'x5'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

// var then module
var x6 = 1;
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/constEnumErrors.errors.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
tests/cases/compiler/constEnumErrors.ts(1,12): error TS2300: Duplicate identifier 'E'.
tests/cases/compiler/constEnumErrors.ts(5,8): error TS2300: Duplicate identifier 'E'.
tests/cases/compiler/constEnumErrors.ts(1,12): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/constEnumErrors.ts(5,8): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/constEnumErrors.ts(12,9): error TS2651: A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.
tests/cases/compiler/constEnumErrors.ts(14,9): error TS2474: In 'const' enum declarations member initializer must be constant expression.
tests/cases/compiler/constEnumErrors.ts(15,10): error TS2474: In 'const' enum declarations member initializer must be constant expression.
Expand All @@ -16,13 +16,13 @@ tests/cases/compiler/constEnumErrors.ts(42,9): error TS2478: 'const' enum member
==== tests/cases/compiler/constEnumErrors.ts (13 errors) ====
const enum E {
~
!!! error TS2300: Duplicate identifier 'E'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
A
}

module E {
~
!!! error TS2300: Duplicate identifier 'E'.
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
var x = 1;
}

Expand Down
69 changes: 69 additions & 0 deletions tests/baselines/reference/duplicateIdentifierEnum.errors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
tests/cases/compiler/duplicateIdentifierEnum_A.ts(2,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_A.ts(5,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_A.ts(9,11): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_A.ts(12,12): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_A.ts(16,12): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_A.ts(19,10): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_A.ts(23,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_A.ts(26,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_B.ts(1,10): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
tests/cases/compiler/duplicateIdentifierEnum_B.ts(4,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.


==== tests/cases/compiler/duplicateIdentifierEnum_A.ts (8 errors) ====
// Test the error message when attempting to merge an enum with a class, an interface, or a function.
enum A {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
bar
}
class A {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
foo: number;
}

interface B {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
foo: number;
}
const enum B {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
bar
}

const enum C {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.

}
function C() {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
return 0;
}

enum D {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
bar
}
class E {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
foo: number;
}
// also make sure the error appears when trying to merge an enum in a separate file.
==== tests/cases/compiler/duplicateIdentifierEnum_B.ts (2 errors) ====
function D() {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
return 0;
}
enum E {
~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
bar
}
Loading