From 55f37a1b1e5869c7ad07cb48a123b33e9d9b17a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20O=E2=80=99Shannessy?= Date: Sat, 20 Aug 2016 07:37:56 -0700 Subject: [PATCH] Use arrow syntax for ObjectTypeProperty FunctionTypeAnnotations (#3663) This fixes an issue where optional properties would get transformed to an invalid syntax. The easiest solution was to make all FunctionTypes get transformed to the arrow syntax (previously everything went the other way). --- packages/babel-generator/src/generators/flow.js | 10 +++------- .../test/fixtures/flow/declare-module/expected.js | 4 ++-- .../test/fixtures/flow/declare-statements/actual.js | 3 +++ .../test/fixtures/flow/declare-statements/expected.js | 5 ++++- .../flow/interfaces-module-and-script/expected.js | 2 +- .../test/fixtures/flow/type-annotations/actual.js | 1 + .../test/fixtures/flow/type-annotations/expected.js | 5 +++-- 7 files changed, 17 insertions(+), 13 deletions(-) diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index dd92b59281..30e0365f55 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -1,7 +1,5 @@ /* eslint max-len: 0 */ -import * as t from "babel-types"; - export function AnyTypeAnnotation() { this.word("any"); } @@ -104,7 +102,7 @@ export function FunctionTypeAnnotation(node: Object, parent: Object) { this.token(")"); // this node type is overloaded, not sure why but it makes it EXTREMELY annoying - if (parent.type === "ObjectTypeProperty" || parent.type === "ObjectTypeCallProperty" || parent.type === "DeclareFunction") { + if (parent.type === "ObjectTypeCallProperty" || parent.type === "DeclareFunction") { this.token(":"); } else { this.space(); @@ -306,10 +304,8 @@ export function ObjectTypeProperty(node: Object) { } this.print(node.key, node); if (node.optional) this.token("?"); - if (!t.isFunctionTypeAnnotation(node.value)) { - this.token(":"); - this.space(); - } + this.token(":"); + this.space(); this.print(node.value, node); } diff --git a/packages/babel-generator/test/fixtures/flow/declare-module/expected.js b/packages/babel-generator/test/fixtures/flow/declare-module/expected.js index f4df5e24c6..c6999f8226 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-module/expected.js +++ b/packages/babel-generator/test/fixtures/flow/declare-module/expected.js @@ -7,8 +7,8 @@ declare module A { declare function foo(): number; } declare module A { - declare class B { foo(): number } + declare class B { foo: () => number } } declare module A { - declare module.exports: { foo(): number } + declare module.exports: { foo: () => number } } diff --git a/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js index 32709ef8b0..543efd048a 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js @@ -12,6 +12,9 @@ declare class A { static () : number } declare class A mixins B, C {} declare type A = string declare type T = { [k:string]: U } +declare type B = { + fn?: (foo: string) => void, +} declare interface I { foo: string } declare interface I { foo: T } declare module.exports: { foo: string } diff --git a/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js index ca78c09366..8f667c0137 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js @@ -6,12 +6,15 @@ declare function foo(): void; declare function foo(x: number, y: string): void; declare class A {} declare class A extends B { x: number } -declare class A { static foo(): number; static x: string; } +declare class A { static foo: () => number; static x: string; } declare class A { static [indexer: number]: string } declare class A { static (): number } declare class A mixins B, C {} declare type A = string; declare type T = { [k: string]: U }; +declare type B = { + fn?: (foo: string) => void +}; declare interface I { foo: string } declare interface I { foo: T } declare module.exports: { foo: string } diff --git a/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/expected.js b/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/expected.js index 90aafb539e..ee084a80b7 100644 --- a/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/expected.js +++ b/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/expected.js @@ -1,7 +1,7 @@ interface A {}; interface A extends B {}; interface A extends B, C {}; -interface A { foo(): number }; +interface A { foo: () => number }; interface Dictionary { length: number; [index: string]: string; }; class Foo implements Bar {} class Foo extends Bar implements Bat, Man {} diff --git a/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js b/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js index 7410326dea..3f158f8ff8 100644 --- a/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js +++ b/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js @@ -47,6 +47,7 @@ var a: { param1: number; param2: string } var a: { param1: number; param2?: string } var a: { [a: number]: string; [b: number]: string; }; var a: { add(x: number, ...y: Array): void }; +var a: { subtract: (x: number, ...y: Array) => void }; var a: { id(x: T): T; }; var a:Array = [1, 2, 3] a = class Foo {} diff --git a/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js b/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js index dd087046a5..5c65efd5bf 100644 --- a/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js +++ b/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js @@ -46,8 +46,9 @@ var a: { subObj: ?{ strVal: string } }; var a: { param1: number; param2: string; }; var a: { param1: number; param2?: string; }; var a: { [a: number]: string; [b: number]: string; }; -var a: { add(x: number, ...y: Array): void }; -var a: { id(x: T): T }; +var a: { add: (x: number, ...y: Array) => void }; +var a: { subtract: (x: number, ...y: Array) => void }; +var a: { id: (x: T) => T }; var a: Array = [1, 2, 3]; a = class Foo {}; a = class Foo extends Bar {};