| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // 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
|