diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index d886840e27..15f39923ca 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -187,6 +187,27 @@ 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); + } + + if (node.default) { + this.space(); + this.push("="); + this.space(); + this.print(node.default, 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..5eb8e1148d 100644 --- a/packages/babel-generator/src/generators/types.js +++ b/packages/babel-generator/src/generators/types.js @@ -8,10 +8,12 @@ export function Identifier(node: Object) { // 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("-"); + if (node.variance) { + if (node.variance === "plus") { + this.push("+"); + } else if (node.variance === "minus") { + this.push("-"); + } } this.push(node.name); 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 {}; 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"],