From ad81f5b1495137321cd7ba9a48283641ea6ff473 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 20 Jan 2016 09:36:28 -0500 Subject: [PATCH 1/3] check if valid.id is defined --- packages/babel-helper-define-map/src/index.js | 4 +-- .../test/fixtures/regression/T7010/actual.js | 8 ++++++ .../fixtures/regression/T7010/expected.js | 27 +++++++++++++++++++ .../fixtures/regression/T7010/options.json | 6 +++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/actual.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/expected.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/options.json diff --git a/packages/babel-helper-define-map/src/index.js b/packages/babel-helper-define-map/src/index.js index 0cc8e78f56..59c93d8f54 100644 --- a/packages/babel-helper-define-map/src/index.js +++ b/packages/babel-helper-define-map/src/index.js @@ -65,8 +65,8 @@ export function push(mutatorMap: Object, node: Object, kind: string, file, scope value = nameFunction({ id: key, node: value, scope }); // Class methods don't have their name bound in the funciton body. - if (t.isClassMethod(node)) { - value.id[t.NOT_LOCAL_BINDING] = true + if (t.isClassMethod(node) && value.id) { + value.id[t.NOT_LOCAL_BINDING] = true; } } diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/actual.js new file mode 100644 index 0000000000..9d88add5e7 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/actual.js @@ -0,0 +1,8 @@ +class Foo { + constructor(val){ + this._val = val; + } + foo2(){ + return foo2(this._val); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/expected.js new file mode 100644 index 0000000000..3d1429e059 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/expected.js @@ -0,0 +1,27 @@ +"use strict"; + +var Foo = function () { + function Foo(val) { + babelHelpers.classCallCheck(this, Foo); + + this._val = val; + } + + babelHelpers.createClass(Foo, [{ + key: "foo2", + value: function (_foo) { + function foo2() { + return _foo.apply(this, arguments); + } + + foo2.toString = function () { + return _foo.toString(); + }; + + return foo2; + }(function () { + return foo2(this._val); + }) + }]); + return Foo; +}(); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/options.json b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/options.json new file mode 100644 index 0000000000..0e54cbef72 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T7010/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "transform-es2015-classes", + "external-helpers" + ] +} From da106e2bf4367489c358c8c1dbf0e2f0d253e22e Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 22 Jan 2016 14:42:07 -0500 Subject: [PATCH 2/3] check for nested id --- packages/babel-helper-define-map/src/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/babel-helper-define-map/src/index.js b/packages/babel-helper-define-map/src/index.js index 59c93d8f54..4e1b7eccf5 100644 --- a/packages/babel-helper-define-map/src/index.js +++ b/packages/babel-helper-define-map/src/index.js @@ -65,8 +65,12 @@ export function push(mutatorMap: Object, node: Object, kind: string, file, scope value = nameFunction({ id: key, node: value, scope }); // Class methods don't have their name bound in the funciton body. - if (t.isClassMethod(node) && value.id) { - value.id[t.NOT_LOCAL_BINDING] = true; + if (t.isClassMethod(node)) { + if (value.id) { + value.id[t.NOT_LOCAL_BINDING] = true; + } else if (t.isCallExpression(value) && t.isFunctionExpression(value.callee) && value.callee.id) { + value.callee.id[t.NOT_LOCAL_BINDING] = true; + } } } From c1a7fc93d01feb4c21eb42ff53c58830ab3aeca0 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Fri, 22 Jan 2016 14:07:57 -0800 Subject: [PATCH 3/3] Move setting NOT_LOCAL_BINDING to the function name helper --- packages/babel-helper-define-map/src/index.js | 9 --------- packages/babel-helper-function-name/src/index.js | 6 ++++++ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/babel-helper-define-map/src/index.js b/packages/babel-helper-define-map/src/index.js index 4e1b7eccf5..43c5c5a1c2 100644 --- a/packages/babel-helper-define-map/src/index.js +++ b/packages/babel-helper-define-map/src/index.js @@ -63,15 +63,6 @@ export function push(mutatorMap: Object, node: Object, kind: string, file, scope // infer function name if (scope && t.isStringLiteral(key) && (kind === "value" || kind === "initializer") && t.isFunctionExpression(value)) { value = nameFunction({ id: key, node: value, scope }); - - // Class methods don't have their name bound in the funciton body. - if (t.isClassMethod(node)) { - if (value.id) { - value.id[t.NOT_LOCAL_BINDING] = true; - } else if (t.isCallExpression(value) && t.isFunctionExpression(value.callee) && value.callee.id) { - value.callee.id[t.NOT_LOCAL_BINDING] = true; - } - } } if (value) { diff --git a/packages/babel-helper-function-name/src/index.js b/packages/babel-helper-function-name/src/index.js index ef06bb0993..544c504a6e 100644 --- a/packages/babel-helper-function-name/src/index.js +++ b/packages/babel-helper-function-name/src/index.js @@ -141,6 +141,7 @@ export default function ({ node, parent, scope, id }) { if (binding && binding.constant && scope.getBinding(id.name) === binding) { // always going to reference this method node.id = id; + node.id[t.NOT_LOCAL_BINDING] = true; return; } } @@ -163,6 +164,11 @@ export default function ({ node, parent, scope, id }) { name = t.toBindingIdentifierName(name); id = t.identifier(name); + // The id shouldn't be considered a local binding to the function because + // we are simply trying to set the function name and not actually create + // a local binding. + id[t.NOT_LOCAL_BINDING] = true; + let state = visit(node, name, scope); return wrap(state, node, id, scope) || node; }