From fcc5cecf06ac73436d6156042dd6b69ea99c627f Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Fri, 7 Oct 2016 14:23:40 -1000 Subject: [PATCH 1/3] Add variance node type and generate property variance annotations babel/babylon#161 adds parsing support for property variance annotations. This PR adds the necessary node type for the new Variance node and generate support for all the positions where variance can now appear. --- .../babel-generator/src/generators/classes.js | 1 + packages/babel-generator/src/generators/flow.js | 16 +++++++++++----- .../fixtures/flow/def-site-variance/actual.js | 12 ++++++++++++ .../fixtures/flow/def-site-variance/expected.js | 12 ++++++++++++ packages/babel-types/src/definitions/flow.js | 7 +++++++ 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/packages/babel-generator/src/generators/classes.js b/packages/babel-generator/src/generators/classes.js index db3151f51693..d19710da98dd 100644 --- a/packages/babel-generator/src/generators/classes.js +++ b/packages/babel-generator/src/generators/classes.js @@ -60,6 +60,7 @@ export function ClassProperty(node: Object) { this.print(node.key, node); this.token("]"); } else { + this.print(node.variance, node); this.print(node.key, node); } this.print(node.typeAnnotation, node); diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index ac1a9e0b2293..4c52b7ce02ce 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -221,11 +221,7 @@ export function TypeAnnotation(node: Object) { } export function TypeParameter(node: Object) { - if (node.variance === "plus") { - this.token("+"); - } else if (node.variance === "minus") { - this.token("-"); - } + this.print(node.variance, node); this.word(node.name); @@ -295,6 +291,7 @@ export function ObjectTypeIndexer(node: Object) { this.word("static"); this.space(); } + this.print(node.variance, node); this.token("["); this.print(node.id, node); this.token(":"); @@ -311,6 +308,7 @@ export function ObjectTypeProperty(node: Object) { this.word("static"); this.space(); } + this.print(node.variance, node); this.print(node.key, node); if (node.optional) this.token("?"); this.token(":"); @@ -344,3 +342,11 @@ export function TypeCastExpression(node: Object) { export function VoidTypeAnnotation() { this.word("void"); } + +export function Variance(node: Object) { + if (node.kind === "plus") { + this.token("+"); + } else if (node.kind === "minus") { + this.token("-"); + } +} diff --git a/packages/babel-generator/test/fixtures/flow/def-site-variance/actual.js b/packages/babel-generator/test/fixtures/flow/def-site-variance/actual.js index f046505722fe..28eda41e2e9f 100644 --- a/packages/babel-generator/test/fixtures/flow/def-site-variance/actual.js +++ b/packages/babel-generator/test/fixtures/flow/def-site-variance/actual.js @@ -1,3 +1,15 @@ class C<+T, -U> {} function f<+T, -U>() {} type T<+T, -U> = {}; +type T = { +p: T }; +type T = { -p: T }; +type T = { +[k:K]: V }; +type T = { -[k:K]: V }; +interface I { +p: T }; +interface I { -p: T }; +interface I { +[k:K]: V }; +interface I { -[k:K]: V }; +declare class I { +p: T }; +declare class I { -p: T }; +declare class I { +[k:K]: V }; +declare class I { -[k:K]: V }; diff --git a/packages/babel-generator/test/fixtures/flow/def-site-variance/expected.js b/packages/babel-generator/test/fixtures/flow/def-site-variance/expected.js index f046505722fe..77ee6a8454f3 100644 --- a/packages/babel-generator/test/fixtures/flow/def-site-variance/expected.js +++ b/packages/babel-generator/test/fixtures/flow/def-site-variance/expected.js @@ -1,3 +1,15 @@ class C<+T, -U> {} function f<+T, -U>() {} type T<+T, -U> = {}; +type T = { +p: T }; +type T = { -p: T }; +type T = { +[k: K]: V }; +type T = { -[k: K]: V }; +interface I { +p: T }; +interface I { -p: T }; +interface I { +[k: K]: V }; +interface I { -[k: K]: V }; +declare class I { +p: T }; +declare class I { -p: T }; +declare class I { +[k: K]: V }; +declare class I { -[k: K]: V }; diff --git a/packages/babel-types/src/definitions/flow.js b/packages/babel-types/src/definitions/flow.js index 9b5d20dff54d..e112816f1748 100644 --- a/packages/babel-types/src/definitions/flow.js +++ b/packages/babel-types/src/definitions/flow.js @@ -326,3 +326,10 @@ defineType("VoidTypeAnnotation", { // todo } }); + +defineType("Variance", { + aliases: ["Flow"], + fields: { + // todo + } +}); From c3d90e039805ec309c9f485c6f14b8986166795a Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Mon, 10 Oct 2016 14:06:46 -1000 Subject: [PATCH 2/3] Variance is no longer a separate node type This diff also adds tests to class properties and to the flow-strip-types transform. --- .../babel-generator/src/generators/classes.js | 2 +- .../babel-generator/src/generators/flow.js | 22 +++++++++---------- .../fixtures/flow/def-site-variance/actual.js | 4 +++- .../flow/def-site-variance/expected.js | 8 ++++++- .../strip-types/def-site-variance/actual.js | 18 +++++++++++++-- .../strip-types/def-site-variance/expected.js | 5 ++++- packages/babel-types/src/definitions/flow.js | 7 ------ 7 files changed, 42 insertions(+), 24 deletions(-) diff --git a/packages/babel-generator/src/generators/classes.js b/packages/babel-generator/src/generators/classes.js index d19710da98dd..67c3aed42b10 100644 --- a/packages/babel-generator/src/generators/classes.js +++ b/packages/babel-generator/src/generators/classes.js @@ -60,7 +60,7 @@ export function ClassProperty(node: Object) { this.print(node.key, node); this.token("]"); } else { - this.print(node.variance, node); + this._variance(node); this.print(node.key, node); } this.print(node.typeAnnotation, node); diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index 4c52b7ce02ce..555983380088 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -147,6 +147,14 @@ export function _interfaceish(node: Object) { this.print(node.body, node); } +export function _variance(node) { + if (node.variance === "plus") { + this.token("+"); + } else if (node.variance === "minus") { + this.token("-"); + } +} + export function InterfaceDeclaration(node: Object) { this.word("interface"); this.space(); @@ -221,7 +229,7 @@ export function TypeAnnotation(node: Object) { } export function TypeParameter(node: Object) { - this.print(node.variance, node); + this._variance(node); this.word(node.name); @@ -291,7 +299,7 @@ export function ObjectTypeIndexer(node: Object) { this.word("static"); this.space(); } - this.print(node.variance, node); + this._variance(node); this.token("["); this.print(node.id, node); this.token(":"); @@ -308,7 +316,7 @@ export function ObjectTypeProperty(node: Object) { this.word("static"); this.space(); } - this.print(node.variance, node); + this._variance(node); this.print(node.key, node); if (node.optional) this.token("?"); this.token(":"); @@ -342,11 +350,3 @@ export function TypeCastExpression(node: Object) { export function VoidTypeAnnotation() { this.word("void"); } - -export function Variance(node: Object) { - if (node.kind === "plus") { - this.token("+"); - } else if (node.kind === "minus") { - this.token("-"); - } -} diff --git a/packages/babel-generator/test/fixtures/flow/def-site-variance/actual.js b/packages/babel-generator/test/fixtures/flow/def-site-variance/actual.js index 28eda41e2e9f..a9cf25b9c27a 100644 --- a/packages/babel-generator/test/fixtures/flow/def-site-variance/actual.js +++ b/packages/babel-generator/test/fixtures/flow/def-site-variance/actual.js @@ -1,4 +1,4 @@ -class C<+T, -U> {} +class C1<+T, -U> {} function f<+T, -U>() {} type T<+T, -U> = {}; type T = { +p: T }; @@ -13,3 +13,5 @@ declare class I { +p: T }; declare class I { -p: T }; declare class I { +[k:K]: V }; declare class I { -[k:K]: V }; +class C2 { +p: T = e }; +class C3 { -p: T = e }; diff --git a/packages/babel-generator/test/fixtures/flow/def-site-variance/expected.js b/packages/babel-generator/test/fixtures/flow/def-site-variance/expected.js index 77ee6a8454f3..1538e1ec99c6 100644 --- a/packages/babel-generator/test/fixtures/flow/def-site-variance/expected.js +++ b/packages/babel-generator/test/fixtures/flow/def-site-variance/expected.js @@ -1,4 +1,4 @@ -class C<+T, -U> {} +class C1<+T, -U> {} function f<+T, -U>() {} type T<+T, -U> = {}; type T = { +p: T }; @@ -13,3 +13,9 @@ declare class I { +p: T }; declare class I { -p: T }; declare class I { +[k: K]: V }; declare class I { -[k: K]: V }; +class C2 { + +p: T = e; +}; +class C3 { + -p: T = e; +}; diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/def-site-variance/actual.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/def-site-variance/actual.js index f046505722fe..a97695f41813 100644 --- a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/def-site-variance/actual.js +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/def-site-variance/actual.js @@ -1,3 +1,17 @@ -class C<+T, -U> {} +class C1<+T, -U> {} function f<+T, -U>() {} -type T<+T, -U> = {}; +type T<+T, -U> = {} +type T = { +p: T } +type T = { -p: T } +type T = { +[k:K]: V } +type T = { -[k:K]: V } +interface I { +p: T } +interface I { -p: T } +interface I { +[k:K]: V } +interface I { -[k:K]: V } +declare class I { +p: T } +declare class I { -p: T } +declare class I { +[k:K]: V } +declare class I { -[k:K]: V } +class C2 { +p: T } +class C3 { -p: T } diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/def-site-variance/expected.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/def-site-variance/expected.js index 9eb99a782f8a..dce129ae1ec1 100644 --- a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/def-site-variance/expected.js +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/def-site-variance/expected.js @@ -1,2 +1,5 @@ -class C {} +class C1 {} function f() {} + +class C2 {} +class C3 {} diff --git a/packages/babel-types/src/definitions/flow.js b/packages/babel-types/src/definitions/flow.js index e112816f1748..9b5d20dff54d 100644 --- a/packages/babel-types/src/definitions/flow.js +++ b/packages/babel-types/src/definitions/flow.js @@ -326,10 +326,3 @@ defineType("VoidTypeAnnotation", { // todo } }); - -defineType("Variance", { - aliases: ["Flow"], - fields: { - // todo - } -}); From 3f2828e590bad3b16683fbc2d2e1f4d23cd17e77 Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Fri, 21 Oct 2016 17:51:35 +0200 Subject: [PATCH 3/3] Add test + fix for edge case with variance and class proeprties --- packages/babel-plugin-transform-flow-strip-types/src/index.js | 1 + .../property-variance-with-class-properties/actual.js | 3 +++ .../property-variance-with-class-properties/expected.js | 3 +++ .../property-variance-with-class-properties/options.json | 3 +++ 4 files changed, 10 insertions(+) create mode 100644 packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/actual.js create mode 100644 packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/expected.js create mode 100644 packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/options.json 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 80b52476d750..24e9bf8d10c0 100644 --- a/packages/babel-plugin-transform-flow-strip-types/src/index.js +++ b/packages/babel-plugin-transform-flow-strip-types/src/index.js @@ -22,6 +22,7 @@ export default function ({ types: t }) { }, ClassProperty(path) { + path.node.variance = null; path.node.typeAnnotation = null; if (!path.node.value) path.remove(); }, diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/actual.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/actual.js new file mode 100644 index 000000000000..8b4161346375 --- /dev/null +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/actual.js @@ -0,0 +1,3 @@ +class C { + +p: T = e; +} diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/expected.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/expected.js new file mode 100644 index 000000000000..da28fb47901f --- /dev/null +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/expected.js @@ -0,0 +1,3 @@ +class C { + p = e; +} diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/options.json b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/options.json new file mode 100644 index 000000000000..56245d91c6c1 --- /dev/null +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/property-variance-with-class-properties/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-flow-strip-types", "syntax-class-properties"] +}