From 9405a03729c61a0b8c225ce2fb838aca5c9fd0b2 Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Mon, 1 Nov 2021 09:58:19 -0700 Subject: [PATCH 1/5] Declare non-const enums if isolatedModules is true --- src/compiler/emitter.ts | 13 ++++++++++++- src/compiler/types.ts | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index d4eff1e0ace5e..c86b76625e792 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -453,6 +453,7 @@ namespace ts { target: compilerOptions.target, sourceMap: compilerOptions.sourceMap, inlineSourceMap: compilerOptions.inlineSourceMap, + isolatedModules: compilerOptions.isolatedModules, extendedDiagnostics: compilerOptions.extendedDiagnostics, onlyPrintJsDocStyle: true, writeBundleFileInfo: !!bundleBuildInfo, @@ -3261,7 +3262,17 @@ namespace ts { } function emitEnumDeclaration(node: EnumDeclaration) { - emitModifiers(node, node.modifiers); + // Elide const modifiers if isolatedModules is true + emitModifiers( + node, + factory.createNodeArray( + filter( + node.modifiers, + modifier => !printerOptions.isolatedModules || modifier.kind !== SyntaxKind.ConstKeyword + ), + node.modifiers?.hasTrailingComma + ) + ); writeKeyword("enum"); writeSpace(); emit(node.name); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 9a32a79f37f78..91f7545c6502c 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -8211,6 +8211,7 @@ namespace ts { /*@internal*/ sourceMap?: boolean; /*@internal*/ inlineSourceMap?: boolean; /*@internal*/ inlineSources?: boolean; + /*@internal*/ isolatedModules?: boolean; /*@internal*/ extendedDiagnostics?: boolean; /*@internal*/ onlyPrintJsDocStyle?: boolean; /*@internal*/ neverAsciiEscape?: boolean; From 42d1408b58e0ddc6b07f1badd03db86e06644c67 Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Thu, 4 Nov 2021 15:51:40 -0700 Subject: [PATCH 2/5] Move from emitter -> transformer --- src/compiler/emitter.ts | 13 +------------ src/compiler/transformers/declarations.ts | 4 ++++ src/compiler/types.ts | 1 - 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index c86b76625e792..d4eff1e0ace5e 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -453,7 +453,6 @@ namespace ts { target: compilerOptions.target, sourceMap: compilerOptions.sourceMap, inlineSourceMap: compilerOptions.inlineSourceMap, - isolatedModules: compilerOptions.isolatedModules, extendedDiagnostics: compilerOptions.extendedDiagnostics, onlyPrintJsDocStyle: true, writeBundleFileInfo: !!bundleBuildInfo, @@ -3262,17 +3261,7 @@ namespace ts { } function emitEnumDeclaration(node: EnumDeclaration) { - // Elide const modifiers if isolatedModules is true - emitModifiers( - node, - factory.createNodeArray( - filter( - node.modifiers, - modifier => !printerOptions.isolatedModules || modifier.kind !== SyntaxKind.ConstKeyword - ), - node.modifiers?.hasTrailingComma - ) - ); + emitModifiers(node, node.modifiers); writeKeyword("enum"); writeSpace(); emit(node.name); diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index 6cea3b85055ee..191e6a81c6996 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -1577,6 +1577,10 @@ namespace ts { mask ^= ModifierFlags.Ambient; additions = ModifierFlags.None; } + // Transform non-ambient const enums -> ambient non-const enums if isolatedModules is true + if (isEnumDeclaration(node) && options.isolatedModules) { + mask ^= ModifierFlags.Const; + } return maskModifierFlags(node, mask, additions); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 91f7545c6502c..9a32a79f37f78 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -8211,7 +8211,6 @@ namespace ts { /*@internal*/ sourceMap?: boolean; /*@internal*/ inlineSourceMap?: boolean; /*@internal*/ inlineSources?: boolean; - /*@internal*/ isolatedModules?: boolean; /*@internal*/ extendedDiagnostics?: boolean; /*@internal*/ onlyPrintJsDocStyle?: boolean; /*@internal*/ neverAsciiEscape?: boolean; From b4dc52b6a2d172d015be5ed039d54043019773b9 Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Thu, 4 Nov 2021 15:54:29 -0700 Subject: [PATCH 3/5] Broaden from isolatedModules -> preserveConstEnums --- src/compiler/transformers/declarations.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index 191e6a81c6996..c50917709b265 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -1577,8 +1577,8 @@ namespace ts { mask ^= ModifierFlags.Ambient; additions = ModifierFlags.None; } - // Transform non-ambient const enums -> ambient non-const enums if isolatedModules is true - if (isEnumDeclaration(node) && options.isolatedModules) { + // Transform non-ambient const enums -> ambient non-const enums if preserveConstEnums is true + if (isEnumDeclaration(node) && shouldPreserveConstEnums(options)) { mask ^= ModifierFlags.Const; } return maskModifierFlags(node, mask, additions); From 04f4bc429107afe08fe0b5f86e81ab5879a8012f Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Wed, 2 Mar 2022 11:45:10 -0700 Subject: [PATCH 4/5] Inline plain enums from referenced projects --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7dddeaac50788..266e651bac3a8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -41629,7 +41629,7 @@ namespace ts { if (symbol && (symbol.flags & SymbolFlags.EnumMember)) { // inline property\index accesses only for const enums const member = symbol.valueDeclaration as EnumMember; - if (isEnumConst(member.parent)) { + if (isEnumConst(member.parent) || host.getProjectReferenceRedirect(getSourceFileOfNode(member).originalFileName)) { return getEnumMemberValue(member); } } From ee3537f5b464e5899e83383175a9c7e5db46bfb1 Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Wed, 2 Mar 2022 13:57:14 -0700 Subject: [PATCH 5/5] Ignore ambient const enums --- src/compiler/transformers/declarations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index c50917709b265..175f08f8b4c9e 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -1578,7 +1578,7 @@ namespace ts { additions = ModifierFlags.None; } // Transform non-ambient const enums -> ambient non-const enums if preserveConstEnums is true - if (isEnumDeclaration(node) && shouldPreserveConstEnums(options)) { + if (!(node.flags & NodeFlags.Ambient) && isEnumDeclaration(node) && shouldPreserveConstEnums(options)) { mask ^= ModifierFlags.Const; } return maskModifierFlags(node, mask, additions);