diff --git a/src/plugins/flow.js b/src/plugins/flow.js index 5022203f86..06af0a4838 100644 --- a/src/plugins/flow.js +++ b/src/plugins/flow.js @@ -164,7 +164,7 @@ pp.flowParseTypeParameterDeclaration = function () { this.expectRelational("<"); while (!this.isRelational(">")) { - node.params.push(this.flowParseTypeAnnotatableIdentifier()); + node.params.push(this.parseFlowTypeParam()); if (!this.isRelational(">")) { this.expect(tt.comma); } @@ -174,6 +174,16 @@ pp.flowParseTypeParameterDeclaration = function () { return this.finishNode(node, "TypeParameterDeclaration"); }; +pp.parseFlowTypeParam = function () { + if (this.match(tt.star)) { + let node = this.startNode(); + this.next(); + return this.finishNode(node, "ExistentialTypeParam"); + } else { + return this.flowParseTypeAnnotatableIdentifier(); + } +}; + pp.flowParseTypeParameterInstantiation = function () { let node = this.startNode(), oldInType = this.state.inType; node.params = []; @@ -182,7 +192,7 @@ pp.flowParseTypeParameterInstantiation = function () { this.expectRelational("<"); while (!this.isRelational(">")) { - node.params.push(this.flowParseType()); + node.params.push(this.parseFlowTypeParam()); if (!this.isRelational(">")) { this.expect(tt.comma); } diff --git a/src/tokenizer/context.js b/src/tokenizer/context.js index 7b7236e500..a8e592da6e 100644 --- a/src/tokenizer/context.js +++ b/src/tokenizer/context.js @@ -56,6 +56,8 @@ tt.parenR.updateContext = tt.braceR.updateContext = function () { }; tt.name.updateContext = function (prevType) { + this.state.exprAllowed = false; + if (prevType === tt._let || prevType === tt._const || prevType === tt._var) { if (lineBreak.test(this.input.slice(this.state.end))) { this.state.exprAllowed = true; diff --git a/test/fixtures/flow/type-annotations/existential-type-param/actual.js b/test/fixtures/flow/type-annotations/existential-type-param/actual.js new file mode 100644 index 0000000000..83f6d6f432 --- /dev/null +++ b/test/fixtures/flow/type-annotations/existential-type-param/actual.js @@ -0,0 +1 @@ +type Maybe = _Maybe; diff --git a/test/fixtures/flow/type-annotations/existential-type-param/expected.json b/test/fixtures/flow/type-annotations/existential-type-param/expected.json new file mode 100644 index 0000000000..a412ffa9a8 --- /dev/null +++ b/test/fixtures/flow/type-annotations/existential-type-param/expected.json @@ -0,0 +1,177 @@ +{ + "type": "File", + "start": 0, + "end": 29, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 29 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 29, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 29 + } + }, + "sourceType": "module", + "body": [ + { + "type": "TypeAlias", + "start": 0, + "end": 29, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 29 + } + }, + "id": { + "type": "Identifier", + "start": 5, + "end": 10, + "loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 10 + } + }, + "name": "Maybe" + }, + "typeParameters": { + "type": "TypeParameterDeclaration", + "start": 10, + "end": 13, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 13 + } + }, + "params": [ + { + "type": "Identifier", + "start": 11, + "end": 12, + "loc": { + "start": { + "line": 1, + "column": 11 + }, + "end": { + "line": 1, + "column": 12 + } + }, + "name": "T" + } + ] + }, + "right": { + "type": "GenericTypeAnnotation", + "start": 16, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 16 + }, + "end": { + "line": 1, + "column": 28 + } + }, + "typeParameters": { + "type": "TypeParameterInstantiation", + "start": 22, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 22 + }, + "end": { + "line": 1, + "column": 28 + } + }, + "params": [ + { + "type": "Identifier", + "start": 23, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 23 + }, + "end": { + "line": 1, + "column": 24 + } + }, + "name": "T" + }, + { + "type": "ExistentialTypeParam", + "start": 26, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 26 + }, + "end": { + "line": 1, + "column": 27 + } + } + } + ] + }, + "id": { + "type": "Identifier", + "start": 16, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 16 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "name": "_Maybe" + } + } + } + ], + "directives": [] + } +} \ No newline at end of file