mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Add an associated entity instruction and corresponding type for interface elements. (#3730)
When declaring an associated entity in an interface -- just associated functions for now -- create an associated entity value and corresponding type to represent a "slot in a witness table". Also track the list of associated entities on the interface so that we will eventually be able to check impls against them. Associated entities are represented as the integer index of their slot in a witness table. --------- Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
This commit is contained in:
co-authored by
Jon Ross-Perkins
parent
90369815ad
commit
33c1e9ca95
@@ -0,0 +1,36 @@
|
||||
// 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/check/interface.h"
|
||||
|
||||
#include "toolchain/check/context.h"
|
||||
#include "toolchain/sem_ir/ids.h"
|
||||
#include "toolchain/sem_ir/typed_insts.h"
|
||||
|
||||
namespace Carbon::Check {
|
||||
|
||||
auto BuildAssociatedEntity(Context& context, SemIR::InterfaceId interface_id,
|
||||
SemIR::InstId decl_id) -> SemIR::InstId {
|
||||
auto& interface_info = context.interfaces().Get(interface_id);
|
||||
if (!interface_info.is_being_defined()) {
|
||||
// This should only happen if the interface is erroneously defined more than
|
||||
// once.
|
||||
// TODO: Find a way to CHECK this.
|
||||
return SemIR::InstId::BuiltinError;
|
||||
}
|
||||
|
||||
// Register this declaration as declaring an associated entity.
|
||||
auto index = SemIR::ElementIndex(
|
||||
context.args_type_info_stack().PeekCurrentBlockContents().size());
|
||||
context.args_type_info_stack().AddInstId(decl_id);
|
||||
|
||||
// Name lookup for the declaration's name should name the associated entity,
|
||||
// not the declaration itself.
|
||||
auto type_id = context.GetAssociatedEntityType(
|
||||
interface_id, context.insts().Get(decl_id).type_id());
|
||||
return context.AddInst({context.insts().GetParseNode(decl_id),
|
||||
SemIR::AssociatedEntity{type_id, index, decl_id}});
|
||||
}
|
||||
|
||||
} // namespace Carbon::Check
|
||||
Reference in New Issue
Block a user