Auto merge of #113847 - SparrowLii:path_clone, r=cjgillot
avoid clone path prefix when lowering to hir Found this while trying to parallelize `lower_to_hir`. When lowering to hir, `Nested` paths in `ast` will be split and the prefix segments will be cloned. This could be omited, since the only consequence is that the prefix segments in `Path`s in hir will have the same `HirId`s, and it seems harmless. This simplifies the process of lowering to hir and avoids re-modification of `ResolverAstLowering`. r? `@Aaron1011` cc #99292
This commit is contained in:
commit
c06b2b9117
@ -551,17 +551,6 @@ fn lower_use_tree(
|
|||||||
for &(ref use_tree, id) in trees {
|
for &(ref use_tree, id) in trees {
|
||||||
let new_hir_id = self.local_def_id(id);
|
let new_hir_id = self.local_def_id(id);
|
||||||
|
|
||||||
let mut prefix = prefix.clone();
|
|
||||||
|
|
||||||
// Give the segments new node-ids since they are being cloned.
|
|
||||||
for seg in &mut prefix.segments {
|
|
||||||
// Give the cloned segment the same resolution information
|
|
||||||
// as the old one (this is needed for stability checking).
|
|
||||||
let new_id = self.next_node_id();
|
|
||||||
self.resolver.clone_res(seg.id, new_id);
|
|
||||||
seg.id = new_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each `use` import is an item and thus are owners of the
|
// Each `use` import is an item and thus are owners of the
|
||||||
// names in the path. Up to this point the nested import is
|
// names in the path. Up to this point the nested import is
|
||||||
// the current owner, since we want each desugared import to
|
// the current owner, since we want each desugared import to
|
||||||
@ -570,6 +559,9 @@ fn lower_use_tree(
|
|||||||
self.with_hir_id_owner(id, |this| {
|
self.with_hir_id_owner(id, |this| {
|
||||||
let mut ident = *ident;
|
let mut ident = *ident;
|
||||||
|
|
||||||
|
// `prefix` is lowered multiple times, but in different HIR owners.
|
||||||
|
// So each segment gets renewed `HirId` with the same
|
||||||
|
// `ItemLocalId` and the new owner. (See `lower_node_id`)
|
||||||
let kind =
|
let kind =
|
||||||
this.lower_use_tree(use_tree, &prefix, id, vis_span, &mut ident, attrs);
|
this.lower_use_tree(use_tree, &prefix, id, vis_span, &mut ident, attrs);
|
||||||
if let Some(attrs) = attrs {
|
if let Some(attrs) = attrs {
|
||||||
|
@ -148,10 +148,6 @@ trait ResolverAstLoweringExt {
|
|||||||
fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>>;
|
fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>>;
|
||||||
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes>;
|
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes>;
|
||||||
fn get_import_res(&self, id: NodeId) -> PerNS<Option<Res<NodeId>>>;
|
fn get_import_res(&self, id: NodeId) -> PerNS<Option<Res<NodeId>>>;
|
||||||
// Clones the resolution (if any) on 'source' and applies it
|
|
||||||
// to 'target'. Used when desugaring a `UseTreeKind::Nested` to
|
|
||||||
// multiple `UseTreeKind::Simple`s
|
|
||||||
fn clone_res(&mut self, source: NodeId, target: NodeId);
|
|
||||||
fn get_label_res(&self, id: NodeId) -> Option<NodeId>;
|
fn get_label_res(&self, id: NodeId) -> Option<NodeId>;
|
||||||
fn get_lifetime_res(&self, id: NodeId) -> Option<LifetimeRes>;
|
fn get_lifetime_res(&self, id: NodeId) -> Option<LifetimeRes>;
|
||||||
fn take_extra_lifetime_params(&mut self, id: NodeId) -> Vec<(Ident, NodeId, LifetimeRes)>;
|
fn take_extra_lifetime_params(&mut self, id: NodeId) -> Vec<(Ident, NodeId, LifetimeRes)>;
|
||||||
@ -184,12 +180,6 @@ fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clone_res(&mut self, source: NodeId, target: NodeId) {
|
|
||||||
if let Some(res) = self.partial_res_map.get(&source) {
|
|
||||||
self.partial_res_map.insert(target, *res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Obtains resolution for a `NodeId` with a single resolution.
|
/// Obtains resolution for a `NodeId` with a single resolution.
|
||||||
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes> {
|
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes> {
|
||||||
self.partial_res_map.get(&id).copied()
|
self.partial_res_map.get(&id).copied()
|
||||||
|
Loading…
Reference in New Issue
Block a user