Flow enums: fix enum body location (#10737)

This commit is contained in:
George Zahariev 2019-11-19 20:46:09 -08:00 committed by Brian Ng
parent 6ba113197f
commit 01d6d6dd3b
32 changed files with 235 additions and 228 deletions

View File

@ -3250,34 +3250,32 @@ export default (superClass: Class<Parser>): Class<Parser> =>
return members; return members;
} }
flowEnumStringBody( flowEnumStringMembers(
bodyNode: N.Node,
initializedMembers: Array<N.Node>, initializedMembers: Array<N.Node>,
defaultedMembers: Array<N.Node>, defaultedMembers: Array<N.Node>,
{ enumName }: { enumName: string }, { enumName }: { enumName: string },
): N.Node { ): Array<N.Node> {
if (initializedMembers.length === 0) { if (initializedMembers.length === 0) {
bodyNode.members = defaultedMembers; return defaultedMembers;
} else if (defaultedMembers.length === 0) { } else if (defaultedMembers.length === 0) {
bodyNode.members = initializedMembers; return initializedMembers;
} else if (defaultedMembers.length > initializedMembers.length) { } else if (defaultedMembers.length > initializedMembers.length) {
bodyNode.members = defaultedMembers;
for (const member of initializedMembers) { for (const member of initializedMembers) {
this.flowEnumErrorStringMemberInconsistentlyInitailized( this.flowEnumErrorStringMemberInconsistentlyInitailized(
member.start, member.start,
{ enumName }, { enumName },
); );
} }
return defaultedMembers;
} else { } else {
bodyNode.members = initializedMembers;
for (const member of defaultedMembers) { for (const member of defaultedMembers) {
this.flowEnumErrorStringMemberInconsistentlyInitailized( this.flowEnumErrorStringMemberInconsistentlyInitailized(
member.start, member.start,
{ enumName }, { enumName },
); );
} }
return initializedMembers;
} }
return this.finishNode(bodyNode, "EnumStringBody");
} }
flowEnumParseExplicitType({ flowEnumParseExplicitType({
@ -3313,85 +3311,94 @@ export default (superClass: Class<Parser>): Class<Parser> =>
return null; return null;
} }
flowParseEnumDeclaration(node: N.Node): N.Node { flowEnumBody(node: N.Node, { enumName, nameLoc }): N.Node {
const id = this.parseIdentifier();
node.id = id;
const enumName = id.name;
const explicitType = this.flowEnumParseExplicitType({ enumName }); const explicitType = this.flowEnumParseExplicitType({ enumName });
this.expect(tt.braceL); this.expect(tt.braceL);
const bodyNode = this.startNode();
const members = this.flowEnumMembers({ enumName, explicitType }); const members = this.flowEnumMembers({ enumName, explicitType });
switch (explicitType) { switch (explicitType) {
case "boolean": case "boolean":
bodyNode.explicitType = true; node.explicitType = true;
bodyNode.members = members.booleanMembers; node.members = members.booleanMembers;
node.body = this.finishNode(bodyNode, "EnumBooleanBody"); this.expect(tt.braceR);
break; return this.finishNode(node, "EnumBooleanBody");
case "number": case "number":
bodyNode.explicitType = true; node.explicitType = true;
bodyNode.members = members.numberMembers; node.members = members.numberMembers;
node.body = this.finishNode(bodyNode, "EnumNumberBody"); this.expect(tt.braceR);
break; return this.finishNode(node, "EnumNumberBody");
case "string": case "string":
bodyNode.explicitType = true; node.explicitType = true;
node.body = this.flowEnumStringBody( node.members = this.flowEnumStringMembers(
bodyNode,
members.stringMembers, members.stringMembers,
members.defaultedMembers, members.defaultedMembers,
{ enumName }, { enumName },
); );
break; this.expect(tt.braceR);
return this.finishNode(node, "EnumStringBody");
case "symbol": case "symbol":
bodyNode.members = members.defaultedMembers; node.members = members.defaultedMembers;
node.body = this.finishNode(bodyNode, "EnumSymbolBody"); this.expect(tt.braceR);
break; return this.finishNode(node, "EnumSymbolBody");
default: { default: {
// null // `explicitType` is `null`
const empty = () => { const empty = () => {
bodyNode.members = []; node.members = [];
return this.finishNode(bodyNode, "EnumStringBody"); this.expect(tt.braceR);
return this.finishNode(node, "EnumStringBody");
}; };
bodyNode.explicitType = false; node.explicitType = false;
const boolsLen = members.booleanMembers.length; const boolsLen = members.booleanMembers.length;
const numsLen = members.numberMembers.length; const numsLen = members.numberMembers.length;
const strsLen = members.stringMembers.length; const strsLen = members.stringMembers.length;
const defaultedLen = members.defaultedMembers.length; const defaultedLen = members.defaultedMembers.length;
if (!boolsLen && !numsLen && !strsLen && !defaultedLen) { if (!boolsLen && !numsLen && !strsLen && !defaultedLen) {
node.body = empty(); return empty();
} else if (!boolsLen && !numsLen) { } else if (!boolsLen && !numsLen) {
node.body = this.flowEnumStringBody( node.members = this.flowEnumStringMembers(
bodyNode,
members.stringMembers, members.stringMembers,
members.defaultedMembers, members.defaultedMembers,
{ enumName }, { enumName },
); );
this.expect(tt.braceR);
return this.finishNode(node, "EnumStringBody");
} else if (!numsLen && !strsLen && boolsLen >= defaultedLen) { } else if (!numsLen && !strsLen && boolsLen >= defaultedLen) {
bodyNode.members = members.booleanMembers;
node.body = this.finishNode(bodyNode, "EnumBooleanBody");
for (const member of members.defaultedMembers) { for (const member of members.defaultedMembers) {
this.flowEnumErrorBooleanMemberNotInitialized(member.start, { this.flowEnumErrorBooleanMemberNotInitialized(member.start, {
enumName, enumName,
memberName: member.id.name, memberName: member.id.name,
}); });
} }
node.members = members.booleanMembers;
this.expect(tt.braceR);
return this.finishNode(node, "EnumBooleanBody");
} else if (!boolsLen && !strsLen && numsLen >= defaultedLen) { } else if (!boolsLen && !strsLen && numsLen >= defaultedLen) {
bodyNode.members = members.numberMembers;
node.body = this.finishNode(bodyNode, "EnumNumberBody");
for (const member of members.defaultedMembers) { for (const member of members.defaultedMembers) {
this.flowEnumErrorNumberMemberNotInitialized(member.start, { this.flowEnumErrorNumberMemberNotInitialized(member.start, {
enumName, enumName,
memberName: member.id.name, memberName: member.id.name,
}); });
} }
} else { node.members = members.numberMembers;
node.body = empty();
this.flowEnumErrorInconsistentMemberValues(id.start, { enumName });
}
}
}
this.expect(tt.braceR); this.expect(tt.braceR);
return this.finishNode(node, "EnumNumberBody");
} else {
this.flowEnumErrorInconsistentMemberValues(nameLoc, { enumName });
return empty();
}
}
}
}
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"); return this.finishNode(node, "EnumDeclaration");
} }
}; };

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumBooleanBody", "type": "EnumBooleanBody",
"start": 22, "start": 7,
"end": 44, "end": 46,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 12 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumBooleanBody", "type": "EnumBooleanBody",
"start": 11, "start": 7,
"end": 33, "end": 35,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 12 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumBooleanBody", "type": "EnumBooleanBody",
"start": 22, "start": 7,
"end": 24, "end": 26,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 4 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumBooleanBody", "type": "EnumBooleanBody",
"start": 11, "start": 7,
"end": 25, "end": 27,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 11 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 11, "start": 7,
"end": 18, "end": 20,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 4 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 9, "start": 7,
"end": 8, "end": 10,
"loc": { "loc": {
"start": { "start": {
"line": 1, "line": 1,
"column": 9 "column": 7
}, },
"end": { "end": {
"line": 1, "line": 1,
"column": 8 "column": 10
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 12, "start": 10,
"end": 11, "end": 13,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 0 "column": 10
}, },
"end": { "end": {
"line": 1, "line": 2,
"column": 11 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -79,16 +79,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 15, "start": 14,
"end": 15, "end": 16,
"loc": { "loc": {
"start": { "start": {
"line": 1, "line": 1,
"column": 15 "column": 14
}, },
"end": { "end": {
"line": 1, "line": 1,
"column": 15 "column": 16
} }
}, },
"explicitType": false, "explicitType": false,
@ -143,16 +143,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 41, "start": 40,
"end": 41, "end": 42,
"loc": { "loc": {
"start": { "start": {
"line": 3, "line": 3,
"column": 23 "column": 22
}, },
"end": { "end": {
"line": 3, "line": 3,
"column": 23 "column": 24
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 11, "start": 7,
"end": 27, "end": 29,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 4, "line": 5,
"column": 8 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 11, "start": 7,
"end": 29, "end": 31,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 11 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 16, "start": 7,
"end": 15, "end": 17,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 0 "column": 7
}, },
"end": { "end": {
"line": 1, "line": 2,
"column": 15 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 21, "start": 7,
"end": 30, "end": 32,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 11 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumSymbolBody", "type": "EnumSymbolBody",
"start": 21, "start": 7,
"end": 27, "end": 29,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 8 "column": 1
} }
}, },
"members": [] "members": []

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumBooleanBody", "type": "EnumBooleanBody",
"start": 22, "start": 7,
"end": 28, "end": 30,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 8 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 21, "start": 7,
"end": 27, "end": 29,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 8 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumBooleanBody", "type": "EnumBooleanBody",
"start": 22, "start": 7,
"end": 31, "end": 33,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 11 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumNumberBody", "type": "EnumNumberBody",
"start": 21, "start": 7,
"end": 30, "end": 32,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 11 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -66,16 +66,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 11, "start": 7,
"end": 22, "end": 24,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 6 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 11, "start": 7,
"end": 12, "end": 14,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 3 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumNumberBody", "type": "EnumNumberBody",
"start": 21, "start": 7,
"end": 36, "end": 38,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 8 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumNumberBody", "type": "EnumNumberBody",
"start": 11, "start": 7,
"end": 26, "end": 28,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 8 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumNumberBody", "type": "EnumNumberBody",
"start": 21, "start": 7,
"end": 23, "end": 25,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 2, "line": 3,
"column": 4 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumNumberBody", "type": "EnumNumberBody",
"start": 11, "start": 7,
"end": 22, "end": 24,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 8 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 13, "start": 11,
"end": 12, "end": 14,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 0 "column": 11
}, },
"end": { "end": {
"line": 1, "line": 2,
"column": 12 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 21, "start": 7,
"end": 28, "end": 30,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 4 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 21, "start": 7,
"end": 40, "end": 42,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 10 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 11, "start": 7,
"end": 18, "end": 20,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 4 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 11, "start": 7,
"end": 30, "end": 32,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 10 "column": 1
} }
}, },
"explicitType": false, "explicitType": false,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 21, "start": 7,
"end": 39, "end": 41,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 4, "line": 5,
"column": 4 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -65,16 +65,16 @@
}, },
"body": { "body": {
"type": "EnumStringBody", "type": "EnumStringBody",
"start": 21, "start": 7,
"end": 45, "end": 47,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 4, "line": 5,
"column": 10 "column": 1
} }
}, },
"explicitType": true, "explicitType": true,

View File

@ -62,16 +62,16 @@
}, },
"body": { "body": {
"type": "EnumSymbolBody", "type": "EnumSymbolBody",
"start": 21, "start": 7,
"end": 28, "end": 30,
"loc": { "loc": {
"start": { "start": {
"line": 2, "line": 1,
"column": 2 "column": 7
}, },
"end": { "end": {
"line": 3, "line": 4,
"column": 4 "column": 1
} }
}, },
"members": [ "members": [