diff --git a/packages/babel-helper-remap-async-to-generator/src/index.js b/packages/babel-helper-remap-async-to-generator/src/index.js index ea9e55e8d5..749cf8a0d5 100644 --- a/packages/babel-helper-remap-async-to-generator/src/index.js +++ b/packages/babel-helper-remap-async-to-generator/src/index.js @@ -14,11 +14,24 @@ let buildWrapper = template(` }) `); +let arrowBuildWrapper = template(` + (() => { + var ref = FUNCTION; + return (PARAMS) => ref.apply(this, arguments); + }) +`); + let awaitVisitor = { Function(path) { path.skip(); }, + ArrowFunctionExpression(path) { + if (!path.node.async) { + path.arrowFunctionToShadowed(); + } + }, + AwaitExpression({ node }) { node.type = "YieldExpression"; } @@ -42,9 +55,11 @@ function classOrObjectMethod(path: NodePath, callId: Object) { function plainFunction(path: NodePath, callId: Object) { let node = path.node; + let wrapper = buildWrapper; if (path.isArrowFunctionExpression()) { path.arrowFunctionToShadowed(); + wrapper = arrowBuildWrapper; } node.async = false; @@ -60,7 +75,7 @@ function plainFunction(path: NodePath, callId: Object) { } let built = t.callExpression(callId, [node]); - let container = buildWrapper({ + let container = wrapper({ FUNCTION: built, PARAMS: node.params.map(() => path.scope.generateUidIdentifier("x")) }).expression; diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-arrow-in-method/actual.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-arrow-in-method/actual.js new file mode 100644 index 0000000000..7855375f12 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-arrow-in-method/actual.js @@ -0,0 +1,10 @@ +let TestClass = { + name: "John Doe", + + testMethodFailure() { + return new Promise(async (resolve) => { + console.log(this); + setTimeout(resolve, 1000); + }); + } +}; diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-arrow-in-method/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-arrow-in-method/expected.js new file mode 100644 index 0000000000..bec925324f --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/async-arrow-in-method/expected.js @@ -0,0 +1,15 @@ +let TestClass = { + name: "John Doe", + + testMethodFailure() { + return new Promise((() => { + var _this = this; + + var ref = babelHelpers.asyncToGenerator(function* (resolve) { + console.log(_this); + setTimeout(resolve, 1000); + }); + return _x => ref.apply(this, arguments); + })()); + } +}; diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/actual.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/actual.js new file mode 100644 index 0000000000..9949fbb612 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/actual.js @@ -0,0 +1,13 @@ +async function s(x) { + let t = async (y) => { + let r = async (z) => { + await z; + return this.x; + } + await r; + + return this.g(r); + } + await t; + return this.h(t); +} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/expected.js new file mode 100644 index 0000000000..04d2813c76 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/expected.js @@ -0,0 +1,28 @@ +let s = function () { + var ref = babelHelpers.asyncToGenerator(function* (x) { + let t = (() => { + var _this2 = this; + + var ref = babelHelpers.asyncToGenerator(function* (y) { + let r = (() => { + var _this = this; + + var ref = babelHelpers.asyncToGenerator(function* (z) { + yield z; + return _this.x; + }); + return _x3 => ref.apply(this, arguments); + })(); + yield r; + + return _this2.g(r); + }); + return _x2 => ref.apply(this, arguments); + })(); + yield t; + return this.h(t); + }); + return function s(_x) { + return ref.apply(this, arguments); + }; +}(); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/object-method-with-arrows/actual.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/object-method-with-arrows/actual.js new file mode 100644 index 0000000000..e69bddc32a --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/object-method-with-arrows/actual.js @@ -0,0 +1,6 @@ +class Class { + async method() { + this; + () => this; + } +} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/object-method-with-arrows/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/object-method-with-arrows/expected.js new file mode 100644 index 0000000000..809d505d9f --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/object-method-with-arrows/expected.js @@ -0,0 +1,12 @@ +class Class { + method() { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + _this; + (function () { + return _this; + }); + })(); + } +}