From 73ada57a170ddf9802cf0c1f3e54f863fc9662b2 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 25 May 2015 03:33:12 +0100 Subject: [PATCH] don't inline classes and functions when they're in different scopes in the utility.deadCodeElimination transformer --- .../transformers/minification/dead-code-elimination.js | 10 ++++++++++ .../issue-1408/actual.js | 1 + .../issue-1408/expected.js | 7 ++----- .../issue-1409/expected.js | 6 ++---- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/babel/transformation/transformers/minification/dead-code-elimination.js b/src/babel/transformation/transformers/minification/dead-code-elimination.js index 0a5a17c96b..b99b1a5486 100644 --- a/src/babel/transformation/transformers/minification/dead-code-elimination.js +++ b/src/babel/transformation/transformers/minification/dead-code-elimination.js @@ -33,6 +33,16 @@ export function ReferencedIdentifier(node, parent, scope) { } if (!replacement) return; + // ensure it's a "pure" type + if (!scope.isPure(replacement)) return; + + if (t.isClass(replacement) || t.isFunction(replacement)) { + // don't change this if it's in a different scope, this can be bad + // for performance since it may be inside a loop or deeply nested in + // hot code + if (!binding.path.scope.parent.is(scope)) return; + } + if (this.findParent((node) => node === replacement)) { return; } diff --git a/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1408/actual.js b/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1408/actual.js index a26cd32237..fbb2e76a40 100644 --- a/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1408/actual.js +++ b/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1408/actual.js @@ -1,4 +1,5 @@ class A { constructor() { this.value = 12345; } } + export default new A(); diff --git a/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1408/expected.js b/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1408/expected.js index a7f17a13a1..e40ad2c45a 100644 --- a/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1408/expected.js +++ b/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1408/expected.js @@ -3,12 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); - -var A = function A() { +exports["default"] = new function A() { babelHelpers.classCallCheck(this, A); this.value = 12345; -}; - -exports["default"] = new A(); +}(); module.exports = exports["default"]; diff --git a/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1409/expected.js b/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1409/expected.js index 516f7cfa09..2ac448d116 100644 --- a/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1409/expected.js +++ b/test/core/fixtures/transformation/minification.dead-code-elimination/issue-1409/expected.js @@ -1,6 +1,6 @@ "use strict"; -var A = (function () { +var a = new ((function () { function A() { babelHelpers.classCallCheck(this, A); } @@ -12,6 +12,4 @@ var A = (function () { } }]); return A; -})(); - -var a = new A(); +})())();