add ExistentialTypeParam - fixes #2587

This commit is contained in:
Sebastian McKenzie
2015-11-03 13:48:03 +00:00
parent 49cbd27441
commit 7dc1b4e7e9
8 changed files with 203 additions and 3 deletions

View File

@@ -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);
}

View File

@@ -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;