aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/util/rust-hir-map.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/util/rust-hir-map.cc')
-rw-r--r--gcc/rust/util/rust-hir-map.cc65
1 files changed, 64 insertions, 1 deletions
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index 094d0e3..70c59f3 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -133,6 +133,8 @@ Mappings::get_current_crate ()
hirIdIter[currentCrateNum] = UNKNOWN_HIRID;
nodeIdIter[currentCrateNum] = UNKNOWN_NODEID;
localIdIter[currentCrateNum] = UNKNOWN_LOCAL_DEFID;
+ nodeIdToHirMappings[currentCrateNum] = {};
+ locations[currentCrateNum] = {};
}
return currentCrateNum;
@@ -157,7 +159,7 @@ Mappings::get_next_hir_id (CrateNum crateNum)
auto id = it->second + 1;
hirIdIter[crateNum] = id;
- return id++;
+ return id;
}
LocalDefId
@@ -238,6 +240,7 @@ Mappings::insert_hir_item (CrateNum crateNum, HirId id, HIR::Item *item)
rust_assert (lookup_hir_item (crateNum, id) == nullptr);
hirItemMappings[crateNum][id] = item;
+ nodeIdToHirMappings[crateNum][item->get_mappings ().get_nodeid ()] = id;
}
HIR::Item *
@@ -260,6 +263,8 @@ Mappings::insert_hir_expr (CrateNum crateNum, HirId id, HIR::Expr *expr)
rust_assert (lookup_hir_expr (crateNum, id) == nullptr);
hirExprMappings[crateNum][id] = expr;
+ nodeIdToHirMappings[crateNum][expr->get_mappings ().get_nodeid ()] = id;
+ insert_location (crateNum, id, expr->get_locus_slow ());
}
HIR::Expr *
@@ -277,6 +282,29 @@ Mappings::lookup_hir_expr (CrateNum crateNum, HirId id)
}
void
+Mappings::insert_hir_type (CrateNum crateNum, HirId id, HIR::Type *type)
+{
+ rust_assert (lookup_hir_type (crateNum, id) == nullptr);
+
+ hirTypeMappings[crateNum][id] = type;
+ nodeIdToHirMappings[crateNum][type->get_mappings ().get_nodeid ()] = id;
+}
+
+HIR::Type *
+Mappings::lookup_hir_type (CrateNum crateNum, HirId id)
+{
+ auto it = hirTypeMappings.find (crateNum);
+ if (it == hirTypeMappings.end ())
+ return nullptr;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return nullptr;
+
+ return iy->second;
+}
+
+void
Mappings::insert_local_defid_mapping (CrateNum crateNum, LocalDefId id,
HIR::Item *item)
{
@@ -314,5 +342,40 @@ Mappings::walk_local_defids_for_crate (CrateNum crateNum,
}
}
+bool
+Mappings::lookup_node_to_hir (CrateNum crate, NodeId id, HirId *ref)
+{
+ auto it = nodeIdToHirMappings.find (crate);
+ if (it == nodeIdToHirMappings.end ())
+ return false;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return false;
+
+ *ref = iy->second;
+ return true;
+}
+
+void
+Mappings::insert_location (CrateNum crate, HirId id, Location locus)
+{
+ locations[crate][id] = locus;
+}
+
+Location
+Mappings::lookup_location (CrateNum crate, HirId id)
+{
+ auto it = locations.find (crate);
+ if (it == locations.end ())
+ return Location ();
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return Location ();
+
+ return iy->second;
+}
+
} // namespace Analysis
} // namespace Rust