Skip to content

Commit

Permalink
Flow enums: fix enum body location (#10737)
Browse files Browse the repository at this point in the history
  • Loading branch information
gkz authored and existentialism committed Nov 20, 2019
1 parent 6ba1131 commit 01d6d6d
Show file tree
Hide file tree
Showing 32 changed files with 235 additions and 228 deletions.
91 changes: 49 additions & 42 deletions packages/babel-parser/src/plugins/flow.js
Expand Up @@ -3250,34 +3250,32 @@ export default (superClass: Class<Parser>): Class<Parser> =>
return members;
}
flowEnumStringBody(
bodyNode: N.Node,
flowEnumStringMembers(
initializedMembers: Array<N.Node>,
defaultedMembers: Array<N.Node>,
{ enumName }: { enumName: string },
): N.Node {
): Array<N.Node> {
if (initializedMembers.length === 0) {
bodyNode.members = defaultedMembers;
return defaultedMembers;
} else if (defaultedMembers.length === 0) {
bodyNode.members = initializedMembers;
return initializedMembers;
} else if (defaultedMembers.length > initializedMembers.length) {
bodyNode.members = defaultedMembers;
for (const member of initializedMembers) {
this.flowEnumErrorStringMemberInconsistentlyInitailized(
member.start,
{ enumName },
);
}
return defaultedMembers;
} else {
bodyNode.members = initializedMembers;
for (const member of defaultedMembers) {
this.flowEnumErrorStringMemberInconsistentlyInitailized(
member.start,
{ enumName },
);
}
return initializedMembers;
}
return this.finishNode(bodyNode, "EnumStringBody");
}
flowEnumParseExplicitType({
Expand Down Expand Up @@ -3313,85 +3311,94 @@ export default (superClass: Class<Parser>): Class<Parser> =>
return null;
}
flowParseEnumDeclaration(node: N.Node): N.Node {
const id = this.parseIdentifier();
node.id = id;
const enumName = id.name;
flowEnumBody(node: N.Node, { enumName, nameLoc }): N.Node {
const explicitType = this.flowEnumParseExplicitType({ enumName });
this.expect(tt.braceL);
const bodyNode = this.startNode();
const members = this.flowEnumMembers({ enumName, explicitType });
switch (explicitType) {
case "boolean":
bodyNode.explicitType = true;
bodyNode.members = members.booleanMembers;
node.body = this.finishNode(bodyNode, "EnumBooleanBody");
break;
node.explicitType = true;
node.members = members.booleanMembers;
this.expect(tt.braceR);
return this.finishNode(node, "EnumBooleanBody");
case "number":
bodyNode.explicitType = true;
bodyNode.members = members.numberMembers;
node.body = this.finishNode(bodyNode, "EnumNumberBody");
break;
node.explicitType = true;
node.members = members.numberMembers;
this.expect(tt.braceR);
return this.finishNode(node, "EnumNumberBody");
case "string":
bodyNode.explicitType = true;
node.body = this.flowEnumStringBody(
bodyNode,
node.explicitType = true;
node.members = this.flowEnumStringMembers(
members.stringMembers,
members.defaultedMembers,
{ enumName },
);
break;
this.expect(tt.braceR);
return this.finishNode(node, "EnumStringBody");
case "symbol":
bodyNode.members = members.defaultedMembers;
node.body = this.finishNode(bodyNode, "EnumSymbolBody");
break;
node.members = members.defaultedMembers;
this.expect(tt.braceR);
return this.finishNode(node, "EnumSymbolBody");
default: {
// null
// `explicitType` is `null`
const empty = () => {
bodyNode.members = [];
return this.finishNode(bodyNode, "EnumStringBody");
node.members = [];
this.expect(tt.braceR);
return this.finishNode(node, "EnumStringBody");
};
bodyNode.explicitType = false;
node.explicitType = false;
const boolsLen = members.booleanMembers.length;
const numsLen = members.numberMembers.length;
const strsLen = members.stringMembers.length;
const defaultedLen = members.defaultedMembers.length;
if (!boolsLen && !numsLen && !strsLen && !defaultedLen) {
node.body = empty();
return empty();
} else if (!boolsLen && !numsLen) {
node.body = this.flowEnumStringBody(
bodyNode,
node.members = this.flowEnumStringMembers(
members.stringMembers,
members.defaultedMembers,
{ enumName },
);
this.expect(tt.braceR);
return this.finishNode(node, "EnumStringBody");
} else if (!numsLen && !strsLen && boolsLen >= defaultedLen) {
bodyNode.members = members.booleanMembers;
node.body = this.finishNode(bodyNode, "EnumBooleanBody");
for (const member of members.defaultedMembers) {
this.flowEnumErrorBooleanMemberNotInitialized(member.start, {
enumName,
memberName: member.id.name,
});
}
node.members = members.booleanMembers;
this.expect(tt.braceR);
return this.finishNode(node, "EnumBooleanBody");
} else if (!boolsLen && !strsLen && numsLen >= defaultedLen) {
bodyNode.members = members.numberMembers;
node.body = this.finishNode(bodyNode, "EnumNumberBody");
for (const member of members.defaultedMembers) {
this.flowEnumErrorNumberMemberNotInitialized(member.start, {
enumName,
memberName: member.id.name,
});
}
node.members = members.numberMembers;
this.expect(tt.braceR);
return this.finishNode(node, "EnumNumberBody");
} else {
node.body = empty();
this.flowEnumErrorInconsistentMemberValues(id.start, { enumName });
this.flowEnumErrorInconsistentMemberValues(nameLoc, { enumName });
return empty();
}
}
}
this.expect(tt.braceR);
}
flowParseEnumDeclaration(node: N.Node): N.Node {
const id = this.parseIdentifier();
node.id = id;
node.body = this.flowEnumBody(this.startNode(), {
enumName: id.name,
nameLoc: id.start,
});
return this.finishNode(node, "EnumDeclaration");
}
};
Expand Up @@ -62,16 +62,16 @@
},
"body": {
"type": "EnumBooleanBody",
"start": 22,
"end": 44,
"start": 7,
"end": 46,
"loc": {
"start": {
"line": 2,
"column": 2
"line": 1,
"column": 7
},
"end": {
"line": 3,
"column": 12
"line": 4,
"column": 1
}
},
"explicitType": true,
Expand Down
Expand Up @@ -62,16 +62,16 @@
},
"body": {
"type": "EnumBooleanBody",
"start": 11,
"end": 33,
"start": 7,
"end": 35,
"loc": {
"start": {
"line": 2,
"column": 2
"line": 1,
"column": 7
},
"end": {
"line": 3,
"column": 12
"line": 4,
"column": 1
}
},
"explicitType": false,
Expand Down
Expand Up @@ -65,16 +65,16 @@
},
"body": {
"type": "EnumBooleanBody",
"start": 22,
"end": 24,
"start": 7,
"end": 26,
"loc": {
"start": {
"line": 2,
"column": 2
"line": 1,
"column": 7
},
"end": {
"line": 2,
"column": 4
"line": 3,
"column": 1
}
},
"explicitType": true,
Expand Down
Expand Up @@ -65,16 +65,16 @@
},
"body": {
"type": "EnumBooleanBody",
"start": 11,
"end": 25,
"start": 7,
"end": 27,
"loc": {
"start": {
"line": 2,
"column": 2
"line": 1,
"column": 7
},
"end": {
"line": 3,
"column": 11
"line": 4,
"column": 1
}
},
"explicitType": false,
Expand Down
Expand Up @@ -65,16 +65,16 @@
},
"body": {
"type": "EnumStringBody",
"start": 11,
"end": 18,
"start": 7,
"end": 20,
"loc": {
"start": {
"line": 2,
"column": 2
"line": 1,
"column": 7
},
"end": {
"line": 3,
"column": 4
"line": 4,
"column": 1
}
},
"explicitType": false,
Expand Down
Expand Up @@ -62,16 +62,16 @@
},
"body": {
"type": "EnumStringBody",
"start": 9,
"end": 8,
"start": 7,
"end": 10,
"loc": {
"start": {
"line": 1,
"column": 9
"column": 7
},
"end": {
"line": 1,
"column": 8
"column": 10
}
},
"explicitType": false,
Expand Down
Expand Up @@ -62,16 +62,16 @@
},
"body": {
"type": "EnumStringBody",
"start": 12,
"end": 11,
"start": 10,
"end": 13,
"loc": {
"start": {
"line": 2,
"column": 0
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 11
"line": 2,
"column": 1
}
},
"explicitType": false,
Expand Down
Expand Up @@ -79,16 +79,16 @@
},
"body": {
"type": "EnumStringBody",
"start": 15,
"end": 15,
"start": 14,
"end": 16,
"loc": {
"start": {
"line": 1,
"column": 15
"column": 14
},
"end": {
"line": 1,
"column": 15
"column": 16
}
},
"explicitType": false,
Expand Down Expand Up @@ -143,16 +143,16 @@
},
"body": {
"type": "EnumStringBody",
"start": 41,
"end": 41,
"start": 40,
"end": 42,
"loc": {
"start": {
"line": 3,
"column": 23
"column": 22
},
"end": {
"line": 3,
"column": 23
"column": 24
}
},
"explicitType": false,
Expand Down
Expand Up @@ -65,16 +65,16 @@
},
"body": {
"type": "EnumStringBody",
"start": 11,
"end": 27,
"start": 7,
"end": 29,
"loc": {
"start": {
"line": 2,
"column": 2
"line": 1,
"column": 7
},
"end": {
"line": 4,
"column": 8
"line": 5,
"column": 1
}
},
"explicitType": false,
Expand Down

0 comments on commit 01d6d6d

Please sign in to comment.