Files
carbon-lang/toolchain/sem_ir/interface.h
T
Richard Smith f5a3a9a7e0 Add Self into scope in interface definitions and using facets as types. (#3740)
`Self` is modeled as a `bind_symbolic_name` with no corresponding value,
for now at least. In the future it might make sense to model it as a new
kind of instruction, or as a `bind_symbolic_name` whose value is a
`param`, but for now we just want it to introduce a symbolic constant.

In order to convert a value like the `Self` of an interface to a type, a
new instruction `facet_type_access` is introduced. This notionally
accesses the "type" field within a facet, converting it from a pair of
(type, witness) into just the type.
2024-03-06 22:33:33 +00:00

58 lines
2.0 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
#ifndef CARBON_TOOLCHAIN_SEM_IR_INTERFACE_H_
#define CARBON_TOOLCHAIN_SEM_IR_INTERFACE_H_
#include "toolchain/sem_ir/ids.h"
namespace Carbon::SemIR {
// An interface.
struct Interface : public Printable<Interface> {
auto Print(llvm::raw_ostream& out) const -> void {
out << "{name: " << name_id << ", enclosing_scope: " << enclosing_scope_id
<< "}";
}
// Determines whether this interface has been fully defined. This is false
// until we reach the `}` of the interface definition.
auto is_defined() const -> bool { return associated_entities_id.is_valid(); }
// Determines whether we're currently defining the interface. This is true
// between the braces of the interface.
auto is_being_defined() const -> bool {
return definition_id.is_valid() && !is_defined();
}
// The following members always have values, and do not change throughout the
// lifetime of the interface.
// The interface name.
NameId name_id;
// The enclosing scope.
NameScopeId enclosing_scope_id;
// The first declaration of the interface. This is a InterfaceDecl.
InstId decl_id;
// The following members are set at the `{` of the interface definition.
// The definition of the interface. This is a InterfaceDecl.
InstId definition_id = InstId::Invalid;
// The interface scope.
NameScopeId scope_id = NameScopeId::Invalid;
// The first block of the interface body.
// TODO: Handle control flow in the interface body, such as if-expressions.
InstBlockId body_block_id = InstBlockId::Invalid;
// The implicit `Self` parameter. This is a BindSymbolicName instruction.
InstId self_param_id = InstId::Invalid;
// The following members are set at the `}` of the interface definition.
InstBlockId associated_entities_id = InstBlockId::Invalid;
};
} // namespace Carbon::SemIR
#endif // CARBON_TOOLCHAIN_SEM_IR_INTERFACE_H_