From df908fc63b809444db3b7689b12a298a8d48f66d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 27 Oct 2020 13:12:49 +0100 Subject: [PATCH] Mark `ThisExpression` and `Super` as `Purish` (#12251) * Mark `ThisExpression` as `Purish` The other purish types are functions and literals, so I guess it means "it doesn't have side effects" * Super & tests * Fix tests --- packages/babel-traverse/test/scope.js | 13 +++++++++++++ packages/babel-types/src/definitions/core.js | 4 ++-- .../babel-types/src/validators/generated/index.js | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/babel-traverse/test/scope.js b/packages/babel-traverse/test/scope.js index 106c9631e6..f02089db6d 100644 --- a/packages/babel-traverse/test/scope.js +++ b/packages/babel-traverse/test/scope.js @@ -232,6 +232,19 @@ describe("scope", () => { expect( getPath("String.raw`foo`").get("body")[0].get("expression").isPure(), ).toBeTruthy(); + expect(getPath("this").get("body.0.expression").isPure()).toBeTruthy(); + expect(getPath("this.foo").get("body.0.expression").isPure()).toBeFalsy(); + expect( + getPath("({ m() { super.foo } })") + .get("body.0.expression.properties.0.body.body.0.expression") + .isPure(), + ).toBeFalsy(); + expect( + // This only tests "super", not "super.foo" + getPath("({ m() { super.foo } })") + .get("body.0.expression.properties.0.body.body.0.expression.object") + .isPure(), + ).toBeTruthy(); }); test("label", function () { diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index 51be45bfd7..57b45a17ba 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -980,7 +980,7 @@ defineType("SwitchStatement", { }); defineType("ThisExpression", { - aliases: ["Expression"], + aliases: ["Expression", "Pureish"], }); defineType("ThrowStatement", { @@ -1785,7 +1785,7 @@ defineType("SpreadElement", { }); defineType("Super", { - aliases: ["Expression"], + aliases: ["Expression", "Pureish"], }); defineType("TaggedTemplateExpression", { diff --git a/packages/babel-types/src/validators/generated/index.js b/packages/babel-types/src/validators/generated/index.js index 2bf0ed62ea..2fb59235c3 100644 --- a/packages/babel-types/src/validators/generated/index.js +++ b/packages/babel-types/src/validators/generated/index.js @@ -3965,7 +3965,9 @@ export function isPureish(node: ?Object, opts?: Object): boolean { "NullLiteral" === nodeType || "BooleanLiteral" === nodeType || "RegExpLiteral" === nodeType || + "ThisExpression" === nodeType || "ArrowFunctionExpression" === nodeType || + "Super" === nodeType || "BigIntLiteral" === nodeType || "DecimalLiteral" === nodeType || (nodeType === "Placeholder" && "StringLiteral" === node.expectedNode)