Skip to content

Commit

Permalink
Use same condition in isReferencedAliasDeclaration as isAliasResolved…
Browse files Browse the repository at this point in the history
…ToValue (#28171) (#28219)
  • Loading branch information
weswigham authored Oct 30, 2018
1 parent 9733858 commit 7b59753
Show file tree
Hide file tree
Showing 5 changed files with 449 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28274,7 +28274,8 @@ namespace ts {
return true;
}
const target = getSymbolLinks(symbol!).target; // TODO: GH#18217
if (target && getModifierFlags(node) & ModifierFlags.Export && target.flags & SymbolFlags.Value) {
if (target && getModifierFlags(node) & ModifierFlags.Export &&
target.flags & SymbolFlags.Value && (compilerOptions.preserveConstEnums || !isConstEnumOrConstEnumOnlyModule(target))) {
// An `export import ... =` of a value symbol is always considered referenced
return true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
//// [exportImportCanSubstituteConstEnumForValue.ts]
module MsPortalFx.ViewModels.Dialogs {

export const enum DialogResult {
Abort,
Cancel,
Ignore,
No,
Ok,
Retry,
Yes,
}

export interface DialogResultCallback {
(result: MsPortalFx.ViewModels.Dialogs.DialogResult): void;
}

export function someExportedFunction() {
}

export const enum MessageBoxButtons {
AbortRetryIgnore,
OK,
OKCancel,
RetryCancel,
YesNo,
YesNoCancel,
}
}


module MsPortalFx.ViewModels {

/**
* For some reason javascript code is emitted for this re-exported const enum.
*/
export import ReExportedEnum = Dialogs.DialogResult;

/**
* Not exported to show difference. No javascript is emmitted (as expected)
*/
import DialogButtons = Dialogs.MessageBoxButtons;

/**
* Re-exporting a function type to show difference. No javascript is emmitted (as expected)
*/
export import Callback = Dialogs.DialogResultCallback;

export class SomeUsagesOfTheseConsts {
constructor() {
// these do get replaced by the const value
const value1 = ReExportedEnum.Cancel;
console.log(value1);
const value2 = DialogButtons.OKCancel;
console.log(value2);
}
}
}


//// [exportImportCanSubstituteConstEnumForValue.js]
var MsPortalFx;
(function (MsPortalFx) {
var ViewModels;
(function (ViewModels) {
var Dialogs;
(function (Dialogs) {
function someExportedFunction() {
}
Dialogs.someExportedFunction = someExportedFunction;
})(Dialogs = ViewModels.Dialogs || (ViewModels.Dialogs = {}));
})(ViewModels = MsPortalFx.ViewModels || (MsPortalFx.ViewModels = {}));
})(MsPortalFx || (MsPortalFx = {}));
(function (MsPortalFx) {
var ViewModels;
(function (ViewModels) {
var SomeUsagesOfTheseConsts = /** @class */ (function () {
function SomeUsagesOfTheseConsts() {
// these do get replaced by the const value
var value1 = 1 /* Cancel */;
console.log(value1);
var value2 = 2 /* OKCancel */;
console.log(value2);
}
return SomeUsagesOfTheseConsts;
}());
ViewModels.SomeUsagesOfTheseConsts = SomeUsagesOfTheseConsts;
})(ViewModels = MsPortalFx.ViewModels || (MsPortalFx.ViewModels = {}));
})(MsPortalFx || (MsPortalFx = {}));


//// [exportImportCanSubstituteConstEnumForValue.d.ts]
declare module MsPortalFx.ViewModels.Dialogs {
const enum DialogResult {
Abort = 0,
Cancel = 1,
Ignore = 2,
No = 3,
Ok = 4,
Retry = 5,
Yes = 6
}
interface DialogResultCallback {
(result: MsPortalFx.ViewModels.Dialogs.DialogResult): void;
}
function someExportedFunction(): void;
const enum MessageBoxButtons {
AbortRetryIgnore = 0,
OK = 1,
OKCancel = 2,
RetryCancel = 3,
YesNo = 4,
YesNoCancel = 5
}
}
declare module MsPortalFx.ViewModels {
/**
* For some reason javascript code is emitted for this re-exported const enum.
*/
export import ReExportedEnum = Dialogs.DialogResult;
/**
* Re-exporting a function type to show difference. No javascript is emmitted (as expected)
*/
export import Callback = Dialogs.DialogResultCallback;
class SomeUsagesOfTheseConsts {
constructor();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
=== tests/cases/compiler/exportImportCanSubstituteConstEnumForValue.ts ===
module MsPortalFx.ViewModels.Dialogs {
>MsPortalFx : Symbol(MsPortalFx, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 0), Decl(exportImportCanSubstituteConstEnumForValue.ts, 27, 1))
>ViewModels : Symbol(ViewModels, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 18), Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 18))
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))

export const enum DialogResult {
>DialogResult : Symbol(DialogResult, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 38))

Abort,
>Abort : Symbol(ReExportedEnum.Abort, Decl(exportImportCanSubstituteConstEnumForValue.ts, 2, 36))

Cancel,
>Cancel : Symbol(ReExportedEnum.Cancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 3, 14))

