From d90aaf2c7618f5c89ef45e1601b2b594d818bf5a Mon Sep 17 00:00:00 2001 From: Dan Harper Date: Fri, 16 Dec 2016 20:31:05 +0000 Subject: [PATCH] Print Flow optional & type annotations in function params with defaults (#4872) Fixes #4863 --- packages/babel-generator/src/generators/expressions.js | 2 ++ .../test/fixtures/flow/type-annotations/actual.js | 2 ++ .../test/fixtures/flow/type-annotations/expected.js | 2 ++ packages/babel-plugin-transform-flow-comments/src/index.js | 6 ++++++ .../fixtures/flow-comments/default-parameters/actual.js | 6 ++++++ .../fixtures/flow-comments/default-parameters/expected.js | 6 ++++++ .../babel-plugin-transform-flow-strip-types/src/index.js | 4 ++++ .../test/fixtures/strip-types/default-parameters/actual.js | 6 ++++++ .../fixtures/strip-types/default-parameters/expected.js | 6 ++++++ 9 files changed, 40 insertions(+) create mode 100644 packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/default-parameters/actual.js create mode 100644 packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/default-parameters/expected.js create mode 100644 packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/default-parameters/actual.js create mode 100644 packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/default-parameters/expected.js diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index 26ab26a0f9..b38cebed54 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -148,6 +148,8 @@ export function ExpressionStatement(node: Object) { export function AssignmentPattern(node: Object) { this.print(node.left, node); + if (node.left.optional) this.token("?"); + this.print(node.left.typeAnnotation, node); this.space(); this.token("="); this.space(); diff --git a/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js b/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js index 38a735a212..2690152d34 100644 --- a/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js +++ b/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js @@ -115,3 +115,5 @@ var a: {| [a: number]: string; [b: number]: string; |}; var a: {| add(x: number, ...y: Array): void |}; var a: {| subtract: (x: number, ...y: Array) => void |}; var a: {| id(x: T): T; |}; +function foo(numVal: number = 2) {} +function foo(numVal?: number = 2) {} diff --git a/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js b/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js index f4227b5378..7a9406eaa3 100644 --- a/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js +++ b/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js @@ -119,3 +119,5 @@ var a: {| [a: number]: string; [b: number]: string; |}; var a: {| add: (x: number, ...y: Array) => void |}; var a: {| subtract: (x: number, ...y: Array) => void |}; var a: {| id: (x: T) => T |}; +function foo(numVal: number = 2) {} +function foo(numVal?: number = 2) {} diff --git a/packages/babel-plugin-transform-flow-comments/src/index.js b/packages/babel-plugin-transform-flow-comments/src/index.js index 4feb0fc422..ece00a024a 100644 --- a/packages/babel-plugin-transform-flow-comments/src/index.js +++ b/packages/babel-plugin-transform-flow-comments/src/index.js @@ -30,6 +30,12 @@ export default function ({ types: t }) { path.addComment("trailing", ":: ?"); }, + AssignmentPattern: { + exit({ node }) { + node.left.optional = false; + } + }, + // strip optional property from function params - facebook/fbjs#17 Function: { exit({ node }) { diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/default-parameters/actual.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/default-parameters/actual.js new file mode 100644 index 0000000000..80b37942a2 --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/default-parameters/actual.js @@ -0,0 +1,6 @@ +function foo(numVal?) {} +function foo(numVal? = 2) {} +function foo(numVal: number) {} +function foo(numVal?: number) {} +function foo(numVal: number = 2) {} +function foo(numVal?: number = 2) {} \ No newline at end of file diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/default-parameters/expected.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/default-parameters/expected.js new file mode 100644 index 0000000000..96716bf20d --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/default-parameters/expected.js @@ -0,0 +1,6 @@ +function foo(numVal /*:: ?*/) {} +function foo(numVal /*:: ?*/ = 2) {} +function foo(numVal /*: number*/) {} +function foo(numVal /*:: ?: number*/) {} +function foo(numVal /*: number*/ = 2) {} +function foo(numVal /*:: ?: number*/ = 2) {} \ No newline at end of file diff --git a/packages/babel-plugin-transform-flow-strip-types/src/index.js b/packages/babel-plugin-transform-flow-strip-types/src/index.js index 24e9bf8d10..c64abb9a52 100644 --- a/packages/babel-plugin-transform-flow-strip-types/src/index.js +++ b/packages/babel-plugin-transform-flow-strip-types/src/index.js @@ -40,6 +40,10 @@ export default function ({ types: t }) { }); }, + AssignmentPattern({ node }) { + node.left.optional = false; + }, + Function({ node }) { for (let i = 0; i < node.params.length; i++) { let param = node.params[i]; diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/default-parameters/actual.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/default-parameters/actual.js new file mode 100644 index 0000000000..80b37942a2 --- /dev/null +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/default-parameters/actual.js @@ -0,0 +1,6 @@ +function foo(numVal?) {} +function foo(numVal? = 2) {} +function foo(numVal: number) {} +function foo(numVal?: number) {} +function foo(numVal: number = 2) {} +function foo(numVal?: number = 2) {} \ No newline at end of file diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/default-parameters/expected.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/default-parameters/expected.js new file mode 100644 index 0000000000..8c20fd2ba8 --- /dev/null +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/default-parameters/expected.js @@ -0,0 +1,6 @@ +function foo(numVal) {} +function foo(numVal = 2) {} +function foo(numVal) {} +function foo(numVal) {} +function foo(numVal = 2) {} +function foo(numVal = 2) {} \ No newline at end of file