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)