From 0980819346ad1c0acb8895e2d0b2eff2f79cdb0e 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 --- src/plugins/flow.js | 8 + .../flow/declare-statements/14/actual.js | 2 + .../flow/declare-statements/14/expected.json | 242 ++++++++++++++++++ 3 files changed, 252 insertions(+) create mode 100644 test/fixtures/flow/declare-statements/14/actual.js create mode 100644 test/fixtures/flow/declare-statements/14/expected.json diff --git a/src/plugins/flow.js b/src/plugins/flow.js index 60ccc32264..d3332907bf 100644 --- a/src/plugins/flow.js +++ b/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/test/fixtures/flow/declare-statements/14/actual.js b/test/fixtures/flow/declare-statements/14/actual.js new file mode 100644 index 0000000000..1b73c9fcd0 --- /dev/null +++ b/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/test/fixtures/flow/declare-statements/14/expected.json b/test/fixtures/flow/declare-statements/14/expected.json new file mode 100644 index 0000000000..1f5bb9847b --- /dev/null +++ b/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