Skip to content

Commit

Permalink
Shake exports with pure property assignments
Browse files Browse the repository at this point in the history
  • Loading branch information
devongovett committed May 6, 2019
1 parent 5993813 commit d348e7b
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 19 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';
19 changes: 19 additions & 0 deletions packages/core/integration-tests/test/scope-hoisting.js
Expand Up @@ -549,6 +549,25 @@ describe('scope hoisting', function() {
let output = await run(b);
assert.deepEqual(output, 'bar');
});

it('should shake pure property assignments', async function() {
let b = await bundle(
path.join(
__dirname,
'/integration/scope-hoisting/es6/pure-assignment/a.js'
)
);

let output = await run(b);
assert.deepEqual(output, 2);

let contents = await fs.readFile(
path.join(__dirname, 'dist/a.js'),
'utf8'
);
assert(!/bar/.test(contents));
assert(!/displayName/.test(contents));
});
});

describe('commonjs', function() {
Expand Down
35 changes: 16 additions & 19 deletions packages/core/parcel-bundler/src/scope-hoisting/shake.js
@@ -1,7 +1,5 @@
const t = require('@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 @@ -44,31 +42,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 @@ -85,7 +76,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 All @@ -106,9 +98,7 @@ function remove(path) {
if (path.isAssignmentExpression()) {
if (path.parentPath.isSequenceExpression()) {
if (path.parent.expressions.length == 1) {
// replace sequence expression with it's sole child
path.parentPath.replaceWith(path);
remove(path.parentPath);
path.parentPath.remove();
} else {
path.remove();
}
Expand All @@ -122,6 +112,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 d348e7b

Please sign in to comment.