mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-03 07:45:51 +01:00
Key-type customization in CanonicalValueStore and ClangDecl cleanups (#5743)
The `ClangDecl` struct caused some confusion here -- it is embedding extra data into a `CanonicalValueStore` that isn't used for lookups or canonicalization, but is useful to store along side. This changes the `CanonicalValueStore` to support customized key type for `Lookup` so that we can provide the more direct API that only takes the relevant key. This in turn takes advantage of the support for heterogenous keys in the underlying `Set` as long as hashing and equality are consistent. We do need to add support for heterogenous equality comparison with `clang::Decl*`, but that is fairly easily done now that the argument-reversed form isn't needed as well. Lastly, this cleans up the `ClangDecl` customization points to be more idiomatic by using `operator==` and `CarbonHashValue`. While there, I've added comments to make it unambiguous why we can use the pointer value for the underlying `clang::Decl` due to the Clang AST's address-as-identity model. Resolves the immediate TODOs around this type. Future work might involve changing from the current `Add` API to one more like `Map` and `Set`'s API where a callback is used to create the object, but that level of API complexity isn't necessarily motivated yet and can easily be a follow-on if and when its worth doing. The `Add` code paths *are* working with the `inst_id` in order to create an instruction if we are importing the Clang declaration. It is the `Lookup` code paths that never needed to know about the `inst_id` and became more confusing for having to stub it out in the API. --------- Co-authored-by: Geoff Romer <gromer@google.com>
This commit is contained in:
co-authored by
Geoff Romer
parent
124313269a
commit
bba037738d
@@ -350,9 +350,8 @@ static auto AsCarbonNamespace(Context& context,
|
||||
auto& clang_decls = context.sem_ir().clang_decls();
|
||||
|
||||
// Check if the decl context is already mapped to a Carbon namespace.
|
||||
if (auto context_clang_decl_id = clang_decls.Lookup(
|
||||
{.decl = clang::dyn_cast<clang::Decl>(decl_context),
|
||||
.inst_id = SemIR::InstId::None});
|
||||
if (auto context_clang_decl_id =
|
||||
clang_decls.Lookup(clang::dyn_cast<clang::Decl>(decl_context));
|
||||
context_clang_decl_id.has_value()) {
|
||||
return clang_decls.Get(context_clang_decl_id).inst_id;
|
||||
}
|
||||
@@ -365,8 +364,7 @@ static auto AsCarbonNamespace(Context& context,
|
||||
decl_contexts.push_back(decl_context);
|
||||
decl_context = decl_context->getParent();
|
||||
parent_decl_id =
|
||||
clang_decls.Lookup({.decl = clang::dyn_cast<clang::Decl>(decl_context),
|
||||
.inst_id = SemIR::InstId::None});
|
||||
clang_decls.Lookup(clang::dyn_cast<clang::Decl>(decl_context));
|
||||
} while (!parent_decl_id.has_value());
|
||||
|
||||
// We know the parent of the last decl context is mapped, map the rest.
|
||||
@@ -532,8 +530,7 @@ static auto MapRecordType(Context& context, SemIR::LocId loc_id,
|
||||
if (record_decl && !record_decl->isUnion()) {
|
||||
auto& clang_decls = context.sem_ir().clang_decls();
|
||||
SemIR::InstId record_inst_id = SemIR::InstId::None;
|
||||
if (auto record_clang_decl_id = clang_decls.Lookup(
|
||||
{.decl = record_decl, .inst_id = SemIR::InstId::None});
|
||||
if (auto record_clang_decl_id = clang_decls.Lookup(record_decl);
|
||||
record_clang_decl_id.has_value()) {
|
||||
record_inst_id = clang_decls.Get(record_clang_decl_id).inst_id;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user