Refactor struct literal parse nodes. (#4470)

Split StructComma into StructLiteralComma and StructTypeLiteralComma in
order to easily differentiate handling (remains the same in this PR).

Add "Literal" to StructField and StructTypeField because it feels
inconsistent versus the other non-shared things. StructFieldDesignator
remains shared between value literals and type literals.

Note I probably would've made StructFieldDesignator non-shared too, but
that'd require either a lookahead of 2 (to see the separator`) or a
writeback after parsing the separator, neither of which felt especially
crucial for this, when what I'm really trying to do is split type
literal handling a little further.
This commit is contained in:
Jon Ross-Perkins
2024-11-04 16:06:57 +00:00
committed by GitHub
parent 26d7717d60
commit dd43bb92b5
23 changed files with 93 additions and 73 deletions
+12 -8
View File
@@ -149,8 +149,9 @@ auto HandleBraceExprParamAfterDesignatorAsUnknown(Context& context) -> void {
}
// Handles BraceExprParamFinishAs(Type|Value|Unknown).
static auto HandleBraceExprParamFinish(Context& context, NodeKind node_kind,
State param_state) -> void {
static auto HandleBraceExprParamFinish(Context& context, NodeKind field_kind,
NodeKind comma_kind, State param_state)
-> void {
auto state = context.PopState();
if (state.has_error) {
@@ -158,28 +159,31 @@ static auto HandleBraceExprParamFinish(Context& context, NodeKind node_kind,
/*has_error=*/true);
context.ReturnErrorOnState();
} else {
context.AddNode(node_kind, state.token, /*has_error=*/false);
context.AddNode(field_kind, state.token, /*has_error=*/false);
}
if (context.ConsumeListToken(
NodeKind::StructComma, Lex::TokenKind::CloseCurlyBrace,
state.has_error) == Context::ListTokenKind::Comma) {
if (context.ConsumeListToken(comma_kind, Lex::TokenKind::CloseCurlyBrace,
state.has_error) ==
Context::ListTokenKind::Comma) {
context.PushState(param_state);
}
}
auto HandleBraceExprParamFinishAsType(Context& context) -> void {
HandleBraceExprParamFinish(context, NodeKind::StructTypeField,
HandleBraceExprParamFinish(context, NodeKind::StructTypeLiteralField,
NodeKind::StructTypeLiteralComma,
State::BraceExprParamAsType);
}
auto HandleBraceExprParamFinishAsValue(Context& context) -> void {
HandleBraceExprParamFinish(context, NodeKind::StructField,
HandleBraceExprParamFinish(context, NodeKind::StructLiteralField,
NodeKind::StructLiteralComma,
State::BraceExprParamAsValue);
}
auto HandleBraceExprParamFinishAsUnknown(Context& context) -> void {
HandleBraceExprParamFinish(context, NodeKind::InvalidParse,
NodeKind::InvalidParse,
State::BraceExprParamAsUnknown);
}