diff --git a/packages/babel-generator/src/generators/classes.js b/packages/babel-generator/src/generators/classes.js index db3151f51693..67c3aed42b10 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 5f36f55547fc..b6c5a8b20d69 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 f046505722fe..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,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 f046505722fe..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,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 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"] +} 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 {}