diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index a3948b709e..6cf0918564 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -615,6 +615,17 @@ export default class Scope { return this.isPure(node.value, constantsOnly); } else if (t.isUnaryExpression(node)) { return this.isPure(node.argument, constantsOnly); + } else if (t.isTaggedTemplateExpression(node)) { + return ( + t.matchesPattern(node.tag, "String.raw") && + !this.hasBinding("String", true) && + this.isPure(node.quasi, constantsOnly) + ); + } else if (t.isTemplateLiteral(node)) { + for (const expression of (node.expressions: Array)) { + if (!this.isPure(expression, constantsOnly)) return false; + } + return true; } else { return t.isPureish(node); } diff --git a/packages/babel-traverse/test/scope.js b/packages/babel-traverse/test/scope.js index 1017f85f88..e3699561ab 100644 --- a/packages/babel-traverse/test/scope.js +++ b/packages/babel-traverse/test/scope.js @@ -77,6 +77,22 @@ describe("scope", function() { assert.ok( getPath("({ x: 1 })").get("body")[0].get("expression").isPure(), ); + assert.ok(!getPath("`${a}`").get("body")[0].get("expression").isPure()); + assert.ok( + getPath("let a = 1; `${a}`").get("body")[1].get("expression").isPure(), + ); + assert.ok( + !getPath("let a = 1; `${a++}`") + .get("body")[1] + .get("expression") + .isPure(), + ); + assert.ok( + !getPath("tagged`foo`").get("body")[0].get("expression").isPure(), + ); + assert.ok( + getPath("String.raw`foo`").get("body")[0].get("expression").isPure(), + ); }); test("label", function() {