From 41f2bbc1049e05b34ea33d8cb41777d3c624b70a Mon Sep 17 00:00:00 2001 From: Dan Harper Date: Mon, 12 Sep 2016 13:27:49 +0100 Subject: [PATCH] Flow: Fix generating arrow functions with param (#4504) * transform-flow-comments, single arrow param support #4503 * further tests for printing single arrow func param flow code * cleanup --- packages/babel-generator/src/generators/methods.js | 10 ++++++++-- .../test/fixtures/flow/arrow-functions/actual.js | 7 +++++++ .../test/fixtures/flow/arrow-functions/expected.js | 7 +++++++ .../arrow-single-optional-param/actual.js | 1 + .../arrow-single-optional-param/expected.js | 1 + .../flow-comments/arrow-single-param-type/actual.js | 1 + .../flow-comments/arrow-single-param-type/expected.js | 1 + 7 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 packages/babel-generator/test/fixtures/flow/arrow-functions/actual.js create mode 100644 packages/babel-generator/test/fixtures/flow/arrow-functions/expected.js create mode 100644 packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-optional-param/actual.js create mode 100644 packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-optional-param/expected.js create mode 100644 packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-param-type/actual.js create mode 100644 packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-param-type/expected.js diff --git a/packages/babel-generator/src/generators/methods.js b/packages/babel-generator/src/generators/methods.js index 39c9c1714c..720aa0c87b 100644 --- a/packages/babel-generator/src/generators/methods.js +++ b/packages/babel-generator/src/generators/methods.js @@ -77,8 +77,10 @@ export function ArrowFunctionExpression(node: Object) { this.space(); } - if (node.params.length === 1 && t.isIdentifier(node.params[0])) { - this.print(node.params[0], node); + const firstParam = node.params[0]; + + if (node.params.length === 1 && t.isIdentifier(firstParam) && !hasTypes(node, firstParam)) { + this.print(firstParam, node); } else { this._params(node); } @@ -89,3 +91,7 @@ export function ArrowFunctionExpression(node: Object) { this.print(node.body, node); } + +function hasTypes(node, param) { + return node.typeParameters || node.returnType || param.typeAnnotation || param.optional || param.trailingComments; +} diff --git a/packages/babel-generator/test/fixtures/flow/arrow-functions/actual.js b/packages/babel-generator/test/fixtures/flow/arrow-functions/actual.js new file mode 100644 index 0000000000..a3d11b136d --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/arrow-functions/actual.js @@ -0,0 +1,7 @@ +const bar1 = (x: number): string => {}; +const bar2 = (x?) => {}; +const bar3 = (x?: string) => {}; +const bar4 = x => {}; +const bar5 = (x): string => {}; +const bar6 = (x: number) => {}; +const bar7 = (x) => {}; diff --git a/packages/babel-generator/test/fixtures/flow/arrow-functions/expected.js b/packages/babel-generator/test/fixtures/flow/arrow-functions/expected.js new file mode 100644 index 0000000000..a3d11b136d --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/arrow-functions/expected.js @@ -0,0 +1,7 @@ +const bar1 = (x: number): string => {}; +const bar2 = (x?) => {}; +const bar3 = (x?: string) => {}; +const bar4 = x => {}; +const bar5 = (x): string => {}; +const bar6 = (x: number) => {}; +const bar7 = (x) => {}; diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-optional-param/actual.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-optional-param/actual.js new file mode 100644 index 0000000000..c5e4866bdc --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-optional-param/actual.js @@ -0,0 +1 @@ +const x = (foo?) => {} diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-optional-param/expected.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-optional-param/expected.js new file mode 100644 index 0000000000..b4c55a0340 --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-optional-param/expected.js @@ -0,0 +1 @@ +const x = (foo /*:: ?*/) => {}; diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-param-type/actual.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-param-type/actual.js new file mode 100644 index 0000000000..c144edb9ae --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-param-type/actual.js @@ -0,0 +1 @@ +const x = (foo: string) => {}; diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-param-type/expected.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-param-type/expected.js new file mode 100644 index 0000000000..e29c6196f0 --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/arrow-single-param-type/expected.js @@ -0,0 +1 @@ +const x = (foo /*: string*/) => {};