https://gcc.gnu.org/g:df6f181ef62a89c36ce1167221472694621ac867
commit r17-5162-gdf6f181ef62a89c36ce1167221472694621ac867 Author: Pierre-Emmanuel Patry <[email protected]> Date: Fri Sep 11 12:51:38 2026 +0200 gccrs: Regroup hir mappings under one class HIR map is getting bigger and most lookup/insert functions are similar, this commit regroup all simple HIR related mappings under one field. gcc/rust/ChangeLog: * backend/rust-compile-item.cc (CompileItem::visit): Use new hir category. * backend/rust-compile-resolve-path.cc (HIRCompileBase::query_compile): Likewise. * backend/rust-mangle-v0.cc (v0_path): Likewise. * checks/errors/privacy/rust-visibility-resolver.cc (VisibilityResolver::resolve_module_path): Likewise. * checks/errors/rust-const-checker.cc (ConstChecker::check_function_call): Likewise. * checks/errors/rust-readonly-check.cc (ReadonlyChecker::visit): Likewise. * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::check_use_of_static): Likewise. (UnsafeChecker::check_function_call): Likewise. (UnsafeChecker::check_function_attr): Likewise. * checks/lints/rust-lint-marklive.cc (MarkLive::go): Likewise. (MarkLive::visit): Likewise. * checks/lints/unused/rust-unused-checker.cc (UnusedChecker::visit): Likewise. * hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_extern_block): Likewise. * hir/rust-ast-lower-block.h: Likewise. * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::translate): Likewise. * hir/rust-ast-lower-implitem.cc (ASTLowerImplItem::visit): Likewise. (ASTLowerTraitItem::translate): Likewise. (ASTLowerTraitItem::visit): Likewise. * hir/rust-ast-lower-item.cc (ASTLoweringItem::translate): Likewise. (ASTLoweringItem::visit): Likewise. * hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::translate): Likewise. * hir/rust-ast-lower-stmt.cc (ASTLoweringStmt::translate): Likewise. * hir/rust-ast-lower-struct-field-expr.h: Likewise. * hir/rust-ast-lower-type.cc (ASTLoweringType::translate): Likewise. (ASTLowerGenericParam::translate): Likewise. * hir/rust-ast-lower.cc (ASTLowerPathInExpression::visit): Likewise. (ASTLowerQualPathInExpression::visit): Likewise. * hir/tree/rust-hir-pattern-abstract.cc (PathPattern::is_refutable): Likewise. * typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_path_to_trait): Likewise. * typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit): Likewise. (TypeCheckExpr::resolve_root_path): Likewise. * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): Likewise. * typecheck/rust-hir-type-check-type.cc (TypeCheckType::resolve_root_path): Likewise. * typecheck/rust-type-util.cc (query_type): Likewise. * util/rust-hir-map.cc (Mappings::insert_hir_item): Move to dedicated mappings within the hir category. (Mappings::lookup_hir_item): Likewise. (Mappings::insert_hir_trait_item): Likewise. (Mappings::lookup_hir_trait_item): Likewise. (Mappings::insert_hir_extern_block): Likewise. (Mappings::lookup_hir_extern_block): Likewise. (Mappings::insert_module): Likewise. (Mappings::lookup_module): Likewise. (Mappings::insert_hir_expr): Likewise. (Mappings::lookup_hir_expr): Likewise. (Mappings::insert_hir_path_expr_seg): Likewise. (Mappings::lookup_hir_path_expr_seg): Likewise. (Mappings::insert_hir_generic_param): Likewise. (Mappings::lookup_hir_generic_param): Likewise. (Mappings::insert_hir_type): Likewise. (Mappings::lookup_hir_type): Likewise. (Mappings::insert_hir_stmt): Likewise. (Mappings::lookup_hir_stmt): Likewise. (Mappings::insert_hir_param): Likewise. (Mappings::lookup_hir_param): Likewise. (Mappings::insert_hir_self_param): Likewise. (Mappings::lookup_hir_self_param): Likewise. (Mappings::insert_hir_struct_field): Likewise. (Mappings::lookup_hir_struct_field): Likewise. (Mappings::insert_hir_pattern): Likewise. (Mappings::lookup_hir_pattern): Likewise. (Mappings::resolve_nodeid_to_stmt): Likewise. (Mappings::build_impl_indexes): Likewise. (Mappings::insert_trait_item_mapping): Likewise. * util/rust-hir-map.h (class HIRMappings): Add new class for all hir related mappings. * util/rust-hir-map.hxx: New file. Signed-off-by: Pierre-Emmanuel Patry <[email protected]> Diff: --- gcc/rust/backend/rust-compile-item.cc | 2 +- gcc/rust/backend/rust-compile-resolve-path.cc | 4 +- gcc/rust/backend/rust-mangle-v0.cc | 6 +- .../errors/privacy/rust-visibility-resolver.cc | 2 +- gcc/rust/checks/errors/rust-const-checker.cc | 2 +- gcc/rust/checks/errors/rust-readonly-check.cc | 4 +- gcc/rust/checks/errors/rust-unsafe-checker.cc | 8 +- gcc/rust/checks/lints/rust-lint-marklive.cc | 4 +- .../checks/lints/unused/rust-unused-checker.cc | 2 +- gcc/rust/hir/rust-ast-lower-base.cc | 2 +- gcc/rust/hir/rust-ast-lower-block.h | 10 +- gcc/rust/hir/rust-ast-lower-expr.cc | 2 +- gcc/rust/hir/rust-ast-lower-implitem.cc | 10 +- gcc/rust/hir/rust-ast-lower-item.cc | 6 +- gcc/rust/hir/rust-ast-lower-pattern.cc | 2 +- gcc/rust/hir/rust-ast-lower-stmt.cc | 2 +- gcc/rust/hir/rust-ast-lower-struct-field-expr.h | 2 +- gcc/rust/hir/rust-ast-lower-type.cc | 4 +- gcc/rust/hir/rust-ast-lower.cc | 4 +- gcc/rust/hir/tree/rust-hir-pattern-abstract.cc | 2 +- gcc/rust/typecheck/rust-hir-trait-resolve.cc | 2 +- gcc/rust/typecheck/rust-hir-type-check-path.cc | 6 +- gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 2 +- gcc/rust/typecheck/rust-hir-type-check-type.cc | 2 +- gcc/rust/typecheck/rust-type-util.cc | 4 +- gcc/rust/util/rust-hir-map.cc | 267 +-------------------- gcc/rust/util/rust-hir-map.h | 90 ++++--- gcc/rust/util/rust-hir-map.hxx | 77 ++++++ 28 files changed, 179 insertions(+), 351 deletions(-) diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc index 423df15c2cac..6937492cc238 100644 --- a/gcc/rust/backend/rust-compile-item.cc +++ b/gcc/rust/backend/rust-compile-item.cc @@ -228,7 +228,7 @@ CompileItem::visit (HIR::Function &function) if (function.get_qualifiers ().is_const ()) ctx->push_const_context (); - auto lookup_root_item = ctx->get_mappings ().lookup_hir_item ( + auto lookup_root_item = ctx->get_mappings ().hir.item.lookup ( function.get_mappings ().get_hirid ()); bool is_root_item = lookup_root_item.has_value (); tree fndecl diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc index 12b200a11d9b..9aa78fd4b1a0 100644 --- a/gcc/rust/backend/rust-compile-resolve-path.cc +++ b/gcc/rust/backend/rust-compile-resolve-path.cc @@ -259,7 +259,7 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType *lookup, location_t expr_locus, bool is_qualified_path) { bool is_fn = lookup->get_kind () == TyTy::TypeKind::FNDEF; - if (auto resolved_item = ctx->get_mappings ().lookup_hir_item (ref)) + if (auto resolved_item = ctx->get_mappings ().hir.item.lookup (ref)) { if (!lookup->has_substitutions_defined ()) return CompileItem::compile (*resolved_item, ctx, nullptr, expr_locus); @@ -303,7 +303,7 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType *lookup, lookup, expr_locus); } else if (auto trait_item - = ctx->get_mappings ().lookup_hir_trait_item (ref)) + = ctx->get_mappings ().hir.trait_item.lookup (ref)) { HIR::Trait *trait = ctx->get_mappings ().lookup_trait_item_mapping ( trait_item.value ()->get_mappings ().get_hirid ()); diff --git a/gcc/rust/backend/rust-mangle-v0.cc b/gcc/rust/backend/rust-mangle-v0.cc index d0ed9da1ef61..b2a24f385fd3 100644 --- a/gcc/rust/backend/rust-mangle-v0.cc +++ b/gcc/rust/backend/rust-mangle-v0.cc @@ -406,7 +406,7 @@ v0_path (Rust::Compile::Context *ctx, const TyTy::BaseType *ty, break; } } - else if (auto trait_item = mappings.lookup_hir_trait_item (hir_id)) + else if (auto trait_item = mappings.hir.trait_item.lookup (hir_id)) { switch (trait_item.value ()->get_item_kind ()) { @@ -428,7 +428,7 @@ v0_path (Rust::Compile::Context *ctx, const TyTy::BaseType *ty, break; } } - else if (auto item = mappings.lookup_hir_item (hir_id)) + else if (auto item = mappings.hir.item.lookup (hir_id)) switch (item.value ()->get_item_kind ()) { case HIR::Item::ItemKind::Function: @@ -468,7 +468,7 @@ v0_path (Rust::Compile::Context *ctx, const TyTy::BaseType *ty, cpath.get ().c_str ()); break; } - else if (auto expr = mappings.lookup_hir_expr (hir_id)) + else if (auto expr = mappings.hir.expr.lookup (hir_id)) { rust_assert (expr.value ()->get_expression_type () == HIR::Expr::ExprType::Closure); diff --git a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc index 26f13f8d22e1..76a94906278f 100644 --- a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc +++ b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc @@ -93,7 +93,7 @@ VisibilityResolver::resolve_module_path (const HIR::SimplePath &restriction, // these items as private? return true; - if (auto module = mappings.lookup_module (ref)) + if (auto module = mappings.hir.module.lookup (ref)) { // Fill in the resolved `DefId` id = module.value ()->get_mappings ().get_defid (); diff --git a/gcc/rust/checks/errors/rust-const-checker.cc b/gcc/rust/checks/errors/rust-const-checker.cc index 1a594bf9f0bd..913505f066fb 100644 --- a/gcc/rust/checks/errors/rust-const-checker.cc +++ b/gcc/rust/checks/errors/rust-const-checker.cc @@ -309,7 +309,7 @@ ConstChecker::check_function_call (HirId fn_id, location_t locus) if (!const_context.is_in_context ()) return; - auto maybe_fn = mappings.lookup_hir_item (fn_id); + auto maybe_fn = mappings.hir.item.lookup (fn_id); if (maybe_fn && maybe_fn.value ()->get_item_kind () != Item::ItemKind::Function) return; diff --git a/gcc/rust/checks/errors/rust-readonly-check.cc b/gcc/rust/checks/errors/rust-readonly-check.cc index b7e75a7d5012..8bd3c4e4e7f3 100644 --- a/gcc/rust/checks/errors/rust-readonly-check.cc +++ b/gcc/rust/checks/errors/rust-readonly-check.cc @@ -75,7 +75,7 @@ ReadonlyChecker::visit (PathInExpression &expr) return; // Check if the local variable is mutable. - auto maybe_pattern = mappings.lookup_hir_pattern (*hir_id); + auto maybe_pattern = mappings.hir.pattern.lookup (*hir_id); if (maybe_pattern && maybe_pattern.value ()->get_pattern_type () == HIR::Pattern::PatternType::IDENTIFIER) @@ -83,7 +83,7 @@ ReadonlyChecker::visit (PathInExpression &expr) expr.get_locus ()); // Check if the static item is mutable. - auto maybe_item = mappings.lookup_hir_item (*hir_id); + auto maybe_item = mappings.hir.item.lookup (*hir_id); if (maybe_item && maybe_item.value ()->get_item_kind () == HIR::Item::ItemKind::Static) { diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc b/gcc/rust/checks/errors/rust-unsafe-checker.cc index b82ba1514f32..22ff986f18f5 100644 --- a/gcc/rust/checks/errors/rust-unsafe-checker.cc +++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc @@ -92,7 +92,7 @@ UnsafeChecker::check_use_of_static (HirId node_id, location_t locus) bool in_context = unsafe_context.is_in_context (); bool unsafe_op = false; - if (auto maybe_static_mut = mappings.lookup_hir_item (node_id)) + if (auto maybe_static_mut = mappings.hir.item.lookup (node_id)) unsafe_op |= check_static_mut (*maybe_static_mut, locus, in_context); if (auto maybe_extern_static = mappings.lookup_hir_extern_item (node_id)) @@ -198,7 +198,7 @@ UnsafeChecker::check_function_call (HirId node_id, location_t locus) bool in_context = unsafe_context.is_in_context (); bool unsafe_op = false; - auto maybe_fn = mappings.lookup_hir_item (node_id); + auto maybe_fn = mappings.hir.item.lookup (node_id); if (maybe_fn && maybe_fn.value ()->get_item_kind () == Item::ItemKind::Function) @@ -208,7 +208,7 @@ UnsafeChecker::check_function_call (HirId node_id, location_t locus) if (auto maybe_extern = mappings.lookup_hir_extern_item (node_id)) unsafe_op |= check_extern_call (static_cast<ExternalItem *> (maybe_extern->first), - *mappings.lookup_hir_extern_block ( + *mappings.hir.extern_block.lookup ( maybe_extern->second), locus, in_context); @@ -240,7 +240,7 @@ UnsafeChecker::check_function_attr (HirId node_id, location_t locus) { bool in_context = unsafe_context.is_in_context (); - auto maybe_fn = mappings.lookup_hir_item (node_id); + auto maybe_fn = mappings.hir.item.lookup (node_id); if (maybe_fn && maybe_fn.value ()->get_item_kind () == Item::ItemKind::Function diff --git a/gcc/rust/checks/lints/rust-lint-marklive.cc b/gcc/rust/checks/lints/rust-lint-marklive.cc index c99c365dd92c..0685c442beeb 100644 --- a/gcc/rust/checks/lints/rust-lint-marklive.cc +++ b/gcc/rust/checks/lints/rust-lint-marklive.cc @@ -91,7 +91,7 @@ MarkLive::go (HIR::Crate &) worklist.pop_back (); scannedSymbols.emplace (hirId); liveSymbols.emplace (hirId); - if (auto item = mappings.lookup_hir_item (hirId)) + if (auto item = mappings.hir.item.lookup (hirId)) item.value ()->accept_vis (*this); else if (auto implItem = mappings.lookup_hir_implitem (hirId)) implItem->first->accept_vis (*this); @@ -125,7 +125,7 @@ MarkLive::visit (HIR::PathInExpression &expr) auto ref = hid.value (); // it must resolve to some kind of HIR::Item or HIR::InheritImplItem - if (auto resolved_item = mappings.lookup_hir_item (ref)) + if (auto resolved_item = mappings.hir.item.lookup (ref)) mark_hir_id (resolved_item.value ()->get_mappings ().get_hirid ()); else if (auto resolved_item = mappings.lookup_hir_implitem (ref)) mark_hir_id (resolved_item->first->get_impl_mappings ().get_hirid ()); diff --git a/gcc/rust/checks/lints/unused/rust-unused-checker.cc b/gcc/rust/checks/lints/unused/rust-unused-checker.cc index 023cba0c938a..414af54103d9 100644 --- a/gcc/rust/checks/lints/unused/rust-unused-checker.cc +++ b/gcc/rust/checks/lints/unused/rust-unused-checker.cc @@ -358,7 +358,7 @@ UnusedChecker::visit (HIR::BorrowExpr &expr) if (auto def = nr_context.lookup (ast_node_id, Resolver2_0::Namespace::Values)) if (auto id = mappings.lookup_node_to_hir (*def)) - if (auto item = mappings.lookup_hir_item (*id)) + if (auto item = mappings.hir.item.lookup (*id)) if (item.value ()->get_item_kind () == HIR::Item::ItemKind::Static) { auto &static_item = static_cast<HIR::StaticItem &> (*item.value ()); diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc index 1d55632e6900..ddf866952f80 100644 --- a/gcc/rust/hir/rust-ast-lower-base.cc +++ b/gcc/rust/hir/rust-ast-lower-base.cc @@ -1077,7 +1077,7 @@ ASTLoweringBase::lower_extern_block (AST::ExternBlock &extern_block) extern_block.get_outer_attrs (), extern_block.get_locus ()); - mappings.insert_hir_extern_block (hir_extern_block); + mappings.hir.extern_block.insert (hir_extern_block); return hir_extern_block; } diff --git a/gcc/rust/hir/rust-ast-lower-block.h b/gcc/rust/hir/rust-ast-lower-block.h index 3b36ea36c258..cb5409e5fa63 100644 --- a/gcc/rust/hir/rust-ast-lower-block.h +++ b/gcc/rust/hir/rust-ast-lower-block.h @@ -37,7 +37,7 @@ public: expr.accept_vis (resolver); if (resolver.translated != nullptr) { - resolver.mappings.insert_hir_expr (resolver.translated); + resolver.mappings.hir.expr.insert (resolver.translated); } *terminated = resolver.terminated; @@ -62,7 +62,7 @@ public: std::unique_ptr<HIR::BlockExpr> (block), expr.get_outer_attrs (), expr.get_locus ()); - resolver.mappings.insert_hir_expr (translated); + resolver.mappings.hir.expr.insert (translated); return translated; } @@ -89,7 +89,7 @@ public: expr.accept_vis (resolver); if (resolver.translated != nullptr) { - resolver.mappings.insert_hir_expr (resolver.translated); + resolver.mappings.hir.expr.insert (resolver.translated); } *terminated = resolver.terminated; return resolver.translated; @@ -121,7 +121,7 @@ public: expr.accept_vis (resolver); if (resolver.translated != nullptr) { - resolver.mappings.insert_hir_expr (resolver.translated); + resolver.mappings.hir.expr.insert (resolver.translated); } return resolver.translated; } @@ -152,7 +152,7 @@ public: ASTLoweringExprWithBlock resolver; expr.accept_vis (resolver); if (resolver.translated != nullptr) - resolver.mappings.insert_hir_expr (resolver.translated); + resolver.mappings.hir.expr.insert (resolver.translated); *terminated = resolver.terminated; return resolver.translated; diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc b/gcc/rust/hir/rust-ast-lower-expr.cc index 61a3f10c3fde..4ab3ed56f7f4 100644 --- a/gcc/rust/hir/rust-ast-lower-expr.cc +++ b/gcc/rust/hir/rust-ast-lower-expr.cc @@ -50,7 +50,7 @@ ASTLoweringExpr::translate (AST::Expr &expr, bool *terminated) return nullptr; } - resolver.mappings.insert_hir_expr (resolver.translated); + resolver.mappings.hir.expr.insert (resolver.translated); resolver.mappings.insert_location ( resolver.translated->get_mappings ().get_hirid (), expr.get_locus ()); diff --git a/gcc/rust/hir/rust-ast-lower-implitem.cc b/gcc/rust/hir/rust-ast-lower-implitem.cc index 828d0065fa71..ad9a0090d84f 100644 --- a/gcc/rust/hir/rust-ast-lower-implitem.cc +++ b/gcc/rust/hir/rust-ast-lower-implitem.cc @@ -192,7 +192,7 @@ ASTLowerImplItem::visit (AST::Function &function) if (fn->is_method ()) { // insert mappings for self - mappings.insert_hir_self_param (&fn->get_self_param_unchecked ()); + mappings.hir.self_param.insert (&fn->get_self_param_unchecked ()); mappings.insert_location ( fn->get_self_param_unchecked ().get_mappings ().get_hirid (), fn->get_self_param_unchecked ().get_locus ()); @@ -201,7 +201,7 @@ ASTLowerImplItem::visit (AST::Function &function) // add the mappings for the function params at the end for (auto ¶m : fn->get_function_params ()) { - mappings.insert_hir_param (¶m); + mappings.hir.function_param.insert (¶m); mappings.insert_location (mapping.get_hirid (), param.get_locus ()); } @@ -222,7 +222,7 @@ ASTLowerTraitItem::translate (AST::AssociatedItem &item) auto locus = resolver.translated->get_trait_locus (); resolver.handle_outer_attributes (*resolver.translated); - resolver.mappings.insert_hir_trait_item (resolver.translated); + resolver.mappings.hir.trait_item.insert (resolver.translated); resolver.mappings.insert_location (id, locus); resolver.mappings.insert_defid_mapping (defid, resolver.translated); } @@ -285,7 +285,7 @@ ASTLowerTraitItem::visit (AST::Function &func) { // insert mappings for self // TODO: Is this correct ? Looks fishy - mappings.insert_hir_self_param (&*self_param); + mappings.hir.self_param.insert (&*self_param); mappings.insert_location (self_param->get_mappings ().get_hirid (), self_param->get_locus ()); } @@ -317,7 +317,7 @@ ASTLowerTraitItem::visit (AST::Function &func) // add the mappings for the function params at the end for (auto ¶m : trait_item->get_decl ().get_function_params ()) { - mappings.insert_hir_param (¶m); + mappings.hir.function_param.insert (¶m); mappings.insert_location (mapping.get_hirid (), param.get_locus ()); } } diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc index 546ba6fb848b..56171ef882ed 100644 --- a/gcc/rust/hir/rust-ast-lower-item.cc +++ b/gcc/rust/hir/rust-ast-lower-item.cc @@ -45,7 +45,7 @@ ASTLoweringItem::translate (AST::Item &item) resolver.handle_outer_attributes (*resolver.translated); resolver.mappings.insert_ast_item (&item); - resolver.mappings.insert_hir_item (resolver.translated); + resolver.mappings.hir.item.insert (resolver.translated); resolver.mappings.insert_location (id, locus); resolver.mappings.insert_defid_mapping (defid, resolver.translated); } @@ -83,7 +83,7 @@ ASTLoweringItem::visit (AST::Module &module) = new HIR::Module (mapping, module.get_name (), module.get_locus (), std::move (items), std::move (vis), std::move (inner_attrs), std::move (outer_attrs)); - mappings.insert_module (static_cast<Module *> (translated)); + mappings.hir.module.insert (static_cast<Module *> (translated)); } void @@ -507,7 +507,7 @@ ASTLoweringItem::visit (AST::Function &function) // add the mappings for the function params at the end for (auto ¶m : fn->get_function_params ()) { - mappings.insert_hir_param (¶m); + mappings.hir.function_param.insert (¶m); mappings.insert_location (mapping.get_hirid (), param.get_locus ()); } diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc b/gcc/rust/hir/rust-ast-lower-pattern.cc index 21544ff26645..ed5c68e71a84 100644 --- a/gcc/rust/hir/rust-ast-lower-pattern.cc +++ b/gcc/rust/hir/rust-ast-lower-pattern.cc @@ -36,7 +36,7 @@ ASTLoweringPattern::translate (AST::Pattern &pattern, bool is_let_top_level) rust_assert (resolver.translated != nullptr); - resolver.mappings.insert_hir_pattern (resolver.translated); + resolver.mappings.hir.pattern.insert (resolver.translated); resolver.mappings.insert_location ( resolver.translated->get_mappings ().get_hirid (), pattern.get_locus ()); diff --git a/gcc/rust/hir/rust-ast-lower-stmt.cc b/gcc/rust/hir/rust-ast-lower-stmt.cc index 2f5eede12030..7fe7d3bc5adf 100644 --- a/gcc/rust/hir/rust-ast-lower-stmt.cc +++ b/gcc/rust/hir/rust-ast-lower-stmt.cc @@ -39,7 +39,7 @@ ASTLoweringStmt::translate (AST::Stmt *stmt, bool *terminated) resolver.mappings.insert_location ( resolver.translated->get_mappings ().get_hirid (), resolver.translated->get_locus ()); - resolver.mappings.insert_hir_stmt (resolver.translated); + resolver.mappings.hir.stmt.insert (resolver.translated); return resolver.translated; } diff --git a/gcc/rust/hir/rust-ast-lower-struct-field-expr.h b/gcc/rust/hir/rust-ast-lower-struct-field-expr.h index 903f2abd75b8..225e5843bf36 100644 --- a/gcc/rust/hir/rust-ast-lower-struct-field-expr.h +++ b/gcc/rust/hir/rust-ast-lower-struct-field-expr.h @@ -36,7 +36,7 @@ public: field.accept_vis (compiler); rust_assert (compiler.translated != nullptr); - compiler.mappings.insert_hir_struct_field (compiler.translated); + compiler.mappings.hir.struct_expr_field.insert (compiler.translated); compiler.mappings.insert_location ( compiler.translated->get_mappings ().get_hirid (), field.get_locus ()); diff --git a/gcc/rust/hir/rust-ast-lower-type.cc b/gcc/rust/hir/rust-ast-lower-type.cc index 7bc9c6b97193..031c137daec4 100644 --- a/gcc/rust/hir/rust-ast-lower-type.cc +++ b/gcc/rust/hir/rust-ast-lower-type.cc @@ -223,7 +223,7 @@ ASTLoweringType::translate (AST::Type &type, bool default_to_static_lifetime, type.accept_vis (resolver); rust_assert (resolver.translated != nullptr); - resolver.mappings.insert_hir_type (resolver.translated); + resolver.mappings.hir.type.insert (resolver.translated); resolver.mappings.insert_location ( resolver.translated->get_mappings ().get_hirid (), resolver.translated->get_locus ()); @@ -549,7 +549,7 @@ ASTLowerGenericParam::translate (AST::GenericParam ¶m) rust_assert (resolver.translated != nullptr); resolver.mappings.insert_location ( resolver.translated->get_mappings ().get_hirid (), param.get_locus ()); - resolver.mappings.insert_hir_generic_param (resolver.translated); + resolver.mappings.hir.generic_param.insert (resolver.translated); return resolver.translated; } diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc index f31cc92cdb07..64ce2ef709b6 100644 --- a/gcc/rust/hir/rust-ast-lower.cc +++ b/gcc/rust/hir/rust-ast-lower.cc @@ -487,7 +487,7 @@ ASTLowerPathInExpression::visit (AST::PathInExpression &expr) // insert the mappings for the segment HIR::PathExprSegment *lowered_seg = &path_segments.back (); - mappings.insert_hir_path_expr_seg (lowered_seg); + mappings.hir.path_expr_segment.insert (lowered_seg); } translated = new HIR::PathInExpression (mapping, std::move (path_segments), @@ -531,7 +531,7 @@ ASTLowerQualPathInExpression::visit (AST::QualifiedPathInExpression &expr) // insert the mappings for the segment HIR::PathExprSegment *lowered_seg = &path_segments.back (); - mappings.insert_hir_path_expr_seg (lowered_seg); + mappings.hir.path_expr_segment.insert (lowered_seg); } auto crate_num = mappings.crate_mapping.get_current_crate (); diff --git a/gcc/rust/hir/tree/rust-hir-pattern-abstract.cc b/gcc/rust/hir/tree/rust-hir-pattern-abstract.cc index f33af84f3497..6a1031457a3e 100644 --- a/gcc/rust/hir/tree/rust-hir-pattern-abstract.cc +++ b/gcc/rust/hir/tree/rust-hir-pattern-abstract.cc @@ -58,7 +58,7 @@ PathPattern::is_refutable (const TyTy::BaseType &scrutinee) const HirId hir_id = get_final_segment ().get_mappings ().get_hirid (); if (hir_id) { - auto item = mappings.lookup_hir_item (hir_id); + auto item = mappings.hir.item.lookup (hir_id); if (item && item.value ()->get_item_kind () == Item::ItemKind::Constant) { return true; diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc index b694521533d5..5ae31122ad42 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc @@ -227,7 +227,7 @@ TraitResolver::resolve_path_to_trait (const HIR::TypePath &path, return false; } - auto resolved_item = mappings.lookup_hir_item (hid.value ()); + auto resolved_item = mappings.hir.item.lookup (hid.value ()); if (!resolved_item.has_value ()) { rust_error_at (path.get_locus (), diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc b/gcc/rust/typecheck/rust-hir-type-check-path.cc index 27d7d55e5951..665ec0054ce9 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-path.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc @@ -208,7 +208,7 @@ TypeCheckExpr::visit (HIR::PathInExpression &expr) else { TyTy::BaseType *resolved = nullptr; - auto trait_item = mappings.lookup_hir_trait_item (*hir_id); + auto trait_item = mappings.hir.trait_item.lookup (*hir_id); if (trait_item.has_value ()) { HIR::Trait *trait = mappings.lookup_trait_item_mapping (*hir_id); @@ -308,9 +308,9 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression &expr, size_t *offset, } auto ref = hid.value (); - auto seg_is_module = mappings.lookup_module (ref).has_value (); + auto seg_is_module = mappings.hir.module.lookup (ref).has_value (); auto seg_is_crate = mappings.is_local_hirid_crate (ref); - auto seg_is_pattern = mappings.lookup_hir_pattern (ref).has_value (); + auto seg_is_pattern = mappings.hir.pattern.lookup (ref).has_value (); auto seg_is_self = is_root && !have_more_segments && seg.get_segment ().to_string () == "self"; if (seg_is_module || seg_is_crate) diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc index b5f336b42a65..287a903e12f1 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc @@ -74,7 +74,7 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern) rust_assert (definition_id.has_value ()); HirId def_id = definition_id.value (); - tl::optional<HIR::Item *> hir_item = mappings.lookup_hir_item (def_id); + tl::optional<HIR::Item *> hir_item = mappings.hir.item.lookup (def_id); // If the path references an item, it must be constants or structs. if (hir_item.has_value ()) { diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc b/gcc/rust/typecheck/rust-hir-type-check-type.cc index 7ff160b148b6..0d4b735c9fec 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-type.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc @@ -387,7 +387,7 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, size_t *offset, } auto ref = hid.value (); - auto seg_is_module = mappings.lookup_module (ref).has_value (); + auto seg_is_module = mappings.hir.module.lookup (ref).has_value (); auto seg_is_crate = mappings.is_local_hirid_crate (ref); if (seg_is_module || seg_is_crate) { diff --git a/gcc/rust/typecheck/rust-type-util.cc b/gcc/rust/typecheck/rust-type-util.cc index 96367df5cb5f..85fafdea070a 100644 --- a/gcc/rust/typecheck/rust-type-util.cc +++ b/gcc/rust/typecheck/rust-type-util.cc @@ -70,7 +70,7 @@ query_type (HirId reference, TyTy::BaseType **result) return true; } - if (auto item = mappings.lookup_hir_item (reference)) + if (auto item = mappings.hir.item.lookup (reference)) { rust_debug_loc (item.value ()->get_locus (), "resolved item {%u} to", reference); @@ -233,7 +233,7 @@ query_type (HirId reference, TyTy::BaseType **result) // is it an extern item? if (auto extern_item = mappings.lookup_hir_extern_item (reference)) { - auto block = mappings.lookup_hir_extern_block (extern_item->second); + auto block = mappings.hir.extern_block.lookup (extern_item->second); rust_assert (block.has_value ()); *result diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 617963e73b43..47ccc540af0a 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -369,25 +369,6 @@ Mappings::lookup_trait_item_defid (DefId id) return it->second; } -void -Mappings::insert_hir_item (HIR::Item *item) -{ - auto id = item->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_item (id).has_value ()); - - hirItemMappings[id] = item; - insert_node_to_hir (item->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::Item *> -Mappings::lookup_hir_item (HirId id) -{ - auto it = hirItemMappings.find (id); - if (it == hirItemMappings.end ()) - return tl::nullopt; - return it->second; -} - void Mappings::insert_hir_enumitem (HIR::Enum *parent, HIR::EnumItem *item) { @@ -409,46 +390,6 @@ Mappings::lookup_hir_enumitem (HirId id) return it->second; } -void -Mappings::insert_hir_trait_item (HIR::TraitItem *item) -{ - auto id = item->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_trait_item (id).has_value ()); - - hirTraitItemMappings[id] = item; - insert_node_to_hir (item->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::TraitItem *> -Mappings::lookup_hir_trait_item (HirId id) -{ - auto it = hirTraitItemMappings.find (id); - if (it == hirTraitItemMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_extern_block (HIR::ExternBlock *block) -{ - auto id = block->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_extern_block (id).has_value ()); - - hirExternBlockMappings[id] = block; - insert_node_to_hir (block->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::ExternBlock *> -Mappings::lookup_hir_extern_block (HirId id) -{ - auto it = hirExternBlockMappings.find (id); - if (it == hirExternBlockMappings.end ()) - return tl::nullopt; - - return it->second; -} - void Mappings::insert_hir_extern_item (HIR::ExternalItem *item, HirId parent_block) { @@ -520,26 +461,6 @@ Mappings::lookup_impl_block_type (HirId id) return it->second; } -void -Mappings::insert_module (HIR::Module *module) -{ - auto id = module->get_mappings ().get_hirid (); - rust_assert (!lookup_module (id)); - - hirModuleMappings[id] = module; - insert_node_to_hir (module->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::Module *> -Mappings::lookup_module (HirId id) -{ - auto it = hirModuleMappings.find (id); - if (it == hirModuleMappings.end ()) - return tl::nullopt; - - return it->second; -} - void Mappings::insert_hir_implitem (HirId parent_impl_id, HIR::ImplItem *item) { @@ -561,188 +482,6 @@ Mappings::lookup_hir_implitem (HirId id) return std::make_pair (it->second.second, it->second.first); } -void -Mappings::insert_hir_expr (HIR::Expr *expr) -{ - auto id = expr->get_mappings ().get_hirid (); - hirExprMappings[id] = expr; - - insert_node_to_hir (expr->get_mappings ().get_nodeid (), id); - insert_location (id, expr->get_locus ()); -} - -tl::optional<HIR::Expr *> -Mappings::lookup_hir_expr (HirId id) -{ - auto it = hirExprMappings.find (id); - if (it == hirExprMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_path_expr_seg (HIR::PathExprSegment *expr) -{ - auto id = expr->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_path_expr_seg (id)); - - hirPathSegMappings[id] = expr; - insert_node_to_hir (expr->get_mappings ().get_nodeid (), id); - insert_location (id, expr->get_locus ()); -} - -tl::optional<HIR::PathExprSegment *> -Mappings::lookup_hir_path_expr_seg (HirId id) -{ - auto it = hirPathSegMappings.find (id); - if (it == hirPathSegMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_generic_param (HIR::GenericParam *param) -{ - auto id = param->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_generic_param (id)); - - hirGenericParamMappings[id] = param; - insert_node_to_hir (param->get_mappings ().get_nodeid (), id); - insert_location (id, param->get_locus ()); -} - -tl::optional<HIR::GenericParam *> -Mappings::lookup_hir_generic_param (HirId id) -{ - auto it = hirGenericParamMappings.find (id); - if (it == hirGenericParamMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_type (HIR::Type *type) -{ - auto id = type->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_type (id)); - - hirTypeMappings[id] = type; - insert_node_to_hir (type->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::Type *> -Mappings::lookup_hir_type (HirId id) -{ - auto it = hirTypeMappings.find (id); - if (it == hirTypeMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_stmt (HIR::Stmt *stmt) -{ - auto id = stmt->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_stmt (id)); - - hirStmtMappings[id] = stmt; - insert_node_to_hir (stmt->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::Stmt *> -Mappings::lookup_hir_stmt (HirId id) -{ - auto it = hirStmtMappings.find (id); - if (it == hirStmtMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_param (HIR::FunctionParam *param) -{ - auto id = param->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_param (id)); - - hirParamMappings[id] = param; - insert_node_to_hir (param->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::FunctionParam *> -Mappings::lookup_hir_param (HirId id) -{ - auto it = hirParamMappings.find (id); - if (it == hirParamMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_self_param (HIR::SelfParam *param) -{ - auto id = param->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_self_param (id)); - - hirSelfParamMappings[id] = param; - insert_node_to_hir (param->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::SelfParam *> -Mappings::lookup_hir_self_param (HirId id) -{ - auto it = hirSelfParamMappings.find (id); - if (it == hirSelfParamMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_struct_field (HIR::StructExprField *field) -{ - auto id = field->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_struct_field (id)); - - hirStructFieldMappings[id] = field; - insert_node_to_hir (field->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::StructExprField *> -Mappings::lookup_hir_struct_field (HirId id) -{ - auto it = hirStructFieldMappings.find (id); - if (it == hirStructFieldMappings.end ()) - return tl::nullopt; - - return it->second; -} - -void -Mappings::insert_hir_pattern (HIR::Pattern *pattern) -{ - auto id = pattern->get_mappings ().get_hirid (); - rust_assert (!lookup_hir_pattern (id)); - - hirPatternMappings[id] = pattern; - insert_node_to_hir (pattern->get_mappings ().get_nodeid (), id); -} - -tl::optional<HIR::Pattern *> -Mappings::lookup_hir_pattern (HirId id) -{ - auto it = hirPatternMappings.find (id); - if (it == hirPatternMappings.end ()) - return tl::nullopt; - - return it->second; -} - void Mappings::insert_local_defid_mapping (CrateNum crateNum, LocalDefId id, HIR::Item *item) @@ -831,7 +570,7 @@ Mappings::resolve_nodeid_to_stmt (NodeId id) return tl::nullopt; HirId resolved = it->second; - return lookup_hir_stmt (resolved); + return hir.stmt.lookup (resolved); } void @@ -877,7 +616,7 @@ Mappings::build_impl_indexes () if (!hir_id.has_value ()) return nullptr; - auto item = lookup_hir_item (hir_id.value ()); + auto item = hir.item.lookup (hir_id.value ()); return item.has_value () ? item.value () : nullptr; }; @@ -972,7 +711,7 @@ Mappings::insert_trait_item_mapping (HirId trait_item_id, HIR::Trait *trait) == hirTraitItemsToTraitMappings.end ()); hirTraitItemsToTraitMappings[trait_item_id] = trait; - auto item = lookup_hir_trait_item (trait_item_id); + auto item = hir.trait_item.lookup (trait_item_id); rust_assert (item.has_value ()); if (item.value ()->get_item_kind () != HIR::TraitItem::TraitItemKind::FUNC) return; diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 20d2ceb96f5e..3b02d83ab637 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -172,12 +172,60 @@ public: void insert (Id id, Item item) { storage.insert ({id, item}); } }; +enum class InsertionPolicy +{ + FORBID_DUPLICATES, + ALLOW_DUPLICATES, +}; + +enum class InsertLocation +{ + YES, + NO, +}; + +template <typename Item, + InsertionPolicy policy = InsertionPolicy::FORBID_DUPLICATES, + InsertLocation insert_location = InsertLocation::NO> +class PtrMapping +{ + std::unordered_map<HirId, Item *> storage; + +public: + tl::optional<Item *> lookup (HirId id); + void insert (Item *item); +}; + class ASTMappings { public: Mapping<NodeId, Privacy::ModuleVisibility> module_visibility; }; +class HIRMappings +{ +public: + PtrMapping<HIR::Item> item; + PtrMapping<HIR::TraitItem> trait_item; + PtrMapping<HIR::ExternBlock> extern_block; + PtrMapping<HIR::Module> module; + PtrMapping<HIR::Expr, InsertionPolicy::ALLOW_DUPLICATES, InsertLocation::YES> + expr; + PtrMapping<HIR::PathExprSegment, InsertionPolicy::FORBID_DUPLICATES, + InsertLocation::YES> + path_expr_segment; + PtrMapping<HIR::GenericParam, InsertionPolicy::FORBID_DUPLICATES, + InsertLocation::YES> + generic_param; + PtrMapping<HIR::Type> type; + PtrMapping<HIR::Stmt> stmt; + PtrMapping<HIR::FunctionParam, InsertionPolicy::ALLOW_DUPLICATES> + function_param; + PtrMapping<HIR::SelfParam> self_param; + PtrMapping<HIR::StructExprField> struct_expr_field; + PtrMapping<HIR::Pattern> pattern; +}; + class Mappings { public: @@ -187,6 +235,7 @@ public: CrateMappings crate_mapping; ProcMacroMappings pmacro_mappings; ASTMappings ast; + HIRMappings hir; NodeId get_next_node_id (); HirId get_next_hir_id () @@ -216,18 +265,9 @@ public: tl::optional<HIR::Item *> lookup_local_defid (CrateNum crateNum, LocalDefId id); - void insert_hir_item (HIR::Item *item); - tl::optional<HIR::Item *> lookup_hir_item (HirId id); - void insert_hir_enumitem (HIR::Enum *parent, HIR::EnumItem *item); std::pair<HIR::Enum *, HIR::EnumItem *> lookup_hir_enumitem (HirId id); - void insert_hir_trait_item (HIR::TraitItem *item); - tl::optional<HIR::TraitItem *> lookup_hir_trait_item (HirId id); - - void insert_hir_extern_block (HIR::ExternBlock *block); - tl::optional<HIR::ExternBlock *> lookup_hir_extern_block (HirId id); - void insert_hir_extern_item (HIR::ExternalItem *item, HirId parent_block); // std::pair<hir_extern_item, parent hirid> @@ -238,41 +278,11 @@ public: tl::optional<HIR::ImplBlock *> lookup_hir_impl_block (HirId id); tl::optional<HIR::ImplBlock *> lookup_impl_block_type (HirId id); - void insert_module (HIR::Module *module); - tl::optional<HIR::Module *> lookup_module (HirId id); - void insert_hir_implitem (HirId parent_impl_id, HIR::ImplItem *item); // Optional<ImpItem, ParentImpl Hir id> tl::optional<std::pair<HIR::ImplItem *, HirId>> lookup_hir_implitem (HirId id); - void insert_hir_expr (HIR::Expr *expr); - tl::optional<HIR::Expr *> lookup_hir_expr (HirId id); - - void insert_hir_path_expr_seg (HIR::PathExprSegment *expr); - tl::optional<HIR::PathExprSegment *> lookup_hir_path_expr_seg (HirId id); - - void insert_hir_generic_param (HIR::GenericParam *expr); - tl::optional<HIR::GenericParam *> lookup_hir_generic_param (HirId id); - - void insert_hir_type (HIR::Type *type); - tl::optional<HIR::Type *> lookup_hir_type (HirId id); - - void insert_hir_stmt (HIR::Stmt *stmt); - tl::optional<HIR::Stmt *> lookup_hir_stmt (HirId id); - - void insert_hir_param (HIR::FunctionParam *type); - tl::optional<HIR::FunctionParam *> lookup_hir_param (HirId id); - - void insert_hir_self_param (HIR::SelfParam *type); - tl::optional<HIR::SelfParam *> lookup_hir_self_param (HirId id); - - void insert_hir_struct_field (HIR::StructExprField *type); - tl::optional<HIR::StructExprField *> lookup_hir_struct_field (HirId id); - - void insert_hir_pattern (HIR::Pattern *pattern); - tl::optional<HIR::Pattern *> lookup_hir_pattern (HirId id); - void walk_local_defids_for_crate (CrateNum crateNum, std::function<bool (HIR::Item *)> cb); @@ -553,4 +563,6 @@ private: } // namespace Analysis } // namespace Rust +#include "rust-hir-map.hxx" + #endif // RUST_HIR_MAP_H diff --git a/gcc/rust/util/rust-hir-map.hxx b/gcc/rust/util/rust-hir-map.hxx new file mode 100644 index 000000000000..1d924957452c --- /dev/null +++ b/gcc/rust/util/rust-hir-map.hxx @@ -0,0 +1,77 @@ +// Copyright (C) 2026 Free Software Foundation, Inc. + +// This file is part of GCC. + +// GCC is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3, or (at your option) any later +// version. + +// GCC is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. + +// You should have received a copy of the GNU General Public License +// along with GCC; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include "rust-hir-map.h" +#include "optional.h" + +namespace Rust { +namespace Analysis { + +template <typename Item, InsertionPolicy policy, InsertLocation insert_location> +tl::optional<Item *> +PtrMapping<Item, policy, insert_location>::lookup (HirId id) +{ + auto it = storage.find (id); + if (it == storage.cend ()) + return tl::nullopt; + return it->second; +} + +/* Helper required because of GCC 5 baseline + * We need to check if we should include location and then compile + * `item->get_locus()` only if `get_locus` exists within the target item. + * + * With a more recent compiler this would be written as: + * if constexpr(InsertLocation::YES == location) { + * // insert location + * } + * but this is not available on cpp14 with gcc5. + */ +template <typename Item, InsertLocation location /* InsertLocation::YES */> +struct InsertLocationHelper +{ + void insert_location (Item *item, HirId hir_id) + { + Analysis::Mappings::get ().insert_location (hir_id, item->get_locus ()); + } +}; + +template <typename Item> struct InsertLocationHelper<Item, InsertLocation::NO> +{ + void insert_location (Item *item, HirId hir_id) {} +}; + +template <typename Item, InsertionPolicy policy, InsertLocation insert_location> +void +PtrMapping<Item, policy, insert_location>::insert (Item *item) +{ + auto hir_id = item->get_mappings ().get_hirid (); + + if (policy == InsertionPolicy::FORBID_DUPLICATES) + rust_assert (!lookup (hir_id).has_value ()); + + storage.insert ({hir_id, item}); + + Analysis::Mappings::get ().insert_node_to_hir ( + item->get_mappings ().get_nodeid (), hir_id); + + InsertLocationHelper<Item, insert_location> location_helper; + location_helper.insert_location (item, hir_id); +} +} // namespace Analysis +} // namespace Rust
