From ad0e1ba6decacca48a567b91001a3848fc32ab2f Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 8 Jun 2016 13:07:54 -0400 Subject: [PATCH 1/4] Support changes in flow parsing --- packages/babel-generator/src/generators/flow.js | 14 ++++++++++++++ packages/babel-generator/src/generators/types.js | 10 ---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index d886840e27..cceef1c9f0 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -187,6 +187,20 @@ export function TypeAnnotation(node: Object) { this.print(node.typeAnnotation, node); } +export function TypeParameter(node: Object) { + if (node.variance === "plus") { + this.push("+"); + } else if (node.variance === "minus") { + this.push("-"); + } + + this.push(node.name); + + if (node.bound) { + this.print(node.bound, node); + } +} + export function TypeParameterInstantiation(node: Object) { this.push("<"); this.printJoin(node.params, node, { diff --git a/packages/babel-generator/src/generators/types.js b/packages/babel-generator/src/generators/types.js index 6ca86a74e1..aed1c3f35c 100644 --- a/packages/babel-generator/src/generators/types.js +++ b/packages/babel-generator/src/generators/types.js @@ -4,16 +4,6 @@ import * as t from "babel-types"; export function Identifier(node: Object) { - // FIXME: We hang variance off Identifer to support Flow's def-site variance. - // This is a terrible hack, but changing type annotations to use a new, - // dedicated node would be a breaking change. This should be cleaned up in - // the next major. - if (node.variance === "plus") { - this.push("+"); - } else if (node.variance === "minus") { - this.push("-"); - } - this.push(node.name); } From 63e83137882e35c6f337882e6147e65bbc192bff Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 8 Jun 2016 16:16:22 -0400 Subject: [PATCH 2/4] add type def --- packages/babel-types/src/definitions/flow.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/babel-types/src/definitions/flow.js b/packages/babel-types/src/definitions/flow.js index d01da22505..95f9b40077 100644 --- a/packages/babel-types/src/definitions/flow.js +++ b/packages/babel-types/src/definitions/flow.js @@ -233,6 +233,14 @@ defineType("TypeCastExpression", { } }); +defineType("TypeParameter", { + visitor: ["name", "bound"], + aliases: ["Flow"], + fields: { + // todo + } +}); + defineType("TypeParameterDeclaration", { visitor: ["params"], aliases: ["Flow"], From ff42a744df6915f6209ec9113c38762ca4314926 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 10 Jun 2016 17:07:03 -0400 Subject: [PATCH 3/4] add back in identifier --- packages/babel-generator/src/generators/types.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/babel-generator/src/generators/types.js b/packages/babel-generator/src/generators/types.js index aed1c3f35c..5eb8e1148d 100644 --- a/packages/babel-generator/src/generators/types.js +++ b/packages/babel-generator/src/generators/types.js @@ -4,6 +4,18 @@ import * as t from "babel-types"; export function Identifier(node: Object) { + // FIXME: We hang variance off Identifer to support Flow's def-site variance. + // This is a terrible hack, but changing type annotations to use a new, + // dedicated node would be a breaking change. This should be cleaned up in + // the next major. + if (node.variance) { + if (node.variance === "plus") { + this.push("+"); + } else if (node.variance === "minus") { + this.push("-"); + } + } + this.push(node.name); } From b567c024136b875cf99540cf893436b1a427219c Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 10 Jun 2016 18:05:51 -0400 Subject: [PATCH 4/4] generator tests --- .../babel-generator/src/generators/flow.js | 7 +++++++ .../fixtures/flow/type-parameters/actual.js | 21 +++++++++++++++++++ .../fixtures/flow/type-parameters/expected.js | 21 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 packages/babel-generator/test/fixtures/flow/type-parameters/actual.js create mode 100644 packages/babel-generator/test/fixtures/flow/type-parameters/expected.js diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index cceef1c9f0..15f39923ca 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -199,6 +199,13 @@ export function TypeParameter(node: Object) { if (node.bound) { this.print(node.bound, node); } + + if (node.default) { + this.space(); + this.push("="); + this.space(); + this.print(node.default, node); + } } export function TypeParameterInstantiation(node: Object) { diff --git a/packages/babel-generator/test/fixtures/flow/type-parameters/actual.js b/packages/babel-generator/test/fixtures/flow/type-parameters/actual.js new file mode 100644 index 0000000000..8c307485e8 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/type-parameters/actual.js @@ -0,0 +1,21 @@ +type A = T; +type A = T; +type A = T; +type A = T; +type A = T; +class A {}; +class A {}; +class A {}; +class A {}; +(class A {}); +(class A {}); +(class A {}); +(class A {}); +declare class A {}; +declare class A {}; +declare class A {}; +declare class A {}; +interface A {}; +interface A {}; +interface A {}; +interface A {}; diff --git a/packages/babel-generator/test/fixtures/flow/type-parameters/expected.js b/packages/babel-generator/test/fixtures/flow/type-parameters/expected.js new file mode 100644 index 0000000000..8c307485e8 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/type-parameters/expected.js @@ -0,0 +1,21 @@ +type A = T; +type A = T; +type A = T; +type A = T; +type A = T; +class A {}; +class A {}; +class A {}; +class A {}; +(class A {}); +(class A {}); +(class A {}); +(class A {}); +declare class A {}; +declare class A {}; +declare class A {}; +declare class A {}; +interface A {}; +interface A {}; +interface A {}; +interface A {};