From 22bcfbe469e5975dc12fdba4b5b65a28b0bc89b0 Mon Sep 17 00:00:00 2001 From: Rafael de Oleza Date: Thu, 23 Aug 2018 14:20:57 -0700 Subject: [PATCH] Fix path.scope.rename() to not change break clauses (#8478) * Make labels on break and continue statements not referenced * Add test for imports and labels with the same name --- .../fixtures/harmony-edgecase/import-with-break/input.js | 5 +++++ .../harmony-edgecase/import-with-break/output.js | 5 +++++ .../test/fixtures/rename/break-statements/input.js | 9 +++++++++ .../test/fixtures/rename/break-statements/options.json | 3 +++ .../test/fixtures/rename/break-statements/output.js | 9 +++++++++ .../test/fixtures/rename/break-statements/plugin.js | 9 +++++++++ packages/babel-types/src/validators/isReferenced.js | 4 ++++ 7 files changed, 44 insertions(+) create mode 100644 packages/babel-generator/test/fixtures/harmony-edgecase/import-with-break/input.js create mode 100644 packages/babel-generator/test/fixtures/harmony-edgecase/import-with-break/output.js create mode 100644 packages/babel-traverse/test/fixtures/rename/break-statements/input.js create mode 100644 packages/babel-traverse/test/fixtures/rename/break-statements/options.json create mode 100644 packages/babel-traverse/test/fixtures/rename/break-statements/output.js create mode 100644 packages/babel-traverse/test/fixtures/rename/break-statements/plugin.js diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-break/input.js b/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-break/input.js new file mode 100644 index 0000000000..69b3df1e54 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-break/input.js @@ -0,0 +1,5 @@ +import foo from "foo"; + +foo: { + break foo; +} diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-break/output.js b/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-break/output.js new file mode 100644 index 0000000000..69b3df1e54 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-break/output.js @@ -0,0 +1,5 @@ +import foo from "foo"; + +foo: { + break foo; +} diff --git a/packages/babel-traverse/test/fixtures/rename/break-statements/input.js b/packages/babel-traverse/test/fixtures/rename/break-statements/input.js new file mode 100644 index 0000000000..79b15e15ee --- /dev/null +++ b/packages/babel-traverse/test/fixtures/rename/break-statements/input.js @@ -0,0 +1,9 @@ +function f(a) { + a: for (const k in []) { + if (k) { + continue a; + } else { + break a; + } + } +} diff --git a/packages/babel-traverse/test/fixtures/rename/break-statements/options.json b/packages/babel-traverse/test/fixtures/rename/break-statements/options.json new file mode 100644 index 0000000000..14af0e5fea --- /dev/null +++ b/packages/babel-traverse/test/fixtures/rename/break-statements/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["./plugin"] +} diff --git a/packages/babel-traverse/test/fixtures/rename/break-statements/output.js b/packages/babel-traverse/test/fixtures/rename/break-statements/output.js new file mode 100644 index 0000000000..89d5cec5a6 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/rename/break-statements/output.js @@ -0,0 +1,9 @@ +function f(b) { + a: for (const k in []) { + if (k) { + continue a; + } else { + break a; + } + } +} diff --git a/packages/babel-traverse/test/fixtures/rename/break-statements/plugin.js b/packages/babel-traverse/test/fixtures/rename/break-statements/plugin.js new file mode 100644 index 0000000000..e945a3b7cb --- /dev/null +++ b/packages/babel-traverse/test/fixtures/rename/break-statements/plugin.js @@ -0,0 +1,9 @@ +module.exports = function() { + return { + visitor: { + Function(path) { + path.scope.rename("a", "b"); + } + } + }; +} diff --git a/packages/babel-types/src/validators/isReferenced.js b/packages/babel-types/src/validators/isReferenced.js index 07c58cc138..136cde829e 100644 --- a/packages/babel-types/src/validators/isReferenced.js +++ b/packages/babel-types/src/validators/isReferenced.js @@ -80,6 +80,10 @@ export default function isReferenced(node: Object, parent: Object): boolean { case "RestElement": return false; + case "BreakStatement": + case "ContinueStatement": + return false; + // no: function NODE() {} // no: function foo(NODE) {} case "FunctionDeclaration":