1 // Copyright (C) 2020-2023 Free Software Foundation, Inc.
3 // This file is part of GCC.
5 // GCC is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free
7 // Software Foundation; either version 3, or (at your option) any later
10 // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 // You should have received a copy of the GNU General Public License
16 // along with GCC; see the file COPYING3. If not see
17 // <http://www.gnu.org/licenses/>.
19 #include "rust-hir-map.h"
20 #include "rust-ast-full.h"
21 #include "rust-diagnostics.h"
22 #include "rust-hir-full.h"
23 #include "rust-macro-builtins.h"
24 #include "rust-mapping-common.h"
30 NodeMapping::get_error ()
32 return NodeMapping (UNKNOWN_CREATENUM
, UNKNOWN_NODEID
, UNKNOWN_HIRID
,
37 NodeMapping::get_crate_num () const
43 NodeMapping::get_nodeid () const
49 NodeMapping::get_hirid () const
55 NodeMapping::get_local_defid () const
61 NodeMapping::get_defid () const
63 return get_defid (get_crate_num (), get_local_defid ());
67 NodeMapping::get_defid (CrateNum crate_num
, LocalDefId local_defid
)
69 return DefId
{crate_num
, local_defid
};
73 NodeMapping::as_string () const
75 std::ostringstream ss
;
77 << "C: " << get_crate_num ();
78 if (get_nodeid () != UNKNOWN_NODEID
)
79 ss
<< " Nid: " << get_nodeid ();
81 if (get_hirid () != UNKNOWN_HIRID
)
82 ss
<< " Hid: " << get_hirid ();
84 if (get_local_defid () != UNKNOWN_LOCAL_DEFID
)
85 ss
<< " Lid: " << get_local_defid ();
92 static const HirId kDefaultNodeIdBegin
= 1;
93 static const HirId kDefaultHirIdBegin
= 1;
94 static const HirId kDefaultCrateNumBegin
= 0;
97 : crateNumItr (kDefaultCrateNumBegin
), currentCrateNum (UNKNOWN_CREATENUM
),
98 hirIdIter (kDefaultHirIdBegin
), nodeIdIter (kDefaultNodeIdBegin
)
100 Analysis::NodeMapping
node (0, 0, 0, 0);
102 = new HIR::ImplBlock (node
, {}, {}, nullptr, nullptr, HIR::WhereClause ({}),
104 HIR::Visibility (HIR::Visibility::VisType::PUBLIC
),
105 {}, {}, Location ());
108 Mappings::~Mappings () { delete builtinMarker
; }
113 static std::unique_ptr
<Mappings
> instance
;
115 instance
= std::unique_ptr
<Mappings
> (new Mappings ());
117 return instance
.get ();
121 Mappings::get_next_crate_num (const std::string
&name
)
123 auto id
= crateNumItr
;
125 set_crate_name (id
, name
);
130 Mappings::set_current_crate (CrateNum crateNum
)
132 currentCrateNum
= crateNum
;
136 Mappings::get_current_crate () const
138 return currentCrateNum
;
142 Mappings::get_crate_name (CrateNum crate_num
, std::string
&name
) const
144 auto it
= crate_names
.find (crate_num
);
145 if (it
== crate_names
.end ())
148 name
.assign (it
->second
);
153 Mappings::set_crate_name (CrateNum crate_num
, const std::string
&name
)
155 crate_names
[crate_num
] = name
;
159 Mappings::get_current_crate_name () const
162 bool ok
= get_crate_name (get_current_crate (), name
);
168 Mappings::lookup_crate_name (const std::string
&crate_name
,
169 CrateNum
&resolved_crate_num
) const
171 for (const auto &it
: crate_names
)
173 if (it
.second
.compare (crate_name
) == 0)
175 resolved_crate_num
= it
.first
;
183 Mappings::crate_num_to_nodeid (const CrateNum
&crate_num
, NodeId
&node_id
) const
185 auto it
= ast_crate_mappings
.find (crate_num
);
186 if (it
== ast_crate_mappings
.end ())
189 node_id
= it
->second
->get_node_id ();
194 Mappings::node_is_crate (NodeId node_id
) const
196 for (const auto &it
: ast_crate_mappings
)
198 NodeId crate_node_id
= it
.second
->get_node_id ();
199 if (crate_node_id
== node_id
)
206 Mappings::get_next_node_id ()
208 auto it
= nodeIdIter
;
214 Mappings::get_next_hir_id (CrateNum crateNum
)
219 auto it
= hirNodesWithinCrate
.find (crateNum
);
220 if (it
== hirNodesWithinCrate
.end ())
222 hirNodesWithinCrate
.insert ({crateNum
, {}});
225 hirNodesWithinCrate
[crateNum
].insert (id
);
230 Mappings::get_next_localdef_id (CrateNum crateNum
)
232 auto it
= localIdIter
.find (crateNum
);
233 if (it
== localIdIter
.end ())
235 localIdIter
.insert ({crateNum
, 1});
238 it
= localIdIter
.find (crateNum
);
239 rust_assert (it
!= localIdIter
.end ());
241 LocalDefId id
= it
->second
;
242 localIdIter
[crateNum
] = id
+ 1;
247 Mappings::get_ast_crate (CrateNum crateNum
)
249 auto it
= ast_crate_mappings
.find (crateNum
);
250 rust_assert (it
!= ast_crate_mappings
.end ());
255 Mappings::get_ast_crate_by_node_id (NodeId id
)
257 auto i
= crate_node_to_crate_num
.find (id
);
258 rust_assert (i
!= crate_node_to_crate_num
.end ());
260 CrateNum crateNum
= i
->second
;
261 auto it
= ast_crate_mappings
.find (crateNum
);
262 rust_assert (it
!= ast_crate_mappings
.end ());
267 Mappings::insert_ast_crate (std::unique_ptr
<AST::Crate
> &&crate
,
270 auto it
= ast_crate_mappings
.find (crate_num
);
271 rust_assert (it
== ast_crate_mappings
.end ());
274 ast_crate_mappings
.insert ({crate_num
, crate
.release ()});
276 // return the reference to it
277 it
= ast_crate_mappings
.find (crate_num
);
278 rust_assert (it
!= ast_crate_mappings
.end ());
283 Mappings::get_hir_crate (CrateNum crateNum
)
285 auto it
= hir_crate_mappings
.find (crateNum
);
286 rust_assert (it
!= hir_crate_mappings
.end ());
291 Mappings::is_local_hirid_crate (HirId crateNum
)
293 for (const auto &it
: hir_crate_mappings
)
295 const auto &crate
= it
.second
;
296 if (crate
->get_mappings ().get_hirid () == crateNum
)
303 Mappings::insert_hir_crate (std::unique_ptr
<HIR::Crate
> &&crate
)
305 CrateNum crateNum
= crate
->get_mappings ().get_crate_num ();
306 auto it
= hir_crate_mappings
.find (crateNum
);
307 rust_assert (it
== hir_crate_mappings
.end ());
309 insert_node_to_hir (crate
->get_mappings ().get_nodeid (),
310 crate
->get_mappings ().get_hirid ());
311 hir_crate_mappings
.insert ({crateNum
, crate
.release ()});
313 it
= hir_crate_mappings
.find (crateNum
);
314 rust_assert (it
!= hir_crate_mappings
.end ());
319 Mappings::insert_defid_mapping (DefId id
, HIR::Item
*item
)
321 CrateNum crate_num
= id
.crateNum
;
322 LocalDefId local_def_id
= id
.localDefId
;
324 rust_assert (lookup_defid (id
) == nullptr);
325 rust_assert (lookup_local_defid (crate_num
, local_def_id
) == nullptr);
326 rust_assert (lookup_trait_item_defid (id
) == nullptr);
328 defIdMappings
[id
] = item
;
329 insert_local_defid_mapping (crate_num
, local_def_id
, item
);
333 Mappings::lookup_defid (DefId id
)
335 auto it
= defIdMappings
.find (id
);
336 if (it
== defIdMappings
.end ())
343 Mappings::insert_defid_mapping (DefId id
, HIR::TraitItem
*item
)
345 CrateNum crate_num
= id
.crateNum
;
346 LocalDefId local_def_id
= id
.localDefId
;
348 rust_assert (lookup_defid (id
) == nullptr);
349 rust_assert (lookup_local_defid (crate_num
, local_def_id
) == nullptr);
350 rust_assert (lookup_trait_item_defid (id
) == nullptr);
352 defIdTraitItemMappings
[id
] = item
;
356 Mappings::lookup_trait_item_defid (DefId id
)
358 auto it
= defIdTraitItemMappings
.find (id
);
359 if (it
== defIdTraitItemMappings
.end ())
366 Mappings::insert_hir_item (HIR::Item
*item
)
368 auto id
= item
->get_mappings ().get_hirid ();
369 rust_assert (lookup_hir_item (id
) == nullptr);
371 hirItemMappings
[id
] = item
;
372 insert_node_to_hir (item
->get_mappings ().get_nodeid (), id
);
376 Mappings::lookup_hir_item (HirId id
)
378 auto it
= hirItemMappings
.find (id
);
379 if (it
== hirItemMappings
.end ())
386 Mappings::insert_hir_trait_item (HIR::TraitItem
*item
)
388 auto id
= item
->get_mappings ().get_hirid ();
389 rust_assert (lookup_hir_trait_item (id
) == nullptr);
391 hirTraitItemMappings
[id
] = item
;
392 insert_node_to_hir (item
->get_mappings ().get_nodeid (), id
);
396 Mappings::lookup_hir_trait_item (HirId id
)
398 auto it
= hirTraitItemMappings
.find (id
);
399 if (it
== hirTraitItemMappings
.end ())
406 Mappings::insert_hir_extern_block (HIR::ExternBlock
*block
)
408 auto id
= block
->get_mappings ().get_hirid ();
409 rust_assert (lookup_hir_extern_block (id
) == nullptr);
411 hirExternBlockMappings
[id
] = block
;
412 insert_node_to_hir (block
->get_mappings ().get_nodeid (), id
);
416 Mappings::lookup_hir_extern_block (HirId id
)
418 auto it
= hirExternBlockMappings
.find (id
);
419 if (it
== hirExternBlockMappings
.end ())
426 Mappings::insert_hir_extern_item (HIR::ExternalItem
*item
, HirId parent_block
)
428 auto id
= item
->get_mappings ().get_hirid ();
429 rust_assert (lookup_hir_extern_item (id
, nullptr) == nullptr);
431 hirExternItemMappings
[id
] = {item
, parent_block
};
432 insert_node_to_hir (item
->get_mappings ().get_nodeid (), id
);
436 Mappings::lookup_hir_extern_item (HirId id
, HirId
*parent_block
)
438 auto it
= hirExternItemMappings
.find (id
);
439 if (it
== hirExternItemMappings
.end ())
442 *parent_block
= it
->second
.second
;
444 return it
->second
.first
;
448 Mappings::insert_hir_impl_block (HIR::ImplBlock
*item
)
450 auto id
= item
->get_mappings ().get_hirid ();
451 rust_assert (lookup_hir_impl_block (id
) == nullptr);
453 HirId impl_type_id
= item
->get_type ()->get_mappings ().get_hirid ();
454 hirImplBlockMappings
[id
] = item
;
455 hirImplBlockTypeMappings
[impl_type_id
] = item
;
456 insert_node_to_hir (item
->get_mappings ().get_nodeid (), id
);
460 Mappings::lookup_hir_impl_block (HirId id
)
462 auto it
= hirImplBlockMappings
.find (id
);
463 if (it
== hirImplBlockMappings
.end ())
470 Mappings::lookup_impl_block_type (HirId id
, HIR::ImplBlock
**impl_block
)
472 auto it
= hirImplBlockTypeMappings
.find (id
);
473 if (it
== hirImplBlockTypeMappings
.end ())
476 *impl_block
= it
->second
;
481 Mappings::insert_module (HIR::Module
*module
)
483 auto id
= module
->get_mappings ().get_hirid ();
484 rust_assert (lookup_module (id
) == nullptr);
486 hirModuleMappings
[id
] = module
;
487 insert_node_to_hir (module
->get_mappings ().get_nodeid (), id
);
491 Mappings::lookup_module (HirId id
)
493 auto it
= hirModuleMappings
.find (id
);
494 if (it
== hirModuleMappings
.end ())
501 Mappings::insert_hir_implitem (HirId parent_impl_id
, HIR::ImplItem
*item
)
503 auto id
= item
->get_impl_mappings ().get_hirid ();
504 rust_assert (lookup_hir_implitem (id
, nullptr) == nullptr);
506 hirImplItemMappings
[id
]
507 = std::pair
<HirId
, HIR::ImplItem
*> (parent_impl_id
, item
);
508 insert_node_to_hir (item
->get_impl_mappings ().get_nodeid (), id
);
512 Mappings::lookup_hir_implitem (HirId id
, HirId
*parent_impl_id
)
514 auto it
= hirImplItemMappings
.find (id
);
515 if (it
== hirImplItemMappings
.end ())
518 std::pair
<HirId
, HIR::ImplItem
*> &ref
= it
->second
;
519 if (parent_impl_id
!= nullptr)
520 *parent_impl_id
= ref
.first
;
526 Mappings::insert_hir_expr (HIR::Expr
*expr
)
528 auto id
= expr
->get_mappings ().get_hirid ();
529 hirExprMappings
[id
] = expr
;
531 insert_node_to_hir (expr
->get_mappings ().get_nodeid (), id
);
532 insert_location (id
, expr
->get_locus ());
536 Mappings::lookup_hir_expr (HirId id
)
538 auto it
= hirExprMappings
.find (id
);
539 if (it
== hirExprMappings
.end ())
546 Mappings::insert_hir_path_expr_seg (HIR::PathExprSegment
*expr
)
548 auto id
= expr
->get_mappings ().get_hirid ();
549 rust_assert (lookup_hir_path_expr_seg (id
) == nullptr);
551 hirPathSegMappings
[id
] = expr
;
552 insert_node_to_hir (expr
->get_mappings ().get_nodeid (), id
);
553 insert_location (id
, expr
->get_locus ());
556 HIR::PathExprSegment
*
557 Mappings::lookup_hir_path_expr_seg (HirId id
)
559 auto it
= hirPathSegMappings
.find (id
);
560 if (it
== hirPathSegMappings
.end ())
567 Mappings::insert_hir_generic_param (HIR::GenericParam
*param
)
569 auto id
= param
->get_mappings ().get_hirid ();
570 rust_assert (lookup_hir_generic_param (id
) == nullptr);
572 hirGenericParamMappings
[id
] = param
;
573 insert_node_to_hir (param
->get_mappings ().get_nodeid (), id
);
574 insert_location (id
, param
->get_locus ());
578 Mappings::lookup_hir_generic_param (HirId id
)
580 auto it
= hirGenericParamMappings
.find (id
);
581 if (it
== hirGenericParamMappings
.end ())
588 Mappings::insert_hir_type (HIR::Type
*type
)
590 auto id
= type
->get_mappings ().get_hirid ();
591 rust_assert (lookup_hir_type (id
) == nullptr);
593 hirTypeMappings
[id
] = type
;
594 insert_node_to_hir (type
->get_mappings ().get_nodeid (), id
);
598 Mappings::lookup_hir_type (HirId id
)
600 auto it
= hirTypeMappings
.find (id
);
601 if (it
== hirTypeMappings
.end ())
608 Mappings::insert_hir_stmt (HIR::Stmt
*stmt
)
610 auto id
= stmt
->get_mappings ().get_hirid ();
611 rust_assert (lookup_hir_stmt (id
) == nullptr);
613 hirStmtMappings
[id
] = stmt
;
614 insert_node_to_hir (stmt
->get_mappings ().get_nodeid (), id
);
618 Mappings::lookup_hir_stmt (HirId id
)
620 auto it
= hirStmtMappings
.find (id
);
621 if (it
== hirStmtMappings
.end ())
628 Mappings::insert_hir_param (HIR::FunctionParam
*param
)
630 auto id
= param
->get_mappings ().get_hirid ();
631 rust_assert (lookup_hir_param (id
) == nullptr);
633 hirParamMappings
[id
] = param
;
634 insert_node_to_hir (param
->get_mappings ().get_nodeid (), id
);
638 Mappings::lookup_hir_param (HirId id
)
640 auto it
= hirParamMappings
.find (id
);
641 if (it
== hirParamMappings
.end ())
648 Mappings::insert_hir_self_param (HIR::SelfParam
*param
)
650 auto id
= param
->get_mappings ().get_hirid ();
651 rust_assert (lookup_hir_self_param (id
) == nullptr);
653 hirSelfParamMappings
[id
] = param
;
654 insert_node_to_hir (param
->get_mappings ().get_nodeid (), id
);
658 Mappings::lookup_hir_self_param (HirId id
)
660 auto it
= hirSelfParamMappings
.find (id
);
661 if (it
== hirSelfParamMappings
.end ())
668 Mappings::insert_hir_struct_field (HIR::StructExprField
*field
)
670 auto id
= field
->get_mappings ().get_hirid ();
671 rust_assert (lookup_hir_struct_field (id
) == nullptr);
673 hirStructFieldMappings
[id
] = field
;
674 insert_node_to_hir (field
->get_mappings ().get_nodeid (), id
);
677 HIR::StructExprField
*
678 Mappings::lookup_hir_struct_field (HirId id
)
680 auto it
= hirStructFieldMappings
.find (id
);
681 if (it
== hirStructFieldMappings
.end ())
688 Mappings::insert_hir_pattern (HIR::Pattern
*pattern
)
690 auto id
= pattern
->get_pattern_mappings ().get_hirid ();
691 rust_assert (lookup_hir_pattern (id
) == nullptr);
693 hirPatternMappings
[id
] = pattern
;
694 insert_node_to_hir (pattern
->get_pattern_mappings ().get_nodeid (), id
);
698 Mappings::lookup_hir_pattern (HirId id
)
700 auto it
= hirPatternMappings
.find (id
);
701 if (it
== hirPatternMappings
.end ())
708 Mappings::insert_local_defid_mapping (CrateNum crateNum
, LocalDefId id
,
711 rust_assert (lookup_local_defid (crateNum
, id
) == nullptr);
712 localDefIdMappings
[crateNum
][id
] = item
;
716 Mappings::lookup_local_defid (CrateNum crateNum
, LocalDefId id
)
718 auto it
= localDefIdMappings
.find (crateNum
);
719 if (it
== localDefIdMappings
.end ())
722 auto iy
= it
->second
.find (id
);
723 if (iy
== it
->second
.end ())
730 Mappings::walk_local_defids_for_crate (CrateNum crateNum
,
731 std::function
<bool (HIR::Item
*)> cb
)
733 auto it
= localDefIdMappings
.find (crateNum
);
734 if (it
== localDefIdMappings
.end ())
737 for (auto iy
= it
->second
.begin (); iy
!= it
->second
.end (); iy
++)
739 if (!cb (iy
->second
))
745 Mappings::insert_node_to_hir (NodeId id
, HirId ref
)
747 nodeIdToHirMappings
[id
] = ref
;
748 hirIdToNodeMappings
[ref
] = id
;
752 Mappings::lookup_node_to_hir (NodeId id
, HirId
*ref
)
754 auto it
= nodeIdToHirMappings
.find (id
);
755 if (it
== nodeIdToHirMappings
.end ())
763 Mappings::lookup_hir_to_node (HirId id
, NodeId
*ref
)
765 auto it
= hirIdToNodeMappings
.find (id
);
766 if (it
== hirIdToNodeMappings
.end ())
774 Mappings::insert_location (HirId id
, Location locus
)
776 locations
[id
] = locus
;
780 Mappings::lookup_location (HirId id
)
782 auto it
= locations
.find (id
);
783 if (it
== locations
.end ())
790 Mappings::resolve_nodeid_to_stmt (NodeId id
, HIR::Stmt
**stmt
)
792 auto it
= nodeIdToHirMappings
.find (id
);
793 if (it
== nodeIdToHirMappings
.end ())
796 HirId resolved
= it
->second
;
797 auto resolved_stmt
= lookup_hir_stmt (resolved
);
798 *stmt
= resolved_stmt
;
799 return resolved_stmt
!= nullptr;
803 Mappings::iterate_impl_items (
804 std::function
<bool (HirId
, HIR::ImplItem
*, HIR::ImplBlock
*)> cb
)
806 for (auto it
= hirImplItemMappings
.begin (); it
!= hirImplItemMappings
.end ();
810 auto impl_item
= it
->second
.second
;
812 = lookup_associated_impl (impl_item
->get_impl_mappings ().get_hirid ());
813 if (!cb (id
, impl_item
, impl
))
819 Mappings::iterate_impl_blocks (std::function
<bool (HirId
, HIR::ImplBlock
*)> cb
)
821 for (auto it
= hirImplBlockMappings
.begin ();
822 it
!= hirImplBlockMappings
.end (); it
++)
824 HirId id
= it
->first
;
825 HIR::ImplBlock
*impl_block
= it
->second
;
826 if (!cb (id
, impl_block
))
832 Mappings::iterate_trait_items (
833 std::function
<bool (HIR::TraitItem
*, HIR::Trait
*)> cb
)
835 for (auto it
= hirTraitItemMappings
.begin ();
836 it
!= hirTraitItemMappings
.end (); it
++)
838 HirId trait_item_id
= it
->first
;
839 HIR::TraitItem
*trait_item
= it
->second
;
840 HIR::Trait
*trait
= lookup_trait_item_mapping (trait_item_id
);
842 if (!cb (trait_item
, trait
))
848 Mappings::insert_macro_def (AST::MacroRulesDefinition
*macro
)
851 std::string
, std::function
<AST::Fragment (Location
, AST::MacroInvocData
&)>>
853 {"assert", MacroBuiltin::assert_handler
},
854 {"file", MacroBuiltin::file_handler
},
855 {"line", MacroBuiltin::line_handler
},
856 {"column", MacroBuiltin::column_handler
},
857 {"include_bytes", MacroBuiltin::include_bytes_handler
},
858 {"include_str", MacroBuiltin::include_str_handler
},
859 {"compile_error", MacroBuiltin::compile_error_handler
},
860 {"concat", MacroBuiltin::concat_handler
},
861 {"env", MacroBuiltin::env_handler
},
862 {"cfg", MacroBuiltin::cfg_handler
},
863 {"include", MacroBuiltin::include_handler
},
866 auto outer_attrs
= macro
->get_outer_attrs ();
867 bool should_be_builtin
868 = std::any_of (outer_attrs
.begin (), outer_attrs
.end (),
869 [] (AST::Attribute attr
) {
870 return attr
.get_path () == "rustc_builtin_macro";
872 if (should_be_builtin
)
874 auto builtin
= builtin_macros
.find (macro
->get_rule_name ());
875 if (builtin
!= builtin_macros
.end ())
876 macro
->set_builtin_transcriber (builtin
->second
);
878 rust_error_at (macro
->get_locus (),
879 "cannot find a built-in macro with name %qs",
880 macro
->get_rule_name ().c_str ());
883 auto it
= macroMappings
.find (macro
->get_node_id ());
884 rust_assert (it
== macroMappings
.end ());
886 macroMappings
[macro
->get_node_id ()] = macro
;
890 Mappings::lookup_macro_def (NodeId id
, AST::MacroRulesDefinition
**def
)
892 auto it
= macroMappings
.find (id
);
893 if (it
== macroMappings
.end ())
901 Mappings::insert_macro_invocation (AST::MacroInvocation
&invoc
,
902 AST::MacroRulesDefinition
*def
)
904 auto it
= macroInvocations
.find (invoc
.get_macro_node_id ());
905 rust_assert (it
== macroInvocations
.end ());
907 macroInvocations
[invoc
.get_macro_node_id ()] = def
;
911 Mappings::lookup_macro_invocation (AST::MacroInvocation
&invoc
,
912 AST::MacroRulesDefinition
**def
)
914 auto it
= macroInvocations
.find (invoc
.get_macro_node_id ());
915 if (it
== macroInvocations
.end ())
923 Mappings::insert_visibility (NodeId id
, Privacy::ModuleVisibility visibility
)
925 visibility_map
.insert ({id
, visibility
});
929 Mappings::lookup_visibility (NodeId id
, Privacy::ModuleVisibility
&def
)
931 auto it
= visibility_map
.find (id
);
932 if (it
== visibility_map
.end ())
940 Mappings::insert_module_child (NodeId module
, NodeId child
)
942 auto it
= module_child_map
.find (module
);
943 if (it
== module_child_map
.end ())
944 module_child_map
.insert ({module
, {child
}});
946 it
->second
.emplace_back (child
);
949 Optional
<std::vector
<NodeId
> &>
950 Mappings::lookup_module_children (NodeId module
)
952 auto it
= module_child_map
.find (module
);
953 if (it
== module_child_map
.end ())
954 return Optional
<std::vector
<NodeId
> &>::none ();
956 return Optional
<std::vector
<NodeId
> &>::some (it
->second
);
960 Mappings::insert_module_child_item (NodeId module
,
961 Resolver::CanonicalPath child
)
963 rust_assert (!child
.is_empty ());
964 rust_assert (child
.get_node_id () != UNKNOWN_NODEID
);
966 auto it
= module_child_items
.find (module
);
967 if (it
== module_child_items
.end ())
968 module_child_items
.insert ({module
, {child
}});
970 it
->second
.emplace_back (child
);
973 Optional
<std::vector
<Resolver::CanonicalPath
> &>
974 Mappings::lookup_module_chidren_items (NodeId module
)
976 auto it
= module_child_items
.find (module
);
977 if (it
== module_child_items
.end ())
978 return Optional
<std::vector
<Resolver::CanonicalPath
> &>::none ();
980 return Optional
<std::vector
<Resolver::CanonicalPath
> &>::some (it
->second
);
983 Optional
<Resolver::CanonicalPath
&>
984 Mappings::lookup_module_child (NodeId module
, const std::string
&item_name
)
986 Optional
<std::vector
<Resolver::CanonicalPath
> &> children
987 = lookup_module_chidren_items (module
);
988 if (children
.is_none ())
989 return Optional
<Resolver::CanonicalPath
&>::none ();
991 // lookup the children to match the name if we can
992 for (auto &child
: children
.get ())
994 const std::string
&raw_identifier
= child
.get ();
995 bool found
= raw_identifier
.compare (item_name
) == 0;
997 return Optional
<Resolver::CanonicalPath
&>::some (child
);
999 return Optional
<Resolver::CanonicalPath
&>::none ();
1003 Mappings::insert_child_item_to_parent_module_mapping (NodeId child_item
,
1004 NodeId parent_module
)
1006 child_to_parent_module_map
.insert ({child_item
, parent_module
});
1010 Mappings::lookup_parent_module (NodeId child_item
)
1012 auto it
= child_to_parent_module_map
.find (child_item
);
1013 if (it
== child_to_parent_module_map
.end ())
1014 return Optional
<NodeId
>::none ();
1016 return Optional
<NodeId
>::some (it
->second
);
1020 Mappings::node_is_module (NodeId query
)
1022 return module_child_items
.find (query
) != module_child_items
.end ();
1026 Mappings::insert_ast_item (AST::Item
*item
)
1028 auto it
= ast_item_mappings
.find (item
->get_node_id ());
1029 rust_assert (it
== ast_item_mappings
.end ());
1031 ast_item_mappings
[item
->get_node_id ()] = item
;
1035 Mappings::lookup_ast_item (NodeId id
, AST::Item
**result
)
1037 auto it
= ast_item_mappings
.find (id
);
1038 if (it
== ast_item_mappings
.end ())
1041 *result
= it
->second
;
1046 Mappings::lookup_builtin_marker ()
1048 return builtinMarker
;
1051 } // namespace Analysis