Skip to content

Commit

Permalink
Shake exports with pure property assignments (#2909)
Browse files Browse the repository at this point in the history
  • Loading branch information
devongovett committed May 6, 2019
1 parent 7643631 commit ddaeac7
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 16 deletions.
@@ -0,0 +1,3 @@
import {foo} from './b';

output = foo;
@@ -0,0 +1,4 @@
export const foo = 2;

export function bar() {}
bar.displayName = 'hello';
31 changes: 15 additions & 16 deletions packages/shared/scope-hoisting/src/shake.js
@@ -1,7 +1,5 @@
import * as t from '@babel/types';

const EXPORTS_RE = /^\$([^$]+)\$exports$/;

/**
* This is a small small implementation of dead code removal specialized to handle
* removing unused exports. All other dead code removal happens in workers on each
Expand Down Expand Up @@ -42,31 +40,24 @@ function getUnusedBinding(path, name) {
return null;
}

if (isPure(binding)) {
let pure = isPure(binding);
if (!binding.referenced && pure) {
return binding;
}

if (!EXPORTS_RE.test(name)) {
return null;
}

// Is there any references which aren't simple assignments?
let bailout = binding.referencePaths.some(
path => !isExportAssignment(path) && !isUnusedWildcard(path)
);

if (bailout) {
return null;
} else {
if (!bailout && pure) {
return binding;
}

return null;
}

function isPure(binding) {
if (binding.referenced) {
return false;
}

if (
binding.path.isVariableDeclarator() &&
binding.path.get('id').isIdentifier()
Expand All @@ -83,7 +74,8 @@ function isExportAssignment(path) {
// match "path.any = any;"
path.parentPath.isMemberExpression() &&
path.parentPath.parentPath.isAssignmentExpression() &&
path.parentPath.parentPath.node.left === path.parentPath.node
path.parentPath.parentPath.node.left === path.parentPath.node &&
path.parentPath.parentPath.get('right').isPure()
);
}

Expand Down Expand Up @@ -118,6 +110,13 @@ function remove(path) {
} else if (isUnusedWildcard(path)) {
remove(path.parentPath);
} else if (!path.removed) {
path.remove();
if (
path.parentPath.isSequenceExpression() &&
path.parent.expressions.length === 1
) {
path.parentPath.remove();
} else {
path.remove();
}
}
}

0 comments on commit ddaeac7

Please sign in to comment.