Parse support for tuple patterns in var and let (#3448)

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
This commit is contained in:
Geoff Romer
2023-12-08 01:16:03 +00:00
committed by GitHub
co-authored by Richard Smith
parent 8ace1dcb78
commit 39750b9925
27 changed files with 181 additions and 104 deletions
+14 -48
View File
@@ -6,46 +6,28 @@
namespace Carbon::Parse {
// Handles BindingPatternAs(ImplicitParam|FunctionParam|Variable|Let).
static auto HandleBindingPattern(Context& context,
Context::BindingPatternKind pattern_kind)
-> void {
auto HandleBindingPattern(Context& context) -> void {
auto state = context.PopState();
// Parameters may have keywords prefixing the pattern. They become the parent
// for the full BindingPattern.
if (pattern_kind != Context::BindingPatternKind::Variable) {
context.ConsumeIfBindingPatternKeyword(Lex::TokenKind::Template,
State::BindingPatternTemplate,
state.subtree_start);
context.ConsumeIfBindingPatternKeyword(Lex::TokenKind::Addr,
State::BindingPatternAddress,
state.subtree_start);
if (auto token = context.ConsumeIf(Lex::TokenKind::Template)) {
context.PushState(Context::StateStackEntry(
State::BindingPatternTemplate, PrecedenceGroup::ForTopLevelExpr(),
PrecedenceGroup::ForTopLevelExpr(), *token, state.subtree_start));
}
if (auto token = context.ConsumeIf(Lex::TokenKind::Addr)) {
context.PushState(Context::StateStackEntry(
State::BindingPatternAddress, PrecedenceGroup::ForTopLevelExpr(),
PrecedenceGroup::ForTopLevelExpr(), *token, state.subtree_start));
}
// Handle an invalid pattern introducer for parameters and variables.
auto on_error = [&]() {
switch (pattern_kind) {
case Context::BindingPatternKind::ImplicitParam:
case Context::BindingPatternKind::Param: {
CARBON_DIAGNOSTIC(ExpectedParamName, Error,
"Expected parameter declaration.");
context.emitter().Emit(*context.position(), ExpectedParamName);
break;
}
case Context::BindingPatternKind::Variable: {
CARBON_DIAGNOSTIC(ExpectedVariableName, Error,
"Expected pattern in `var` declaration.");
context.emitter().Emit(*context.position(), ExpectedVariableName);
break;
}
case Context::BindingPatternKind::Let: {
CARBON_DIAGNOSTIC(ExpectedLetBindingName, Error,
"Expected pattern in `let` declaration.");
context.emitter().Emit(*context.position(), ExpectedLetBindingName);
break;
}
}
CARBON_DIAGNOSTIC(ExpectedBindingPattern, Error,
"Expected binding pattern.");
context.emitter().Emit(*context.position(), ExpectedBindingPattern);
// Add a placeholder for the type.
context.AddLeafNode(NodeKind::InvalidParse, *context.position(),
/*has_error=*/true);
@@ -89,22 +71,6 @@ static auto HandleBindingPattern(Context& context,
}
}
auto HandleBindingPatternAsImplicitParam(Context& context) -> void {
HandleBindingPattern(context, Context::BindingPatternKind::ImplicitParam);
}
auto HandleBindingPatternAsParam(Context& context) -> void {
HandleBindingPattern(context, Context::BindingPatternKind::Param);
}
auto HandleBindingPatternAsVariable(Context& context) -> void {
HandleBindingPattern(context, Context::BindingPatternKind::Variable);
}
auto HandleBindingPatternAsLet(Context& context) -> void {
HandleBindingPattern(context, Context::BindingPatternKind::Let);
}
// Handles BindingPatternFinishAs(Generic|Regular).
static auto HandleBindingPatternFinish(Context& context, NodeKind node_kind)
-> void {