|
|
@@ -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 {
|