From b1b69e447710d93d221ecdb72e9ddd4802f262ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 13 Feb 2020 00:05:19 +0100 Subject: [PATCH] Mark `wrapNativeSuper` and `wrapRegExp` as pure --- .../package.json | 1 + .../src/index.js | 14 ++++++++------ .../src/transformClass.js | 14 +++++++++----- .../test/fixtures/extend-builtins/loose/output.js | 2 +- .../test/fixtures/extend-builtins/spec/output.js | 2 +- .../test/fixtures/regression/8499/output.js | 2 +- .../test/fixtures/wrapper/basic/output.js | 2 +- .../skips-anonymous-capturing-groups/output.js | 2 +- .../plugins-integration/issue-7527/output.js | 2 +- 9 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/babel-helper-create-regexp-features-plugin/package.json b/packages/babel-helper-create-regexp-features-plugin/package.json index a08a20b5ddb3..dbf36b942a27 100644 --- a/packages/babel-helper-create-regexp-features-plugin/package.json +++ b/packages/babel-helper-create-regexp-features-plugin/package.json @@ -18,6 +18,7 @@ "babel-plugin" ], "dependencies": { + "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", "regexpu-core": "^4.6.0" }, diff --git a/packages/babel-helper-create-regexp-features-plugin/src/index.js b/packages/babel-helper-create-regexp-features-plugin/src/index.js index 49554be42ad2..60b7f2a682d2 100644 --- a/packages/babel-helper-create-regexp-features-plugin/src/index.js +++ b/packages/babel-helper-create-regexp-features-plugin/src/index.js @@ -11,6 +11,7 @@ import { generateRegexpuOptions } from "./util"; import pkg from "../package.json"; import { types as t } from "@babel/core"; import { pullFlag } from "@babel/helper-regex"; +import annotateAsPure from "@babel/helper-annotate-as-pure"; // Note: Versions are represented as an integer. e.g. 7.1.5 is represented // as 70000100005. This method is easier than using a semver-parsing @@ -68,12 +69,13 @@ export function createRegExpFeaturePlugin({ name, feature, options = {} }) { runtime && !isRegExpTest(path) ) { - path.replaceWith( - t.callExpression(this.addHelper("wrapRegExp"), [ - node, - t.valueToNode(namedCaptureGroups), - ]), - ); + const call = t.callExpression(this.addHelper("wrapRegExp"), [ + node, + t.valueToNode(namedCaptureGroups), + ]); + annotateAsPure(call); + + path.replaceWith(call); } if (hasFeature(features, FEATURES.unicodeFlag)) { pullFlag(node, "u"); diff --git a/packages/babel-plugin-transform-classes/src/transformClass.js b/packages/babel-plugin-transform-classes/src/transformClass.js index 0335e363439a..308e2711abb0 100644 --- a/packages/babel-plugin-transform-classes/src/transformClass.js +++ b/packages/babel-plugin-transform-classes/src/transformClass.js @@ -6,6 +6,7 @@ import ReplaceSupers, { import optimiseCall from "@babel/helper-optimise-call-expression"; import * as defineMap from "@babel/helper-define-map"; import { traverse, template, types as t } from "@babel/core"; +import annotateAsPure from "@babel/helper-annotate-as-pure"; type ReadonlySet = Set | { has(val: T): boolean }; @@ -565,11 +566,14 @@ export default function transformClass( const closureArgs = []; if (classState.isDerived) { - const arg = classState.extendsNative - ? t.callExpression(classState.file.addHelper("wrapNativeSuper"), [ - t.cloneNode(superName), - ]) - : t.cloneNode(superName); + let arg = t.cloneNode(superName); + if (classState.extendsNative) { + arg = t.callExpression(classState.file.addHelper("wrapNativeSuper"), [ + arg, + ]); + annotateAsPure(arg); + } + const param = classState.scope.generateUidIdentifierBasedOnNode( superName, ); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/extend-builtins/loose/output.js b/packages/babel-plugin-transform-classes/test/fixtures/extend-builtins/loose/output.js index 566ddd8ac0a7..c31cfcaef370 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/extend-builtins/loose/output.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/extend-builtins/loose/output.js @@ -22,4 +22,4 @@ var List = /*#__PURE__*/function (_Array) { } return List; -}(_wrapNativeSuper(Array)); +}( /*#__PURE__*/_wrapNativeSuper(Array)); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/extend-builtins/spec/output.js b/packages/babel-plugin-transform-classes/test/fixtures/extend-builtins/spec/output.js index 67948505334b..7813c0c9e26a 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/extend-builtins/spec/output.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/extend-builtins/spec/output.js @@ -30,4 +30,4 @@ var List = /*#__PURE__*/function (_Array) { } return List; -}(_wrapNativeSuper(Array)); +}( /*#__PURE__*/_wrapNativeSuper(Array)); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/8499/output.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/8499/output.js index 8cc8d35cd682..6ace03a2e269 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/regression/8499/output.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/regression/8499/output.js @@ -20,7 +20,7 @@ var CustomElement = /*#__PURE__*/function (_HTMLElement) { } return CustomElement; -}(babelHelpers.wrapNativeSuper(HTMLElement)); +}( /*#__PURE__*/babelHelpers.wrapNativeSuper(HTMLElement)); ; new CustomElement(); diff --git a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/wrapper/basic/output.js b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/wrapper/basic/output.js index 2c6eed2f6dec..779aac3d8537 100644 --- a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/wrapper/basic/output.js +++ b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/wrapper/basic/output.js @@ -1,3 +1,3 @@ -"foo".match(babelHelpers.wrapRegExp(/(.)\1/, { +"foo".match( /*#__PURE__*/babelHelpers.wrapRegExp(/(.)\1/, { double: 1 })); diff --git a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/wrapper/skips-anonymous-capturing-groups/output.js b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/wrapper/skips-anonymous-capturing-groups/output.js index f9da17ab47a1..16f5e24236b2 100644 --- a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/wrapper/skips-anonymous-capturing-groups/output.js +++ b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/wrapper/skips-anonymous-capturing-groups/output.js @@ -1,3 +1,3 @@ -"abba".match(babelHelpers.wrapRegExp(/(.)(.)\2\1/, { +"abba".match( /*#__PURE__*/babelHelpers.wrapRegExp(/(.)(.)\2\1/, { n: 2 })); diff --git a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-7527/output.js b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-7527/output.js index e7cd33a7d905..febcf6c43811 100644 --- a/packages/babel-preset-env/test/fixtures/plugins-integration/issue-7527/output.js +++ b/packages/babel-preset-env/test/fixtures/plugins-integration/issue-7527/output.js @@ -32,6 +32,6 @@ var MyDate = /*#__PURE__*/function (_Date) { } return MyDate; -}(_wrapNativeSuper(Date)); +}( /*#__PURE__*/_wrapNativeSuper(Date)); var myDate = new MyDate();