From e764346d5f7ee49eae1f3e1aa41716e2137b6e41 Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Mon, 4 Jan 2016 11:37:59 -0800 Subject: [PATCH] Add support for "declare type" Flow syntax See facebook/flow#1105 --- .../babel-generator/src/generators/flow.js | 5 + .../flow/declare-statements/actual.js | 2 + .../flow/declare-statements/expected.js | 2 + .../declare-statements/actual.js | 2 + .../declare-statements/expected.js | 2 + .../strip-declare-statements/actual.js | 2 + packages/babel-types/src/definitions/flow.js | 8 + packages/babylon/src/plugins/flow.js | 8 + .../flow/declare-statements/14/actual.js | 2 + .../flow/declare-statements/14/expected.json | 242 ++++++++++++++++++ 10 files changed, 275 insertions(+) create mode 100644 packages/babylon/test/fixtures/flow/declare-statements/14/actual.js create mode 100644 packages/babylon/test/fixtures/flow/declare-statements/14/expected.json diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index 8b03779c08..6c1bad28f9 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -43,6 +43,11 @@ export function DeclareModule(node: Object) { this.print(node.body, node); } +export function DeclareTypeAlias(node: Object) { + this.push("declare "); + this.TypeAlias(node); +} + export function DeclareVariable(node: Object) { this.push("declare var "); this.print(node.id, node); 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 0a6f430654..93559ab69f 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js @@ -10,3 +10,5 @@ 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 } 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 840c9b4004..e3b7571246 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js @@ -10,3 +10,5 @@ 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 }; diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/actual.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/actual.js index 0a6f430654..93559ab69f 100644 --- a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/actual.js +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/actual.js @@ -10,3 +10,5 @@ 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 } diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/expected.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/expected.js index 778b35f17f..2b17e08238 100644 --- a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/expected.js +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/declare-statements/expected.js @@ -10,3 +10,5 @@ /*:: 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 }*/ diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-declare-statements/actual.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-declare-statements/actual.js index 0a6f430654..93559ab69f 100644 --- a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-declare-statements/actual.js +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-declare-statements/actual.js @@ -10,3 +10,5 @@ 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 } diff --git a/packages/babel-types/src/definitions/flow.js b/packages/babel-types/src/definitions/flow.js index c4f3430aa9..271afc28b3 100644 --- a/packages/babel-types/src/definitions/flow.js +++ b/packages/babel-types/src/definitions/flow.js @@ -74,6 +74,14 @@ defineType("DeclareModule", { } }); +defineType("DeclareTypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + } +}); + defineType("DeclareVariable", { visitor: ["id"], aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], diff --git a/packages/babylon/src/plugins/flow.js b/packages/babylon/src/plugins/flow.js index 60ccc32264..d3332907bf 100644 --- a/packages/babylon/src/plugins/flow.js +++ b/packages/babylon/src/plugins/flow.js @@ -58,6 +58,8 @@ pp.flowParseDeclare = function (node) { return this.flowParseDeclareVariable(node); } else if (this.isContextual("module")) { return this.flowParseDeclareModule(node); + } else if (this.isContextual("type")) { + return this.flowParseDeclareTypeAlias(node); } else { this.unexpected(); } @@ -96,6 +98,12 @@ pp.flowParseDeclareModule = function (node) { return this.finishNode(node, "DeclareModule"); }; +pp.flowParseDeclareTypeAlias = function (node) { + this.next(); + this.flowParseTypeAlias(node); + return this.finishNode(node, "DeclareTypeAlias"); +}; + // Interfaces diff --git a/packages/babylon/test/fixtures/flow/declare-statements/14/actual.js b/packages/babylon/test/fixtures/flow/declare-statements/14/actual.js new file mode 100644 index 0000000000..1b73c9fcd0 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/declare-statements/14/actual.js @@ -0,0 +1,2 @@ +declare type A = string; +declare type T = { [k:string]: U }; diff --git a/packages/babylon/test/fixtures/flow/declare-statements/14/expected.json b/packages/babylon/test/fixtures/flow/declare-statements/14/expected.json new file mode 100644 index 0000000000..1f5bb9847b --- /dev/null +++ b/packages/babylon/test/fixtures/flow/declare-statements/14/expected.json @@ -0,0 +1,242 @@ +{ + "type": "File", + "start": 0, + "end": 63, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 38 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 63, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 38 + } + }, + "sourceType": "module", + "body": [ + { + "type": "DeclareTypeAlias", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 24 + } + }, + "id": { + "type": "Identifier", + "start": 13, + "end": 14, + "loc": { + "start": { + "line": 1, + "column": 13 + }, + "end": { + "line": 1, + "column": 14 + } + }, + "name": "A" + }, + "typeParameters": null, + "right": { + "type": "StringTypeAnnotation", + "start": 17, + "end": 23, + "loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 23 + } + } + } + }, + { + "type": "DeclareTypeAlias", + "start": 25, + "end": 63, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 38 + } + }, + "id": { + "type": "Identifier", + "start": 38, + "end": 39, + "loc": { + "start": { + "line": 2, + "column": 13 + }, + "end": { + "line": 2, + "column": 14 + } + }, + "name": "T" + }, + "typeParameters": { + "type": "TypeParameterDeclaration", + "start": 39, + "end": 42, + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 17 + } + }, + "params": [ + { + "type": "Identifier", + "start": 40, + "end": 41, + "loc": { + "start": { + "line": 2, + "column": 15 + }, + "end": { + "line": 2, + "column": 16 + } + }, + "name": "U" + } + ] + }, + "right": { + "type": "ObjectTypeAnnotation", + "start": 45, + "end": 62, + "loc": { + "start": { + "line": 2, + "column": 20 + }, + "end": { + "line": 2, + "column": 37 + } + }, + "callProperties": [], + "properties": [], + "indexers": [ + { + "type": "ObjectTypeIndexer", + "start": 47, + "end": 60, + "loc": { + "start": { + "line": 2, + "column": 22 + }, + "end": { + "line": 2, + "column": 35 + } + }, + "id": { + "type": "Identifier", + "start": 48, + "end": 49, + "loc": { + "start": { + "line": 2, + "column": 23 + }, + "end": { + "line": 2, + "column": 24 + } + }, + "name": "k" + }, + "key": { + "type": "StringTypeAnnotation", + "start": 50, + "end": 56, + "loc": { + "start": { + "line": 2, + "column": 25 + }, + "end": { + "line": 2, + "column": 31 + } + } + }, + "value": { + "type": "GenericTypeAnnotation", + "start": 59, + "end": 60, + "loc": { + "start": { + "line": 2, + "column": 34 + }, + "end": { + "line": 2, + "column": 35 + } + }, + "typeParameters": null, + "id": { + "type": "Identifier", + "start": 59, + "end": 60, + "loc": { + "start": { + "line": 2, + "column": 34 + }, + "end": { + "line": 2, + "column": 35 + } + }, + "name": "U" + } + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file