mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-30 15:45:00 +01:00
Part of switching to the [abbreviations we've decided to use](https://docs.google.com/document/d/1RRYMm42osyqhI2LyjrjockYCutQ5dOf8Abu50kTrkX0/edit?resourcekey=0-kHyqOESbOHmzZphUbtLrTw#heading=h.pph7i5m5un7q). I will rename files in a follow-up PR. --------- Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
100 lines
3.4 KiB
C++
100 lines
3.4 KiB
C++
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
#include "toolchain/parse/context.h"
|
|
|
|
namespace Carbon::Parse {
|
|
|
|
// Handles ParamAs(Implicit|Regular).
|
|
static auto HandleParam(Context& context, State pattern_state,
|
|
State finish_state) -> void {
|
|
context.PopAndDiscardState();
|
|
|
|
context.PushState(finish_state);
|
|
context.PushState(pattern_state);
|
|
}
|
|
|
|
auto HandleParamAsImplicit(Context& context) -> void {
|
|
HandleParam(context, State::PatternAsImplicitParam,
|
|
State::ParamFinishAsImplicit);
|
|
}
|
|
|
|
auto HandleParamAsRegular(Context& context) -> void {
|
|
HandleParam(context, State::PatternAsParam, State::ParamFinishAsRegular);
|
|
}
|
|
|
|
// Handles ParamFinishAs(Implicit|Regular).
|
|
static auto HandleParamFinish(Context& context, Lex::TokenKind close_token,
|
|
State param_state) -> void {
|
|
auto state = context.PopState();
|
|
|
|
if (state.has_error) {
|
|
context.ReturnErrorOnState();
|
|
}
|
|
|
|
if (context.ConsumeListToken(NodeKind::ParamListComma, close_token,
|
|
state.has_error) ==
|
|
Context::ListTokenKind::Comma) {
|
|
context.PushState(param_state);
|
|
}
|
|
}
|
|
|
|
auto HandleParamFinishAsImplicit(Context& context) -> void {
|
|
HandleParamFinish(context, Lex::TokenKind::CloseSquareBracket,
|
|
State::ParamAsImplicit);
|
|
}
|
|
|
|
auto HandleParamFinishAsRegular(Context& context) -> void {
|
|
HandleParamFinish(context, Lex::TokenKind::CloseParen, State::ParamAsRegular);
|
|
}
|
|
|
|
// Handles ParamListAs(Implicit|Regular).
|
|
static auto HandleParamList(Context& context, NodeKind parse_node_kind,
|
|
Lex::TokenKind open_token_kind,
|
|
Lex::TokenKind close_token_kind, State param_state,
|
|
State finish_state) -> void {
|
|
context.PopAndDiscardState();
|
|
|
|
context.PushState(finish_state);
|
|
context.AddLeafNode(parse_node_kind, context.ConsumeChecked(open_token_kind));
|
|
|
|
if (!context.PositionIs(close_token_kind)) {
|
|
context.PushState(param_state);
|
|
}
|
|
}
|
|
|
|
auto HandleParamListAsImplicit(Context& context) -> void {
|
|
HandleParamList(context, NodeKind::ImplicitParamListStart,
|
|
Lex::TokenKind::OpenSquareBracket,
|
|
Lex::TokenKind::CloseSquareBracket, State::ParamAsImplicit,
|
|
State::ParamListFinishAsImplicit);
|
|
}
|
|
|
|
auto HandleParamListAsRegular(Context& context) -> void {
|
|
HandleParamList(context, NodeKind::ParamListStart, Lex::TokenKind::OpenParen,
|
|
Lex::TokenKind::CloseParen, State::ParamAsRegular,
|
|
State::ParamListFinishAsRegular);
|
|
}
|
|
|
|
// Handles ParamListFinishAs(Implicit|Regular).
|
|
static auto HandleParamListFinish(Context& context, NodeKind parse_node_kind,
|
|
Lex::TokenKind token_kind) -> void {
|
|
auto state = context.PopState();
|
|
|
|
context.AddNode(parse_node_kind, context.ConsumeChecked(token_kind),
|
|
state.subtree_start, state.has_error);
|
|
}
|
|
|
|
auto HandleParamListFinishAsImplicit(Context& context) -> void {
|
|
HandleParamListFinish(context, NodeKind::ImplicitParamList,
|
|
Lex::TokenKind::CloseSquareBracket);
|
|
}
|
|
|
|
auto HandleParamListFinishAsRegular(Context& context) -> void {
|
|
HandleParamListFinish(context, NodeKind::ParamList,
|
|
Lex::TokenKind::CloseParen);
|
|
}
|
|
|
|
} // namespace Carbon::Parse
|