mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-30 18:15:01 +01:00
For an expression such as `(Type as Interface).AssocFn()`, track the `Self` type `Type` in the result of the member access so that it's available when checking the function call. This introduces a new kind of type, `ImplFunctionType`, that represents the type of a function that is expected within an impl, modeled as the type of the function within the interface plus a value to use as `Self`. Calls to values of this type behave like calls to the underlying function except that the `Self` parameter is pre-bound to the self type from the facet. In order to support this, fix an issue where the imported list of generic bindings lost their association with their enclosing generic. This adds a little complexity to `import_ref`, including a new recursive cycle that I intend to address in a follow-up PR. --------- Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
39 lines
1.7 KiB
C++
39 lines
1.7 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_CHECK_INTERFACE_H_
|
|
#define CARBON_TOOLCHAIN_CHECK_INTERFACE_H_
|
|
|
|
#include "toolchain/check/context.h"
|
|
#include "toolchain/sem_ir/ids.h"
|
|
|
|
namespace Carbon::Check {
|
|
|
|
// Builds and returns an associated entity for `interface_id` corresponding to
|
|
// the declaration `decl_id`, which can be an associated function or an
|
|
// associated constant. Registers the associated entity in the list for the
|
|
// interface.
|
|
auto BuildAssociatedEntity(Context& context, SemIR::InterfaceId interface_id,
|
|
SemIR::InstId decl_id) -> SemIR::InstId;
|
|
|
|
// Gets the self specific of a generic declaration that is an interface member,
|
|
// given a specific for the interface plus a type to use as `Self`.
|
|
auto GetSelfSpecificForInterfaceMemberWithSelfType(
|
|
Context& context, SemIRLoc loc, SemIR::SpecificId interface_specific_id,
|
|
SemIR::GenericId generic_id, SemIR::TypeId self_type_id,
|
|
SemIR::InstId witness_inst_id) -> SemIR::SpecificId;
|
|
|
|
// Gets the type of the specified associated entity, given the specific for the
|
|
// interface and the type of `Self`.
|
|
auto GetTypeForSpecificAssociatedEntity(Context& context, SemIRLoc loc,
|
|
SemIR::SpecificId interface_specific_id,
|
|
SemIR::InstId decl_id,
|
|
SemIR::TypeId self_type_id,
|
|
SemIR::InstId self_witness_id)
|
|
-> SemIR::TypeId;
|
|
|
|
} // namespace Carbon::Check
|
|
|
|
#endif // CARBON_TOOLCHAIN_CHECK_INTERFACE_H_
|