Correctly handle path stability for 'use tree' items
PR #5956 started checking the stability of path segments. However, this was not applied to 'use tree' items (e.g. 'use some::path::{ItemOne, ItemTwo}') due to the way that we desugar these items in HIR lowering. This PR modifies 'use tree' lowering to preserve resolution information, which is needed by stability checking.
This commit is contained in:
parent
116819f54f
commit
c7b31d0ac9
6 changed files with 58 additions and 5 deletions
|
@ -533,7 +533,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let ident = *ident;
|
||||
let mut path = path.clone();
|
||||
for seg in &mut path.segments {
|
||||
seg.id = self.next_node_id();
|
||||
// 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;
|
||||
}
|
||||
let span = path.span;
|
||||
|
||||
|
@ -602,7 +606,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
|
||||
// Give the segments new node-ids since they are being cloned.
|
||||
for seg in &mut prefix.segments {
|
||||
seg.id = self.next_node_id();
|
||||
// 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
|
||||
|
|
|
@ -155,6 +155,10 @@ trait ResolverAstLoweringExt {
|
|||
fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>>;
|
||||
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes>;
|
||||
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_lifetime_res(&self, id: NodeId) -> Option<LifetimeRes>;
|
||||
fn take_extra_lifetime_params(&mut self, id: NodeId) -> Vec<(Ident, NodeId, LifetimeRes)>;
|
||||
|
@ -192,6 +196,12 @@ impl ResolverAstLoweringExt for ResolverAstLowering {
|
|||
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.
|
||||
fn get_partial_res(&self, id: NodeId) -> Option<PartialRes> {
|
||||
self.partial_res_map.get(&id).copied()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue