/
githubmirror
/
carbon-lang
Обзор
Документация
Войти
/
githubmirror
/
carbon-lang
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
trunk
toolchain/parse/handle_impl.cpp
78 строк
3 KB
Chandler Carruth
Replace `:!` binding syntax with phase keywords and contextual defaults (#7479)
11 июл 2026, 04:22
Не верифицирован
11 июл 2026, 04:22
8be274c
Код
Авторство
О чём код?
// 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" #include "toolchain/parse/handle.h" namespace Carbon::Parse { static auto ExpectAsOrTypeExpression(Context& context) -> void { if (context.PositionIs(Lex::TokenKind::As)) { // as <expression> ... context.AddLeafNode(NodeKind::ImplDefaultSelfAs, context.Consume()); context.PushState(StateKind::Expr); } else { // <expression> as <expression>... context.PushState(StateKind::ImplBeforeAs); context.PushStateForExpr(PrecedenceGroup::ForImplAs()); } } auto HandleImplAfterIntroducer(Context& context) -> void { auto state = context.PopState(); state.kind = StateKind::DeclOrDefinitionAsImpl; context.PushState(state); if (context.PositionIs(Lex::TokenKind::Forall)) { // forall [<implicit parameter list>] ... context.PushState(StateKind::ImplAfterForall); context.AddLeafNode(NodeKind::Forall, context.Consume()); if (context.PositionIs(Lex::TokenKind::OpenSquareBracket)) { context.PushState(StateKind::PatternListAsImplicit, *context.position(), BindingContext::DeducedParam); } else { CARBON_DIAGNOSTIC(ImplExpectedAfterForall, Error, "expected `[` after `forall` in `impl` declaration"); context.emitter().Emit(*context.position(), ImplExpectedAfterForall); context.ReturnErrorOnState(); // If we aren't producing a node from the PatternListAsImplicit state, // we still need to create a node to be the child of the `ImplForall` // token created in the `ImplAfterForall` state. context.AddInvalidParse(*context.position()); } } else { // One of: // as <expression> ... // <expression> as <expression>... ExpectAsOrTypeExpression(context); } } auto HandleImplAfterForall(Context& context) -> void { auto state = context.PopState(); if (state.has_error) { context.ReturnErrorOnState(); } // One of: // as <expression> ... // <expression> as <expression>... ExpectAsOrTypeExpression(context); } auto HandleImplBeforeAs(Context& context) -> void { auto state = context.PopState(); if (auto as = context.ConsumeIf(Lex::TokenKind::As)) { context.AddNode(NodeKind::ImplTypeAs, *as, state.has_error); context.PushState(StateKind::Expr); } else { if (!state.has_error) { CARBON_DIAGNOSTIC(ImplExpectedAs, Error, "expected `as` in `impl` declaration"); context.emitter().Emit(*context.position(), ImplExpectedAs); } context.ReturnErrorOnState(); } } } // namespace Carbon::Parse