Skip to content

Commit b51a9d2

Browse files
committed
Use same condition in isReferencedAliasDeclaration as isAliasResolvedToValue (microsoft#28171)
1 parent 9733858 commit b51a9d2

File tree

5 files changed

+449
-1
lines changed

5 files changed

+449
-1
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28274,7 +28274,8 @@ namespace ts {
2827428274
return true;
2827528275
}
2827628276
const target = getSymbolLinks(symbol!).target; // TODO: GH#18217
28277-
if (target && getModifierFlags(node) & ModifierFlags.Export && target.flags & SymbolFlags.Value) {
28277+
if (target && getModifierFlags(node) & ModifierFlags.Export &&
28278+
target.flags & SymbolFlags.Value && (compilerOptions.preserveConstEnums || !isConstEnumOrConstEnumOnlyModule(target))) {
2827828279
// An `export import ... =` of a value symbol is always considered referenced
2827928280
return true;
2828028281
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
//// [exportImportCanSubstituteConstEnumForValue.ts]
2+
module MsPortalFx.ViewModels.Dialogs {
3+
4+
export const enum DialogResult {
5+
Abort,
6+
Cancel,
7+
Ignore,
8+
No,
9+
Ok,
10+
Retry,
11+
Yes,
12+
}
13+
14+
export interface DialogResultCallback {
15+
(result: MsPortalFx.ViewModels.Dialogs.DialogResult): void;
16+
}
17+
18+
export function someExportedFunction() {
19+
}
20+
21+
export const enum MessageBoxButtons {
22+
AbortRetryIgnore,
23+
OK,
24+
OKCancel,
25+
RetryCancel,
26+
YesNo,
27+
YesNoCancel,
28+
}
29+
}
30+
31+
32+
module MsPortalFx.ViewModels {
33+
34+
/**
35+
* For some reason javascript code is emitted for this re-exported const enum.
36+
*/
37+
export import ReExportedEnum = Dialogs.DialogResult;
38+
39+
/**
40+
* Not exported to show difference. No javascript is emmitted (as expected)
41+
*/
42+
import DialogButtons = Dialogs.MessageBoxButtons;
43+
44+
/**
45+
* Re-exporting a function type to show difference. No javascript is emmitted (as expected)
46+
*/
47+
export import Callback = Dialogs.DialogResultCallback;
48+
49+
export class SomeUsagesOfTheseConsts {
50+
constructor() {
51+
// these do get replaced by the const value
52+
const value1 = ReExportedEnum.Cancel;
53+
console.log(value1);
54+
const value2 = DialogButtons.OKCancel;
55+
console.log(value2);
56+
}
57+
}
58+
}
59+
60+
61+
//// [exportImportCanSubstituteConstEnumForValue.js]
62+
var MsPortalFx;
63+
(function (MsPortalFx) {
64+
var ViewModels;
65+
(function (ViewModels) {
66+
var Dialogs;
67+
(function (Dialogs) {
68+
function someExportedFunction() {
69+
}
70+
Dialogs.someExportedFunction = someExportedFunction;
71+
})(Dialogs = ViewModels.Dialogs || (ViewModels.Dialogs = {}));
72+
})(ViewModels = MsPortalFx.ViewModels || (MsPortalFx.ViewModels = {}));
73+
})(MsPortalFx || (MsPortalFx = {}));
74+
(function (MsPortalFx) {
75+
var ViewModels;
76+
(function (ViewModels) {
77+
var SomeUsagesOfTheseConsts = /** @class */ (function () {
78+
function SomeUsagesOfTheseConsts() {
79+
// these do get replaced by the const value
80+
var value1 = 1 /* Cancel */;
81+
console.log(value1);
82+
var value2 = 2 /* OKCancel */;
83+
console.log(value2);
84+
}
85+
return SomeUsagesOfTheseConsts;
86+
}());
87+
ViewModels.SomeUsagesOfTheseConsts = SomeUsagesOfTheseConsts;
88+
})(ViewModels = MsPortalFx.ViewModels || (MsPortalFx.ViewModels = {}));
89+
})(MsPortalFx || (MsPortalFx = {}));
90+
91+
92+
//// [exportImportCanSubstituteConstEnumForValue.d.ts]
93+
declare module MsPortalFx.ViewModels.Dialogs {
94+
const enum DialogResult {
95+
Abort = 0,
96+
Cancel = 1,
97+
Ignore = 2,
98+
No = 3,
99+
Ok = 4,
100+
Retry = 5,
101+
Yes = 6
102+
}
103+
interface DialogResultCallback {
104+
(result: MsPortalFx.ViewModels.Dialogs.DialogResult): void;
105+
}
106+
function someExportedFunction(): void;
107+
const enum MessageBoxButtons {
108+
AbortRetryIgnore = 0,
109+
OK = 1,
110+
OKCancel = 2,
111+
RetryCancel = 3,
112+
YesNo = 4,
113+
YesNoCancel = 5
114+
}
115+
}
116+
declare module MsPortalFx.ViewModels {
117+
/**
118+
* For some reason javascript code is emitted for this re-exported const enum.
119+
*/
120+
export import ReExportedEnum = Dialogs.DialogResult;
121+
/**
122+
* Re-exporting a function type to show difference. No javascript is emmitted (as expected)
123+
*/
124+
export import Callback = Dialogs.DialogResultCallback;
125+
class SomeUsagesOfTheseConsts {
126+
constructor();
127+
}
128+
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
=== tests/cases/compiler/exportImportCanSubstituteConstEnumForValue.ts ===
2+
module MsPortalFx.ViewModels.Dialogs {
3+
>MsPortalFx : Symbol(MsPortalFx, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 0), Decl(exportImportCanSubstituteConstEnumForValue.ts, 27, 1))
4+
>ViewModels : Symbol(ViewModels, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 18), Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 18))
5+
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
6+
7+
export const enum DialogResult {
8+
>DialogResult : Symbol(DialogResult, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 38))
9+
10+
Abort,
11+
>Abort : Symbol(ReExportedEnum.Abort, Decl(exportImportCanSubstituteConstEnumForValue.ts, 2, 36))
12+
13+
Cancel,
14+
>Cancel : Symbol(ReExportedEnum.Cancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 3, 14))
15+
16+
Ignore,
17+
>Ignore : Symbol(ReExportedEnum.Ignore, Decl(exportImportCanSubstituteConstEnumForValue.ts, 4, 15))
18+
19+
No,
20+
>No : Symbol(ReExportedEnum.No, Decl(exportImportCanSubstituteConstEnumForValue.ts, 5, 15))
21+
22+
Ok,
23+
>Ok : Symbol(ReExportedEnum.Ok, Decl(exportImportCanSubstituteConstEnumForValue.ts, 6, 11))
24+
25+
Retry,
26+
>Retry : Symbol(ReExportedEnum.Retry, Decl(exportImportCanSubstituteConstEnumForValue.ts, 7, 11))
27+
28+
Yes,
29+
>Yes : Symbol(ReExportedEnum.Yes, Decl(exportImportCanSubstituteConstEnumForValue.ts, 8, 14))
30+
}
31+
32+
export interface DialogResultCallback {
33+
>DialogResultCallback : Symbol(DialogResultCallback, Decl(exportImportCanSubstituteConstEnumForValue.ts, 10, 5))
34+
35+
(result: MsPortalFx.ViewModels.Dialogs.DialogResult): void;
36+
>result : Symbol(result, Decl(exportImportCanSubstituteConstEnumForValue.ts, 13, 9))
37+
>MsPortalFx : Symbol(MsPortalFx, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 0), Decl(exportImportCanSubstituteConstEnumForValue.ts, 27, 1))
38+
>ViewModels : Symbol(ViewModels, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 18), Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 18))
39+
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
40+
>DialogResult : Symbol(DialogResult, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 38))
41+
}
42+
43+
export function someExportedFunction() {
44+
>someExportedFunction : Symbol(someExportedFunction, Decl(exportImportCanSubstituteConstEnumForValue.ts, 14, 5))
45+
}
46+
47+
export const enum MessageBoxButtons {
48+
>MessageBoxButtons : Symbol(MessageBoxButtons, Decl(exportImportCanSubstituteConstEnumForValue.ts, 17, 5))
49+
50+
AbortRetryIgnore,
51+
>AbortRetryIgnore : Symbol(MessageBoxButtons.AbortRetryIgnore, Decl(exportImportCanSubstituteConstEnumForValue.ts, 19, 41))
52+
53+
OK,
54+
>OK : Symbol(MessageBoxButtons.OK, Decl(exportImportCanSubstituteConstEnumForValue.ts, 20, 25))
55+
56+
OKCancel,
57+
>OKCancel : Symbol(MessageBoxButtons.OKCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 21, 11))
58+
59+
RetryCancel,
60+
>RetryCancel : Symbol(MessageBoxButtons.RetryCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 22, 17))
61+
62+
YesNo,
63+
>YesNo : Symbol(MessageBoxButtons.YesNo, Decl(exportImportCanSubstituteConstEnumForValue.ts, 23, 20))
64+
65+
YesNoCancel,
66+
>YesNoCancel : Symbol(MessageBoxButtons.YesNoCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 24, 14))
67+
}
68+
}
69+
70+
71+
module MsPortalFx.ViewModels {
72+
>MsPortalFx : Symbol(MsPortalFx, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 0), Decl(exportImportCanSubstituteConstEnumForValue.ts, 27, 1))
73+
>ViewModels : Symbol(ViewModels, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 18), Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 18))
74+
75+
/**
76+
* For some reason javascript code is emitted for this re-exported const enum.
77+
*/
78+
export import ReExportedEnum = Dialogs.DialogResult;
79+
>ReExportedEnum : Symbol(ReExportedEnum, Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 30))
80+
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
81+
>DialogResult : Symbol(ReExportedEnum, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 38))
82+
83+
/**
84+
* Not exported to show difference. No javascript is emmitted (as expected)
85+
*/
86+
import DialogButtons = Dialogs.MessageBoxButtons;
87+
>DialogButtons : Symbol(DialogButtons, Decl(exportImportCanSubstituteConstEnumForValue.ts, 35, 56))
88+
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
89+
>MessageBoxButtons : Symbol(DialogButtons, Decl(exportImportCanSubstituteConstEnumForValue.ts, 17, 5))
90+
91+
/**
92+
* Re-exporting a function type to show difference. No javascript is emmitted (as expected)
93+
*/
94+
export import Callback = Dialogs.DialogResultCallback;
95+
>Callback : Symbol(Callback, Decl(exportImportCanSubstituteConstEnumForValue.ts, 40, 53))
96+
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
97+
>DialogResultCallback : Symbol(Callback, Decl(exportImportCanSubstituteConstEnumForValue.ts, 10, 5))
98+
99+
export class SomeUsagesOfTheseConsts {
100+
>SomeUsagesOfTheseConsts : Symbol(SomeUsagesOfTheseConsts, Decl(exportImportCanSubstituteConstEnumForValue.ts, 45, 58))
101+
102+
constructor() {
103+
// these do get replaced by the const value
104+
const value1 = ReExportedEnum.Cancel;
105+
>value1 : Symbol(value1, Decl(exportImportCanSubstituteConstEnumForValue.ts, 50, 17))
106+
>ReExportedEnum.Cancel : Symbol(ReExportedEnum.Cancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 3, 14))
107+
>ReExportedEnum : Symbol(ReExportedEnum, Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 30))
108+
>Cancel : Symbol(ReExportedEnum.Cancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 3, 14))
109+
110+
console.log(value1);
111+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
112+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
113+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
114+
>value1 : Symbol(value1, Decl(exportImportCanSubstituteConstEnumForValue.ts, 50, 17))
115+
116+
const value2 = DialogButtons.OKCancel;
117+
>value2 : Symbol(value2, Decl(exportImportCanSubstituteConstEnumForValue.ts, 52, 17))
118+
>DialogButtons.OKCancel : Symbol(DialogButtons.OKCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 21, 11))
119+
>DialogButtons : Symbol(DialogButtons, Decl(exportImportCanSubstituteConstEnumForValue.ts, 35, 56))
120+
>OKCancel : Symbol(DialogButtons.OKCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 21, 11))
121+
122+
console.log(value2);
123+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
124+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
125+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
126+
>value2 : Symbol(value2, Decl(exportImportCanSubstituteConstEnumForValue.ts, 52, 17))
127+
}
128+
}
129+
}
130+
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
=== tests/cases/compiler/exportImportCanSubstituteConstEnumForValue.ts ===
2+
module MsPortalFx.ViewModels.Dialogs {
3+
>MsPortalFx : typeof MsPortalFx
4+
>ViewModels : typeof ViewModels
5+
>Dialogs : typeof Dialogs
6+
7+
export const enum DialogResult {
8+
>DialogResult : DialogResult
9+
10+
Abort,
11+
>Abort : DialogResult.Abort
12+
13+
Cancel,
14+
>Cancel : DialogResult.Cancel
15+
16+
Ignore,
17+
>Ignore : DialogResult.Ignore
18+
19+
No,
20+
>No : DialogResult.No
21+
22+
Ok,
23+
>Ok : DialogResult.Ok
24+
25+
Retry,
26+
>Retry : DialogResult.Retry
27+
28+
Yes,
29+
>Yes : DialogResult.Yes
30+
}
31+
32+
export interface DialogResultCallback {
33+
(result: MsPortalFx.ViewModels.Dialogs.DialogResult): void;
34+
>result : DialogResult
35+
>MsPortalFx : any
36+
>ViewModels : any
37+
>Dialogs : any
38+
}
39+
40+
export function someExportedFunction() {
41+
>someExportedFunction : () => void
42+
}
43+
44+
export const enum MessageBoxButtons {
45+
>MessageBoxButtons : MessageBoxButtons
46+
47+
AbortRetryIgnore,
48+
>AbortRetryIgnore : MessageBoxButtons.AbortRetryIgnore
49+
50+
OK,
51+
>OK : MessageBoxButtons.OK
52+
53+
OKCancel,
54+
>OKCancel : MessageBoxButtons.OKCancel
55+
56+
RetryCancel,
57+
>RetryCancel : MessageBoxButtons.RetryCancel
58+
59+
YesNo,
60+
>YesNo : MessageBoxButtons.YesNo
61+
62+
YesNoCancel,
63+
>YesNoCancel : MessageBoxButtons.YesNoCancel
64+
}
65+
}
66+
67+
68+
module MsPortalFx.ViewModels {
69+
>MsPortalFx : typeof MsPortalFx
70+
>ViewModels : typeof ViewModels
71+
72+
/**
73+
* For some reason javascript code is emitted for this re-exported const enum.
74+
*/
75+
export import ReExportedEnum = Dialogs.DialogResult;
76+
>ReExportedEnum : typeof ReExportedEnum
77+
>Dialogs : typeof Dialogs
78+
>DialogResult : ReExportedEnum
79+
80+
/**
81+
* Not exported to show difference. No javascript is emmitted (as expected)
82+
*/
83+
import DialogButtons = Dialogs.MessageBoxButtons;
84+
>DialogButtons : typeof DialogButtons
85+
>Dialogs : typeof Dialogs
86+
>MessageBoxButtons : DialogButtons
87+
88+
/**
89+
* Re-exporting a function type to show difference. No javascript is emmitted (as expected)
90+
*/
91+
export import Callback = Dialogs.DialogResultCallback;
92+
>Callback : any
93+
>Dialogs : typeof Dialogs
94+
>DialogResultCallback : Callback
95+
96+
export class SomeUsagesOfTheseConsts {
97+
>SomeUsagesOfTheseConsts : SomeUsagesOfTheseConsts
98+
99+
constructor() {
100+
// these do get replaced by the const value
101+
const value1 = ReExportedEnum.Cancel;
102+
>value1 : ReExportedEnum.Cancel
103+
>ReExportedEnum.Cancel : ReExportedEnum.Cancel
104+
>ReExportedEnum : typeof ReExportedEnum
105+
>Cancel : ReExportedEnum.Cancel
106+
107+
console.log(value1);
108+
>console.log(value1) : void
109+
>console.log : (message?: any, ...optionalParams: any[]) => void
110+
>console : Console
111+
>log : (message?: any, ...optionalParams: any[]) => void
112+
>value1 : ReExportedEnum.Cancel
113+
114+
const value2 = DialogButtons.OKCancel;
115+
>value2 : DialogButtons.OKCancel
116+
>DialogButtons.OKCancel : DialogButtons.OKCancel
117+
>DialogButtons : typeof DialogButtons
118+
>OKCancel : DialogButtons.OKCancel
119+
120+
console.log(value2);
121+
>console.log(value2) : void
122+
>console.log : (message?: any, ...optionalParams: any[]) => void
123+
>console : Console
124+
>log : (message?: any, ...optionalParams: any[]) => void
125+
>value2 : DialogButtons.OKCancel
126+
}
127+
}
128+
}
129+

0 commit comments

Comments
 (0)