diff --git a/src/Module.ts b/src/Module.ts index 8c86ca6a151..c0f80c09594 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -7,8 +7,6 @@ import ExportDefaultDeclaration, { isExportDefaultDeclaration } from './ast/nodes/ExportDefaultDeclaration'; import ExportNamedDeclaration from './ast/nodes/ExportNamedDeclaration'; -import FunctionDeclaration from './ast/nodes/FunctionDeclaration'; -import Identifier from './ast/nodes/Identifier'; import Import from './ast/nodes/Import'; import ImportDeclaration from './ast/nodes/ImportDeclaration'; import ImportSpecifier from './ast/nodes/ImportSpecifier'; @@ -366,10 +364,6 @@ export default class Module { // export default function foo () {} // export default foo; // export default 42; - const identifier = - ((node.declaration).id && - (node.declaration).id.name) || - (node.declaration).name; if (this.exports.default) { this.error( { @@ -382,7 +376,7 @@ export default class Module { this.exports.default = { localName: 'default', - identifier, + identifier: node.variable.getOriginalVariableName(), node }; } else if ((node).declaration) { diff --git a/src/ast/nodes/ExportDefaultDeclaration.ts b/src/ast/nodes/ExportDefaultDeclaration.ts index cb507328038..b73d0e6b4f7 100644 --- a/src/ast/nodes/ExportDefaultDeclaration.ts +++ b/src/ast/nodes/ExportDefaultDeclaration.ts @@ -8,7 +8,7 @@ import { import ExportDefaultVariable from '../variables/ExportDefaultVariable'; import ClassDeclaration, { isClassDeclaration } from './ClassDeclaration'; import FunctionDeclaration, { isFunctionDeclaration } from './FunctionDeclaration'; -import Identifier, { isIdentifier } from './Identifier'; +import Identifier from './Identifier'; import * as NodeType from './NodeType'; import { ExpressionNode, Node, NodeBase } from './shared/Node'; @@ -44,19 +44,6 @@ export default class ExportDefaultDeclaration extends NodeBase { variable: ExportDefaultVariable; private declarationName: string; - bind() { - super.bind(); - if ( - this.declarationName && - // Do not set it for Class and FunctionExpressions otherwise they get treeshaken away - (isFunctionDeclaration(this.declaration) || - isClassDeclaration(this.declaration) || - isIdentifier(this.declaration)) - ) { - this.variable.setOriginalVariable(this.scope.findVariable(this.declarationName)); - } - } - initialise() { this.included = false; this.declarationName = diff --git a/src/ast/variables/ExportDefaultVariable.ts b/src/ast/variables/ExportDefaultVariable.ts index 7acad2528c2..92a6bd838ab 100644 --- a/src/ast/variables/ExportDefaultVariable.ts +++ b/src/ast/variables/ExportDefaultVariable.ts @@ -16,7 +16,7 @@ export default class ExportDefaultVariable extends LocalVariable { hasId: boolean; // Not initialised during construction - private original: Variable | null = null; + private originalId: Identifier | null = null; constructor( name: string, @@ -29,37 +29,37 @@ export default class ExportDefaultVariable extends LocalVariable { exportDefaultDeclaration.declaration, deoptimizationTracker ); - this.hasId = - (exportDefaultDeclaration.declaration.type === NodeType.FunctionDeclaration || - exportDefaultDeclaration.declaration.type === NodeType.ClassDeclaration) && - !!(exportDefaultDeclaration.declaration).id; + const declaration = exportDefaultDeclaration.declaration; + if ( + (declaration.type === NodeType.FunctionDeclaration || + declaration.type === NodeType.ClassDeclaration) && + (declaration).id + ) { + this.hasId = true; + this.originalId = (declaration).id; + } else if (declaration.type === NodeType.Identifier) { + this.originalId = declaration; + } } addReference(identifier: Identifier) { if (!this.hasId) { this.name = identifier.name; - if (this.original !== null) { - this.original.addReference(identifier); - } } } getName(reset?: boolean) { if (!reset && this.safeName) return this.safeName; - if (this.original !== null && !this.original.isReassigned) return this.original.getName(); + if (this.referencesOriginal()) return this.originalId.variable.getName(); return this.name; } referencesOriginal() { - return this.original && !this.original.isReassigned; - } - - getOriginalVariableName() { - return this.original && this.original.getName(); + return this.originalId && (this.hasId || !this.originalId.variable.isReassigned); } - setOriginalVariable(original: Variable) { - this.original = original; + getOriginalVariableName(): string | null { + return (this.originalId && this.originalId.name) || null; } } diff --git a/test/function/samples/deconflict-ids/_config.js b/test/function/samples/deconflict-ids/_config.js new file mode 100644 index 00000000000..0d91c9ee299 --- /dev/null +++ b/test/function/samples/deconflict-ids/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'deconflicts reassigned ids' +}; diff --git a/test/function/samples/deconflict-ids/conflict1.js b/test/function/samples/deconflict-ids/conflict1.js new file mode 100644 index 00000000000..f36f56a9698 --- /dev/null +++ b/test/function/samples/deconflict-ids/conflict1.js @@ -0,0 +1,3 @@ +function foo(){ + throw new Error('Wrong foo function referenced.') +} diff --git a/test/function/samples/deconflict-ids/conflict2.js b/test/function/samples/deconflict-ids/conflict2.js new file mode 100644 index 00000000000..f36f56a9698 --- /dev/null +++ b/test/function/samples/deconflict-ids/conflict2.js @@ -0,0 +1,3 @@ +function foo(){ + throw new Error('Wrong foo function referenced.') +} diff --git a/test/function/samples/deconflict-ids/main.js b/test/function/samples/deconflict-ids/main.js new file mode 100644 index 00000000000..b314ff81cc3 --- /dev/null +++ b/test/function/samples/deconflict-ids/main.js @@ -0,0 +1,5 @@ +import './conflict1.js'; +import './conflict2.js'; +import foo from './used.js'; + +assert.equal(foo(1), 2); diff --git a/test/function/samples/deconflict-ids/used.js b/test/function/samples/deconflict-ids/used.js new file mode 100644 index 00000000000..c8fcd3b12ce --- /dev/null +++ b/test/function/samples/deconflict-ids/used.js @@ -0,0 +1,6 @@ +export default function foo() { + foo = function(x){ + return x + 1; + }; + return foo.apply(this, arguments); +}