mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
This is reducing ValueStore inference of types from `using`, and removes `using ValueType = ...` from affected id types. I'm adding a number of `using FooStore = ValueStore<FooId, Foo>` because I think it's a little repetitive otherwise; often 4 cases where I'm doing this: getter, const getter, member, and getter on `Context`. Note we also have a number of `-> decltype(auto)` that were added I think mainly to avoid repeating the type, but I'm not sure whether there'll be agreement on replacing those and so am not changing them here. I'm placing these aliases with the value type in general, because I think it's probably easier to view that way. An alternative would be to put all the types on `File`, but: - That would be inconsistent with things like `InstStore`, which are very `ValueStore`-adjacent and put with their value type. - `File` would have a _lot_ of using's, and the accessors are already noisy -- I think it would just make the file harder to skim. Note this is the heart of what I'd brought up [on Discord](https://discord.com/channels/655572317891461132/655578254970716160/1388199282250613019). This PR still leaves CanonicalValueStore and BlockValueStore as things to also add parameters to, but I thought it best to try breaking the set of changes apart by type. Both of those rely on ValueStore, so ValueStore needs to change first.
57 lines
1.9 KiB
C++
57 lines
1.9 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/base/value_store.h"
|
|
#include "toolchain/sem_ir/entity_with_params_base.h"
|
|
#include "toolchain/sem_ir/ids.h"
|
|
|
|
namespace Carbon::SemIR {
|
|
|
|
// Interface-specific fields.
|
|
struct InterfaceFields {
|
|
// The following members are set at the `{` of the interface definition.
|
|
|
|
// The interface scope.
|
|
NameScopeId scope_id = NameScopeId::None;
|
|
// The first block of the interface body.
|
|
// TODO: Handle control flow in the interface body, such as if-expressions.
|
|
InstBlockId body_block_id = InstBlockId::None;
|
|
// The implicit `Self` parameter. This is a BindSymbolicName instruction.
|
|
InstId self_param_id = InstId::None;
|
|
|
|
// The following members are set at the `}` of the interface definition.
|
|
InstBlockId associated_entities_id = InstBlockId::None;
|
|
};
|
|
|
|
// An interface. See EntityWithParamsBase regarding the inheritance here.
|
|
struct Interface : public EntityWithParamsBase,
|
|
public InterfaceFields,
|
|
public Printable<Interface> {
|
|
auto Print(llvm::raw_ostream& out) const -> void {
|
|
out << "{";
|
|
PrintBaseFields(out);
|
|
out << "}";
|
|
}
|
|
|
|
// This is false until we reach the `}` of the interface definition.
|
|
auto is_complete() const -> bool {
|
|
return associated_entities_id.has_value();
|
|
}
|
|
|
|
// Determines whether we're currently defining the interface. This is true
|
|
// between the braces of the interface.
|
|
auto is_being_defined() const -> bool {
|
|
return has_definition_started() && !is_complete();
|
|
}
|
|
};
|
|
|
|
using InterfaceStore = ValueStore<InterfaceId, Interface>;
|
|
|
|
} // namespace Carbon::SemIR
|
|
|
|
#endif // CARBON_TOOLCHAIN_SEM_IR_INTERFACE_H_
|