From 7bb430aeea28edafd7c923b14836101aed2accdf Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Fri, 21 Oct 2016 13:05:36 -0700 Subject: [PATCH] Add variance node type and generate property variance annotations (#4697) * 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. * Variance is no longer a separate node type This diff also adds tests to class properties and to the flow-strip-types transform. * Add test + fix for edge case with variance and class proeprties --- .../babel-generator/src/generators/classes.js | 1 + .../babel-generator/src/generators/flow.js | 16 ++++++++++----- .../fixtures/flow/def-site-variance/actual.js | 16 ++++++++++++++- .../flow/def-site-variance/expected.js | 20 ++++++++++++++++++- .../src/index.js | 1 + .../actual.js | 3 +++ .../expected.js | 3 +++ .../options.json | 3 +++ .../strip-types/def-site-variance/actual.js | 18 +++++++++++++++-- .../strip-types/def-site-variance/expected.js | 5 ++++- 10 files changed, 76 insertions(+), 10 deletions(-) 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-generator/src/generators/classes.js b/packages/babel-generator/src/generators/classes.js index db3151f516..67c3aed42b 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._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 5f36f55547..b6c5a8b20d 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(); @@ -225,11 +233,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._variance(node); this.word(node.name); @@ -299,6 +303,7 @@ export function ObjectTypeIndexer(node: Object) { this.word("static"); this.space(); } + this._variance(node); this.token("["); this.print(node.id, node); this.token(":"); @@ -315,6 +320,7 @@ export function ObjectTypeProperty(node: Object) { this.word("static"); this.space(); } + this._variance(node); this.print(node.key, node); if (node.optional) this.token("?"); 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 f046505722..a9cf25b9c2 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,17 @@ -class C<+T, -U> {} +class C1<+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 }; +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 f046505722..1538e1ec99 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,21 @@ -class C<+T, -U> {} +class C1<+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 }; +class C2 { + +p: T = e; +}; +class C3 { + -p: T = e; +}; 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 80b52476d7..24e9bf8d10 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 0000000000..8b41613463 --- /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 0000000000..da28fb4790 --- /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 0000000000..56245d91c6 --- /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"] +} 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 f046505722..a97695f418 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 9eb99a782f..dce129ae1e 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 {}