Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Disallow merging of enum declarations #61262

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
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
2 changes: 1 addition & 1 deletion src/compiler/binder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -830,7 +830,7 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
let messageNeedsName = true;

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

Expand Down
2 changes: 1 addition & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2724,7 +2724,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
function reportMergeSymbolError(target: Symbol, source: Symbol) {
const isEitherEnum = !!(target.flags & SymbolFlags.Enum || source.flags & SymbolFlags.Enum);
const isEitherBlockScoped = !!(target.flags & SymbolFlags.BlockScopedVariable || source.flags & SymbolFlags.BlockScopedVariable);
const message = isEitherEnum ? Diagnostics.Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations
const message = isEitherEnum ? Diagnostics.Enum_declarations_can_only_merge_with_namespace_declarations
: isEitherBlockScoped ? Diagnostics.Cannot_redeclare_block_scoped_variable_0
: Diagnostics.Duplicate_identifier_0;
const sourceSymbolFile = source.declarations && getSourceFileOfNode(source.declarations[0]);
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/diagnosticMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -2864,7 +2864,7 @@
"category": "Error",
"code": 2566
},
"Enum declarations can only merge with namespace or other enum declarations.": {
"Enum declarations can only merge with namespace declarations.": {
"category": "Error",
"code": 2567
},
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5938,7 +5938,7 @@ export const enum SymbolFlags {
FunctionExcludes = Value & ~(Function | ValueModule | Class),
ClassExcludes = (Value | Type) & ~(ValueModule | Interface | Function), // class-interface mergability done in checker.ts
InterfaceExcludes = Type & ~(Interface | Class),
RegularEnumExcludes = (Value | Type) & ~(RegularEnum | ValueModule), // regular enums merge only with regular enums and modules
RegularEnumExcludes = (Value | Type) & ~ValueModule, // regular enums merge only modules
ConstEnumExcludes = (Value | Type) & ~ConstEnum, // const enums merge only with const enums
ValueModuleExcludes = Value & ~(Function | Class | RegularEnum | ValueModule),
NamespaceModuleExcludes = 0,
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/api/typescript.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6489,7 +6489,7 @@ declare namespace ts {
FunctionExcludes = 110991,
ClassExcludes = 899503,
InterfaceExcludes = 788872,
RegularEnumExcludes = 899327,
RegularEnumExcludes = 899583,
ConstEnumExcludes = 899967,
ValueModuleExcludes = 110735,
NamespaceModuleExcludes = 0,
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 @@
augmentedTypesClass.ts(2,7): error TS2300: Duplicate identifier 'c1'.
augmentedTypesClass.ts(3,5): error TS2300: Duplicate identifier 'c1'.
augmentedTypesClass.ts(6,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesClass.ts(7,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesClass.ts(6,7): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesClass.ts(7,6): error TS2567: Enum declarations can only merge with namespace declarations.


==== augmentedTypesClass.ts (4 errors) ====
Expand All @@ -16,7 +16,7 @@ augmentedTypesClass.ts(7,6): error TS2567: Enum declarations can only merge with
//// class then enum
class c4 { public foo() { } }
~~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
!!! error TS2567: Enum declarations can only merge with namespace declarations.
enum c4 { One } // error
~~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
!!! error TS2567: Enum declarations can only merge with namespace 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 @@
augmentedTypesClass2.ts(16,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesClass2.ts(21,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesClass2.ts(16,7): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesClass2.ts(21,6): error TS2567: Enum declarations can only merge with namespace declarations.


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

// class then import
class c44 {
Expand Down
56 changes: 28 additions & 28 deletions tests/baselines/reference/augmentedTypesEnum.errors.txt
Original file line number Diff line number Diff line change
@@ -1,63 +1,63 @@
augmentedTypesEnum.ts(2,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum.ts(3,5): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum.ts(6,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum.ts(7,10): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum.ts(9,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum.ts(10,5): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum.ts(13,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum.ts(14,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum.ts(18,11): error TS2432: In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
augmentedTypesEnum.ts(20,12): error TS2300: Duplicate identifier 'One'.
augmentedTypesEnum.ts(21,12): error TS2300: Duplicate identifier 'One'.
augmentedTypesEnum.ts(21,12): error TS2432: In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
augmentedTypesEnum.ts(2,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(3,5): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(6,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(7,10): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(9,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(10,5): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(13,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(14,7): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(17,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(18,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(20,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum.ts(21,6): error TS2567: Enum declarations can only merge with namespace declarations.


==== augmentedTypesEnum.ts (12 errors) ====
// enum then var
enum e1111 { One } // error
~~~~~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
!!! error TS2567: Enum declarations can only merge with namespace declarations.
var e1111 = 1; // error
~~~~~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
!!! error TS2567: Enum declarations can only merge with namespace declarations.

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

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

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

// enum then enum
enum e5 { One }
~~
!!! error TS2567: Enum declarations can only merge with namespace declarations.
enum e5 { Two } // error
~~~
!!! error TS2432: In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
~~
!!! error TS2567: Enum declarations can only merge with namespace declarations.

enum e5a { One } // error
~~~
!!! error TS2300: Duplicate identifier 'One'.
~~~
!!! error TS2567: Enum declarations can only merge with namespace declarations.
enum e5a { One } // error
~~~
!!! error TS2300: Duplicate identifier 'One'.
~~~
!!! error TS2432: In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
~~~
!!! error TS2567: Enum declarations can only merge with namespace declarations.

// enum then internal module
enum e6 { One }
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/augmentedTypesEnum.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,19 @@ class e4 { public foo() { } } // error

// enum then enum
enum e5 { One }
>e5 : Symbol(e5, Decl(augmentedTypesEnum.ts, 13, 29), Decl(augmentedTypesEnum.ts, 16, 15))
>e5 : Symbol(e5, Decl(augmentedTypesEnum.ts, 13, 29))
>One : Symbol(e5.One, Decl(augmentedTypesEnum.ts, 16, 9))

enum e5 { Two } // error
>e5 : Symbol(e5, Decl(augmentedTypesEnum.ts, 13, 29), Decl(augmentedTypesEnum.ts, 16, 15))
>e5 : Symbol(e5, Decl(augmentedTypesEnum.ts, 16, 15))
>Two : Symbol(e5.Two, Decl(augmentedTypesEnum.ts, 17, 9))

enum e5a { One } // error
>e5a : Symbol(e5a, Decl(augmentedTypesEnum.ts, 17, 15), Decl(augmentedTypesEnum.ts, 19, 16))
>e5a : Symbol(e5a, Decl(augmentedTypesEnum.ts, 17, 15))
>One : Symbol(e5a.One, Decl(augmentedTypesEnum.ts, 19, 10))

enum e5a { One } // error
>e5a : Symbol(e5a, Decl(augmentedTypesEnum.ts, 17, 15), Decl(augmentedTypesEnum.ts, 19, 16))
>e5a : Symbol(e5a, Decl(augmentedTypesEnum.ts, 19, 16))
>One : Symbol(e5a.One, Decl(augmentedTypesEnum.ts, 20, 10))

// enum then internal module
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/augmentedTypesEnum.types
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ enum e5 { One }
enum e5 { Two } // error
>e5 : e5
> : ^^
>Two : e5.One
>Two : e5.Two
> : ^^^^^^

enum e5a { One } // error
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 @@
augmentedTypesEnum2.ts(2,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum2.ts(4,11): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum2.ts(11,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum2.ts(12,7): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesEnum2.ts(2,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum2.ts(4,11): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum2.ts(11,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum2.ts(12,7): error TS2567: Enum declarations can only merge with namespace declarations.


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

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

Expand All @@ -21,10 +21,10 @@ augmentedTypesEnum2.ts(12,7): error TS2567: Enum declarations can only merge wit
// enum then class
enum e2 { One }; // error
~~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
!!! error TS2567: Enum declarations can only merge with namespace declarations.
class e2 { // error
~~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
!!! error TS2567: Enum declarations can only merge with namespace declarations.
foo() {
return 1;
}
Expand Down
14 changes: 10 additions & 4 deletions tests/baselines/reference/augmentedTypesEnum3.errors.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
augmentedTypesEnum3.ts(16,5): error TS2432: In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
augmentedTypesEnum3.ts(9,8): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum3.ts(12,6): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesEnum3.ts(15,6): error TS2567: Enum declarations can only merge with namespace declarations.


==== augmentedTypesEnum3.ts (1 errors) ====
==== augmentedTypesEnum3.ts (3 errors) ====
module E {
var t;
}
Expand All @@ -11,15 +13,19 @@ augmentedTypesEnum3.ts(16,5): error TS2432: In an enum with multiple declaration
module F { var t; }

module A {
~
!!! error TS2567: Enum declarations can only merge with namespace declarations.
var o;
}
enum A {
~
!!! error TS2567: Enum declarations can only merge with namespace declarations.
b
}
enum A {
~
!!! error TS2567: Enum declarations can only merge with namespace declarations.
c
~
!!! error TS2432: In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
}
module A {
var p;
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/augmentedTypesEnum3.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,25 @@ module F { var t; }
>t : Symbol(t, Decl(augmentedTypesEnum3.ts, 6, 14))

module A {
>A : Symbol(A, Decl(augmentedTypesEnum3.ts, 6, 19), Decl(augmentedTypesEnum3.ts, 10, 1), Decl(augmentedTypesEnum3.ts, 13, 1), Decl(augmentedTypesEnum3.ts, 16, 1))
>A : Symbol(A, Decl(augmentedTypesEnum3.ts, 6, 19), Decl(augmentedTypesEnum3.ts, 10, 1), Decl(augmentedTypesEnum3.ts, 16, 1))

var o;
>o : Symbol(o, Decl(augmentedTypesEnum3.ts, 9, 7))
}
enum A {
>A : Symbol(A, Decl(augmentedTypesEnum3.ts, 6, 19), Decl(augmentedTypesEnum3.ts, 10, 1), Decl(augmentedTypesEnum3.ts, 13, 1), Decl(augmentedTypesEnum3.ts, 16, 1))
>A : Symbol(A, Decl(augmentedTypesEnum3.ts, 6, 19), Decl(augmentedTypesEnum3.ts, 10, 1), Decl(augmentedTypesEnum3.ts, 16, 1))

b
>b : Symbol(A.b, Decl(augmentedTypesEnum3.ts, 11, 8))
}
enum A {
>A : Symbol(A, Decl(augmentedTypesEnum3.ts, 6, 19), Decl(augmentedTypesEnum3.ts, 10, 1), Decl(augmentedTypesEnum3.ts, 13, 1), Decl(augmentedTypesEnum3.ts, 16, 1))
>A : Symbol(A, Decl(augmentedTypesEnum3.ts, 13, 1))

c
>c : Symbol(A.c, Decl(augmentedTypesEnum3.ts, 14, 8))
}
module A {
>A : Symbol(A, Decl(augmentedTypesEnum3.ts, 6, 19), Decl(augmentedTypesEnum3.ts, 10, 1), Decl(augmentedTypesEnum3.ts, 13, 1), Decl(augmentedTypesEnum3.ts, 16, 1))
>A : Symbol(A, Decl(augmentedTypesEnum3.ts, 6, 19), Decl(augmentedTypesEnum3.ts, 10, 1), Decl(augmentedTypesEnum3.ts, 16, 1))

var p;
>p : Symbol(p, Decl(augmentedTypesEnum3.ts, 18, 7))
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/augmentedTypesEnum3.types
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ enum A {
> : ^

c
>c : A.b
>c : A.c
> : ^^^
}
module A {
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 @@ augmentedTypesFunction.ts(13,10): error TS2814: Function with bodies can only me
augmentedTypesFunction.ts(14,7): error TS2813: Class declaration cannot implement overload list for 'y3'.
augmentedTypesFunction.ts(16,10): error TS2814: Function with bodies can only merge with classes that are ambient.
augmentedTypesFunction.ts(17,7): error TS2813: Class declaration cannot implement overload list for 'y3a'.
augmentedTypesFunction.ts(20,10): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesFunction.ts(21,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesFunction.ts(20,10): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesFunction.ts(21,6): error TS2567: Enum declarations can only merge with namespace declarations.


==== augmentedTypesFunction.ts (12 errors) ====
Expand Down Expand Up @@ -58,10 +58,10 @@ augmentedTypesFunction.ts(21,6): error TS2567: Enum declarations can only merge
// function then enum
function y4() { } // error
~~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
!!! error TS2567: Enum declarations can only merge with namespace declarations.
enum y4 { One } // error
~~
!!! error TS2567: Enum declarations can only merge with namespace or other enum declarations.
!!! error TS2567: Enum declarations can only merge with namespace 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 @@
augmentedTypesInterface.ts(23,11): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesInterface.ts(26,6): error TS2567: Enum declarations can only merge with namespace or other enum declarations.
augmentedTypesInterface.ts(23,11): error TS2567: Enum declarations can only merge with namespace declarations.
augmentedTypesInterface.ts(26,6): error TS2567: Enum declarations can only merge with namespace declarations.


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

// interface then import
interface i4 {
Expand Down
Loading