Skip to content

Commit

Permalink
Properly deconflict ids ids of default exports that have been reassig…
Browse files Browse the repository at this point in the history
…ned (#2502)
  • Loading branch information
lukastaegert committed Oct 10, 2018
1 parent e5d9f3e commit df9ef28
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 37 deletions.
8 changes: 1 addition & 7 deletions src/Module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -366,10 +364,6 @@ export default class Module {
// export default function foo () {}
// export default foo;
// export default 42;
const identifier =
((<FunctionDeclaration>node.declaration).id &&
(<FunctionDeclaration>node.declaration).id.name) ||
(<Identifier>node.declaration).name;
if (this.exports.default) {
this.error(
{
Expand All @@ -382,7 +376,7 @@ export default class Module {

this.exports.default = {
localName: 'default',
identifier,
identifier: node.variable.getOriginalVariableName(),
node
};
} else if ((<ExportNamedDeclaration>node).declaration) {
Expand Down
15 changes: 1 addition & 14 deletions src/ast/nodes/ExportDefaultDeclaration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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 =
Expand Down
32 changes: 16 additions & 16 deletions src/ast/variables/ExportDefaultVariable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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) &&
!!(<FunctionDeclaration | ClassDeclaration>exportDefaultDeclaration.declaration).id;
const declaration = exportDefaultDeclaration.declaration;
if (
(declaration.type === NodeType.FunctionDeclaration ||
declaration.type === NodeType.ClassDeclaration) &&
(<FunctionDeclaration | ClassDeclaration>declaration).id
) {
this.hasId = true;
this.originalId = (<FunctionDeclaration | ClassDeclaration>declaration).id;
} else if (declaration.type === NodeType.Identifier) {
this.originalId = <Identifier>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;
}
}

Expand Down
3 changes: 3 additions & 0 deletions test/function/samples/deconflict-ids/_config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
description: 'deconflicts reassigned ids'
};
3 changes: 3 additions & 0 deletions test/function/samples/deconflict-ids/conflict1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function foo(){
throw new Error('Wrong foo function referenced.')
}
3 changes: 3 additions & 0 deletions test/function/samples/deconflict-ids/conflict2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function foo(){
throw new Error('Wrong foo function referenced.')
}
5 changes: 5 additions & 0 deletions test/function/samples/deconflict-ids/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import './conflict1.js';
import './conflict2.js';
import foo from './used.js';

assert.equal(foo(1), 2);
6 changes: 6 additions & 0 deletions test/function/samples/deconflict-ids/used.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export default function foo() {
foo = function(x){
return x + 1;
};
return foo.apply(this, arguments);
}

0 comments on commit df9ef28

Please sign in to comment.