| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- // 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
- #ifndef CARBON_TOOLCHAIN_CHECK_PATTERN_H_
- #define CARBON_TOOLCHAIN_CHECK_PATTERN_H_
- #include "toolchain/check/context.h"
- #include "toolchain/sem_ir/ids.h"
- namespace Carbon::Check {
- // Marks the start of a region of insts in a pattern context that might contain
- // an expression. Typically this is called when handling a parse node that can
- // immediately precede a subpattern (such as `let` or a `,` in a pattern list).
- // `End[Empty]Subpattern` should be called later by the consumer of the
- // subpattern.
- auto BeginSubpattern(Context& context) -> void;
- // Consumes the expression in a region started by the most recent
- // BeginSubpattern, and returns the ID of the region. The region will not yet
- // have any control-flow edges into or out of it.
- auto ConsumeSubpatternExpr(Context& context, SemIR::InstId result_id)
- -> SemIR::ExprRegionId;
- // Ends a region started by BeginSubpattern (in stack order), asserting that
- // it either had no expression content or the expression has been consumed.
- auto EndEmptySubpattern(Context& context) -> void;
- // Ends a region started by BeginSubpattern (in stack order). If the top of the
- // node stack is an expression, the subpattern region is consumed and converted
- // to an expression pattern, which replaces the expression on the node stack.
- // Otherwise, the top of the node stack should be a pattern, in which case this
- // asserts that the subpattern region is either empty or has been consumed.
- //
- // The node stack is passed explicitly as a reminder that this function affects
- // the node stack, unlike the other *Subpattern functions.
- auto EndSubpattern(Context& context, NodeStack& node_stack) -> void;
- // Information about a created binding pattern.
- struct BindingPatternInfo {
- SemIR::InstId pattern_id;
- SemIR::InstId bind_id;
- };
- // The phase of a binding pattern.
- enum class BindingPhase { Template, Symbolic, Runtime };
- // Creates an entity name for a binding pattern with the given properties.
- auto AddBindingEntityName(Context& context, SemIR::NameId name_id,
- SemIR::InstId form_id, bool is_unused,
- BindingPhase phase) -> SemIR::EntityNameId;
- // Creates a binding pattern and the associated binding inst, and returns their
- // IDs. `type_region_id` is the region representing the binding's type
- // expression.
- auto AddBindingPattern(Context& context, SemIR::LocId name_loc,
- SemIR::ExprRegionId type_region_id,
- SemIR::AnyBindingPattern pattern) -> BindingPatternInfo;
- // Creates storage for `var` patterns nested within the given pattern at the
- // current location in the output SemIR. For a `returned var`, this
- // reuses the function's return slot when present.
- auto AddPatternVarStorage(Context& context, SemIR::InstBlockId pattern_block_id,
- bool is_returned_var) -> void;
- // Kinds of parameters that can be added by `AddParamPattern`.
- enum class ParamPatternKind {
- // A value parameter, `x: T`.
- Value,
- // A reference parameter, `ref x: T`.
- Ref,
- // A variable parameter, `var x: T`.
- Var,
- };
- // Adds a parameter pattern with the specified name and type information. The
- // pattern emulates `x: T`, `ref x: T`, or `var x: T` depending on the value of
- // `kind`. This only sets up the parameter pattern, binding pattern and type;
- // callers are expected to add the returned parameter pattern instruction to
- // appropriate blocks. This is used when generating functions, rather than
- // processing a user-authored declaration.
- auto AddParamPattern(Context& context, SemIR::LocId loc_id,
- SemIR::NameId name_id,
- SemIR::ExprRegionId type_expr_region_id,
- SemIR::TypeId type_id, ParamPatternKind kind)
- -> SemIR::InstId;
- } // namespace Carbon::Check
- #endif // CARBON_TOOLCHAIN_CHECK_PATTERN_H_
|