Flow Enums with unknown members support (#12193)

* Flow Enums with unknown members parsing

* Updates after rebase

Co-authored-by: Nicolò Ribaudo <nicolo.ribaudo@gmail.com>
This commit is contained in:
George Zahariev
2021-02-21 09:42:23 -08:00
committed by GitHub
parent d1d6ee6dc2
commit 5b99b8f221
41 changed files with 168 additions and 34 deletions

View File

@@ -3409,10 +3409,13 @@ export default (superClass: Class<Parser>): Class<Parser> =>
enumName: string,
explicitType: EnumExplicitType,
}): {|
booleanMembers: Array<N.Node>,
numberMembers: Array<N.Node>,
stringMembers: Array<N.Node>,
defaultedMembers: Array<N.Node>,
members: {|
booleanMembers: Array<N.Node>,
numberMembers: Array<N.Node>,
stringMembers: Array<N.Node>,
defaultedMembers: Array<N.Node>,
|},
hasUnknownMembers: boolean,
|} {
const seenNames = new Set();
const members = {
@@ -3421,7 +3424,12 @@ export default (superClass: Class<Parser>): Class<Parser> =>
stringMembers: [],
defaultedMembers: [],
};
let hasUnknownMembers = false;
while (!this.match(tt.braceR)) {
if (this.eat(tt.ellipsis)) {
hasUnknownMembers = true;
break;
}
const memberNode = this.startNode();
const { id, init } = this.flowEnumMemberRaw();
const memberName = id.name;
@@ -3498,7 +3506,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
this.expect(tt.comma);
}
}
return members;
return { members, hasUnknownMembers };
}
flowEnumStringMembers(
@@ -3565,7 +3573,11 @@ export default (superClass: Class<Parser>): Class<Parser> =>
flowEnumBody(node: N.Node, { enumName, nameLoc }): N.Node {
const explicitType = this.flowEnumParseExplicitType({ enumName });
this.expect(tt.braceL);
const members = this.flowEnumMembers({ enumName, explicitType });
const { members, hasUnknownMembers } = this.flowEnumMembers({
enumName,
explicitType,
});
node.hasUnknownMembers = hasUnknownMembers;
switch (explicitType) {
case "boolean":