Ignore,
>Ignore : Symbol(ReExportedEnum.Ignore, Decl(exportImportCanSubstituteConstEnumForValue.ts, 4, 15))

No,
>No : Symbol(ReExportedEnum.No, Decl(exportImportCanSubstituteConstEnumForValue.ts, 5, 15))

Ok,
>Ok : Symbol(ReExportedEnum.Ok, Decl(exportImportCanSubstituteConstEnumForValue.ts, 6, 11))

Retry,
>Retry : Symbol(ReExportedEnum.Retry, Decl(exportImportCanSubstituteConstEnumForValue.ts, 7, 11))

Yes,
>Yes : Symbol(ReExportedEnum.Yes, Decl(exportImportCanSubstituteConstEnumForValue.ts, 8, 14))
}

export interface DialogResultCallback {
>DialogResultCallback : Symbol(DialogResultCallback, Decl(exportImportCanSubstituteConstEnumForValue.ts, 10, 5))

(result: MsPortalFx.ViewModels.Dialogs.DialogResult): void;
>result : Symbol(result, Decl(exportImportCanSubstituteConstEnumForValue.ts, 13, 9))
>MsPortalFx : Symbol(MsPortalFx, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 0), Decl(exportImportCanSubstituteConstEnumForValue.ts, 27, 1))
>ViewModels : Symbol(ViewModels, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 18), Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 18))
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
>DialogResult : Symbol(DialogResult, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 38))
}

export function someExportedFunction() {
>someExportedFunction : Symbol(someExportedFunction, Decl(exportImportCanSubstituteConstEnumForValue.ts, 14, 5))
}

export const enum MessageBoxButtons {
>MessageBoxButtons : Symbol(MessageBoxButtons, Decl(exportImportCanSubstituteConstEnumForValue.ts, 17, 5))

AbortRetryIgnore,
>AbortRetryIgnore : Symbol(MessageBoxButtons.AbortRetryIgnore, Decl(exportImportCanSubstituteConstEnumForValue.ts, 19, 41))

OK,
>OK : Symbol(MessageBoxButtons.OK, Decl(exportImportCanSubstituteConstEnumForValue.ts, 20, 25))

OKCancel,
>OKCancel : Symbol(MessageBoxButtons.OKCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 21, 11))

RetryCancel,
>RetryCancel : Symbol(MessageBoxButtons.RetryCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 22, 17))

YesNo,
>YesNo : Symbol(MessageBoxButtons.YesNo, Decl(exportImportCanSubstituteConstEnumForValue.ts, 23, 20))

YesNoCancel,
>YesNoCancel : Symbol(MessageBoxButtons.YesNoCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 24, 14))
}
}


module MsPortalFx.ViewModels {
>MsPortalFx : Symbol(MsPortalFx, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 0), Decl(exportImportCanSubstituteConstEnumForValue.ts, 27, 1))
>ViewModels : Symbol(ViewModels, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 18), Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 18))

/**
* For some reason javascript code is emitted for this re-exported const enum.
*/
export import ReExportedEnum = Dialogs.DialogResult;
>ReExportedEnum : Symbol(ReExportedEnum, Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 30))
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
>DialogResult : Symbol(ReExportedEnum, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 38))

/**
* Not exported to show difference. No javascript is emmitted (as expected)
*/
import DialogButtons = Dialogs.MessageBoxButtons;
>DialogButtons : Symbol(DialogButtons, Decl(exportImportCanSubstituteConstEnumForValue.ts, 35, 56))
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
>MessageBoxButtons : Symbol(DialogButtons, Decl(exportImportCanSubstituteConstEnumForValue.ts, 17, 5))

/**
* Re-exporting a function type to show difference. No javascript is emmitted (as expected)
*/
export import Callback = Dialogs.DialogResultCallback;
>Callback : Symbol(Callback, Decl(exportImportCanSubstituteConstEnumForValue.ts, 40, 53))
>Dialogs : Symbol(Dialogs, Decl(exportImportCanSubstituteConstEnumForValue.ts, 0, 29))
>DialogResultCallback : Symbol(Callback, Decl(exportImportCanSubstituteConstEnumForValue.ts, 10, 5))

export class SomeUsagesOfTheseConsts {
>SomeUsagesOfTheseConsts : Symbol(SomeUsagesOfTheseConsts, Decl(exportImportCanSubstituteConstEnumForValue.ts, 45, 58))

constructor() {
// these do get replaced by the const value
const value1 = ReExportedEnum.Cancel;
>value1 : Symbol(value1, Decl(exportImportCanSubstituteConstEnumForValue.ts, 50, 17))
>ReExportedEnum.Cancel : Symbol(ReExportedEnum.Cancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 3, 14))
>ReExportedEnum : Symbol(ReExportedEnum, Decl(exportImportCanSubstituteConstEnumForValue.ts, 30, 30))
>Cancel : Symbol(ReExportedEnum.Cancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 3, 14))

