Flow enums: fix enum body location (#10737)
This commit is contained in:
committed by
Brian Ng
parent
6ba113197f
commit
01d6d6dd3b
@@ -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({
|
||||
@@ -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");
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user