From 5cbe963ddef43c703a3edafa02c0da646546ebc2 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Thu, 6 Apr 2017 14:28:13 -0400 Subject: [PATCH] account for computed variables in properties --- .../src/use-built-ins-plugin.js | 29 ++++++++++---- .../builtins-used-instance-methods/actual.js | 8 ++++ .../expected.js | 39 ++++++++++++------- .../builtins-used/actual.js | 6 --- .../builtins-used/expected.js | 17 +++----- 5 files changed, 60 insertions(+), 39 deletions(-) diff --git a/experimental/babel-preset-env/src/use-built-ins-plugin.js b/experimental/babel-preset-env/src/use-built-ins-plugin.js index 8b4ce3ce0b..a764d44d8f 100644 --- a/experimental/babel-preset-env/src/use-built-ins-plugin.js +++ b/experimental/babel-preset-env/src/use-built-ins-plugin.js @@ -143,14 +143,27 @@ Please remove the call or use 'useBuiltIns: "entry"' instead. warnOnInstanceMethod(state, getObjectString(node)); const builtIn = definitions.instanceMethods[prop.name]; addUnsupported(path, state.opts.polyfills, builtIn, this.builtIns); - } else if ( - node.computed && - t.isStringLiteral(prop) && - has(definitions.instanceMethods, prop.value) - ) { - warnOnInstanceMethod(state, `${obj.name}['${prop.value}']`); - const builtIn = definitions.instanceMethods[prop.value]; - addUnsupported(path, state.opts.polyfills, builtIn, this.builtIns); + } else if (node.computed) { + if ( + t.isStringLiteral(prop) && + has(definitions.instanceMethods, prop.value) + ) { + const builtIn = definitions.instanceMethods[prop.value]; + warnOnInstanceMethod(state, `${obj.name}['${prop.value}']`); + addUnsupported(path, state.opts.polyfills, builtIn, this.builtIns); + } else { + const res = path.get("property").evaluate(); + if (res.confident) { + const builtIn = definitions.instanceMethods[res.value]; + warnOnInstanceMethod(state, `${obj.name}['${res.value}']`); + addUnsupported( + path.get("property"), + state.opts.polyfills, + builtIn, + this.builtIns, + ); + } + } } }, diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/actual.js index 35cd0f9960..4528eff880 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/actual.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/actual.js @@ -10,3 +10,11 @@ e.padStart.apply(); // .apply f.padEnd.call(); // .call String.prototype.startsWith.call; // prototype.call var { codePointAt, endsWith } = k; // destructuring + +var asdf = "copyWithin"; +var asdf2 = "split"; +var asdf3 = "re" + "place"; +i[asdf]; // computed with identifier +j[`search`]; // computed with template +k[asdf3] // computed with concat strings +var { [asdf2]: _a } = k; // computed diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/expected.js index 0d40369620..056234f92d 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/expected.js @@ -1,15 +1,19 @@ -import 'core-js/modules/es6.string.ends-with'; -import 'core-js/modules/es6.string.code-point-at'; -import 'core-js/modules/es6.string.starts-with'; -import 'core-js/modules/es7.string.pad-end'; -import 'core-js/modules/es7.string.pad-start'; -import 'core-js/modules/es6.array.fill'; -import 'core-js/modules/es6.array.find-index'; -import 'core-js/modules/es6.array.find'; -import 'core-js/modules/es7.array.includes'; -import 'core-js/modules/es6.string.includes'; -import 'core-js/modules/es6.map'; -import 'core-js/modules/es6.array.from'; +import "core-js/modules/es6.regexp.split"; +import "core-js/modules/es6.regexp.replace"; +import "core-js/modules/es6.regexp.search"; +import "core-js/modules/es6.array.copy-within"; +import "core-js/modules/es6.string.ends-with"; +import "core-js/modules/es6.string.code-point-at"; +import "core-js/modules/es6.string.starts-with"; +import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/es7.string.pad-start"; +import "core-js/modules/es6.array.fill"; +import "core-js/modules/es6.array.find-index"; +import "core-js/modules/es6.array.find"; +import "core-js/modules/es7.array.includes"; +import "core-js/modules/es6.string.includes"; +import "core-js/modules/es6.map"; +import "core-js/modules/es6.array.from"; Array.from; // static function Map; // top level built-in @@ -23,4 +27,13 @@ f.padEnd.call(); // .call String.prototype.startsWith.call; // prototype.call var _k = k, codePointAt = _k.codePointAt, - endsWith = _k.endsWith; // destructuring \ No newline at end of file + endsWith = _k.endsWith; // destructuring + +var asdf = "copyWithin"; +var asdf2 = "split"; +var asdf3 = "re" + "place"; +i[asdf]; // computed with identifier +j["search"]; // computed with template +k[asdf3]; // computed with concat strings +var _k2 = k, + _a = _k2[asdf2]; // computed diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/actual.js index 45366a4fcb..fff74225a2 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/actual.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/actual.js @@ -16,9 +16,3 @@ _arr9[Symbol.iterator2](); G.assign; // static method function H(WeakMap) { var blah = new WeakMap(); } // shadowed - -// not covered by this plugin -var asdf = 'copyWithin'; -i[asdf] // computed with identifier -j[`copyWithin`] // computed with template -var { [asdf]: _a } = k; // computed diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/expected.js index 270ecc6055..67cbc7094f 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/expected.js @@ -1,8 +1,8 @@ -import 'core-js/modules/es6.symbol'; -import 'core-js/modules/es6.regexp.match'; -import 'core-js/modules/es6.promise'; -import 'core-js/modules/es6.map'; -import 'core-js/modules/es6.array.from'; +import "core-js/modules/es6.symbol"; +import "core-js/modules/es6.regexp.match"; +import "core-js/modules/es6.promise"; +import "core-js/modules/es6.map"; +import "core-js/modules/es6.array.from"; Array.from; // static method Map; // built-in new Promise(); // new builtin @@ -23,10 +23,3 @@ G.assign; // static method function H(WeakMap) { var blah = new WeakMap(); } // shadowed - -// not covered by this plugin -var asdf = 'copyWithin'; -i[asdf]; // computed with identifier -j['copyWithin']; // computed with template -var _k = k, - _a = _k[asdf]; // computed \ No newline at end of file