console.log(value1);
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>value1 : Symbol(value1, Decl(exportImportCanSubstituteConstEnumForValue.ts, 50, 17))

const value2 = DialogButtons.OKCancel;
>value2 : Symbol(value2, Decl(exportImportCanSubstituteConstEnumForValue.ts, 52, 17))
>DialogButtons.OKCancel : Symbol(DialogButtons.OKCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 21, 11))
>DialogButtons : Symbol(DialogButtons, Decl(exportImportCanSubstituteConstEnumForValue.ts, 35, 56))
>OKCancel : Symbol(DialogButtons.OKCancel, Decl(exportImportCanSubstituteConstEnumForValue.ts, 21, 11))

console.log(value2);
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
>value2 : Symbol(value2, Decl(exportImportCanSubstituteConstEnumForValue.ts, 52, 17))
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
=== tests/cases/compiler/exportImportCanSubstituteConstEnumForValue.ts ===
module MsPortalFx.ViewModels.Dialogs {
>MsPortalFx : typeof MsPortalFx
>ViewModels : typeof ViewModels
>Dialogs : typeof Dialogs

export const enum DialogResult {
>DialogResult : DialogResult

Abort,
>Abort : DialogResult.Abort

Cancel,
>Cancel : DialogResult.Cancel

Ignore,
>Ignore : DialogResult.Ignore

No,
>No : DialogResult.No

Ok,
>Ok : DialogResult.Ok

Retry,
>Retry : DialogResult.Retry

Yes,
>Yes : DialogResult.Yes
}

export interface DialogResultCallback {
(result: MsPortalFx.ViewModels.Dialogs.DialogResult): void;
>result : DialogResult
>MsPortalFx : any
>ViewModels : any
>Dialogs : any
}

export function someExportedFunction() {
>someExportedFunction : () => void
}

export const enum MessageBoxButtons {
>MessageBoxButtons : MessageBoxButtons

AbortRetryIgnore,
>AbortRetryIgnore : MessageBoxButtons.AbortRetryIgnore

OK,
>OK : MessageBoxButtons.OK

OKCancel,
>OKCancel : MessageBoxButtons.OKCancel

RetryCancel,
>RetryCancel : MessageBoxButtons.RetryCancel

YesNo,
>YesNo : MessageBoxButtons.YesNo

YesNoCancel,
>YesNoCancel : MessageBoxButtons.YesNoCancel
}
}


module MsPortalFx.ViewModels {
>MsPortalFx : typeof MsPortalFx
>ViewModels : typeof ViewModels

/**
* For some reason javascript code is emitted for this re-exported const enum.
*/
export import ReExportedEnum = Dialogs.DialogResult;
>ReExportedEnum : typeof ReExportedEnum
>Dialogs : typeof Dialogs
>DialogResult : ReExportedEnum

/**
* Not exported to show difference. No javascript is emmitted (as expected)
*/
import DialogButtons = Dialogs.MessageBoxButtons;
>DialogButtons : typeof DialogButtons
>Dialogs : typeof Dialogs
>MessageBoxButtons : DialogButtons

/**
* Re-exporting a function type to show difference. No javascript is emmitted (as expected)
*/
export import Callback = Dialogs.DialogResultCallback;
>Callback : any
>Dialogs : typeof Dialogs
>DialogResultCallback : Callback

export class SomeUsagesOfTheseConsts {
>SomeUsagesOfTheseConsts : SomeUsagesOfTheseConsts

constructor() {
// these do get replaced by the const value
const value1 = ReExportedEnum.Cancel;
>value1 : ReExportedEnum.Cancel
>ReExportedEnum.Cancel : ReExportedEnum.Cancel
>ReExportedEnum : typeof ReExportedEnum
>Cancel : ReExportedEnum.Cancel

console.log(value1);
>console.log(value1) : void
>console.log : (message?: any, ...optionalParams: any[]) => void
>console : Console
>log : (message?: any, ...optionalParams: any[]) => void
>value1 : ReExportedEnum.Cancel

const value2 = DialogButtons.OKCancel;
>value2 : DialogButtons.OKCancel
>DialogButtons.OKCancel : DialogButtons.OKCancel
>DialogButtons : typeof DialogButtons
>OKCancel : DialogButtons.OKCancel

console.log(value2);
>console.log(value2) : void
>console.log : (message?: any, ...optionalParams: any[]) => void
>console : Console
>log : (message?: any, ...optionalParams: any[]) => void
>value2 : DialogButtons.OKCancel
}
}
}

Loading

0 comments on commit 7b59753

Please sign in to comment.