From 4895deaeea03d8d1a7329a0ff55849201a75a8b6 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Wed, 31 Oct 2018 11:05:58 +1300 Subject: [PATCH] save-analysis: make sure we save the def for the last segment of a path --- src/librustc/hir/lowering.rs | 11 ++++------- src/librustc_resolve/lib.rs | 22 +++++++++++++--------- src/librustc_save_analysis/dump_visitor.rs | 3 +-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index c3c65816b26..b6621e0962c 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -1754,7 +1754,6 @@ fn lower_path_extra( &mut self, def: Def, p: &Path, - ident: Option, param_mode: ParamMode, explicit_owner: Option, ) -> hir::Path { @@ -1773,7 +1772,6 @@ fn lower_path_extra( explicit_owner, ) }) - .chain(ident.map(|ident| hir::PathSegment::from_ident(ident))) .collect(), span: p.span, } @@ -1781,7 +1779,7 @@ fn lower_path_extra( fn lower_path(&mut self, id: NodeId, p: &Path, param_mode: ParamMode) -> hir::Path { let def = self.expect_full_def(id); - self.lower_path_extra(def, p, None, param_mode, None) + self.lower_path_extra(def, p, param_mode, None) } fn lower_path_segment( @@ -3014,7 +3012,7 @@ fn lower_use_tree( self.with_hir_id_owner(new_node_id, |this| { let new_id = this.lower_node_id(new_node_id); let path = - this.lower_path_extra(def, &path, None, ParamMode::Explicit, None); + this.lower_path_extra(def, &path, ParamMode::Explicit, None); let item = hir::ItemKind::Use(P(path), hir::UseKind::Single); let vis_kind = match vis.node { hir::VisibilityKind::Public => hir::VisibilityKind::Public, @@ -3053,7 +3051,7 @@ fn lower_use_tree( } let path = - P(self.lower_path_extra(ret_def, &path, None, ParamMode::Explicit, None)); + P(self.lower_path_extra(ret_def, &path, ParamMode::Explicit, None)); hir::ItemKind::Use(path, hir::UseKind::Single) } UseTreeKind::Glob => { @@ -3140,7 +3138,7 @@ fn lower_use_tree( // the stability of `use a::{};`, to avoid it showing up as // a re-export by accident when `pub`, e.g. in documentation. let def = self.expect_full_def_from_use(id).next().unwrap_or(Def::Err); - let path = P(self.lower_path_extra(def, &prefix, None, ParamMode::Explicit, None)); + let path = P(self.lower_path_extra(def, &prefix, ParamMode::Explicit, None)); *vis = respan(prefix.span.shrink_to_lo(), hir::VisibilityKind::Inherited); hir::ItemKind::Use(path, hir::UseKind::ListStem) } @@ -4550,7 +4548,6 @@ fn lower_visibility( path: P(self.lower_path_extra( def, path, - None, ParamMode::Explicit, explicit_owner, )), diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index ebd87e87ff6..094488f3af3 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -3589,7 +3589,17 @@ fn resolve_path( ); for (i, &Segment { ident, id }) in path.iter().enumerate() { - debug!("resolve_path ident {} {:?}", i, ident); + debug!("resolve_path ident {} {:?} {:?}", i, ident, id); + let record_segment_def = |this: &mut Self, def| { + if record_used { + if let Some(id) = id { + if !this.def_map.contains_key(&id) { + assert!(id != ast::DUMMY_NODE_ID, "Trying to resolve dummy id"); + this.record_def(id, PathResolution::new(def)); + } + } + } + }; let is_last = i == path.len() - 1; let ns = if is_last { opt_ns.unwrap_or(TypeNS) } else { TypeNS }; @@ -3673,6 +3683,7 @@ fn resolve_path( // we found a local variable or type param Some(LexicalScopeBinding::Def(def)) if opt_ns == Some(TypeNS) || opt_ns == Some(ValueNS) => { + record_segment_def(self, def); return PathResult::NonModule(PathResolution::with_unresolved_segments( def, path.len() - 1 )); @@ -3690,14 +3701,7 @@ fn resolve_path( let maybe_assoc = opt_ns != Some(MacroNS) && PathSource::Type.is_expected(def); if let Some(next_module) = binding.module() { module = Some(ModuleOrUniformRoot::Module(next_module)); - if record_used { - if let Some(id) = id { - if !self.def_map.contains_key(&id) { - assert!(id != ast::DUMMY_NODE_ID, "Trying to resolve dummy id"); - self.record_def(id, PathResolution::new(def)); - } - } - } + record_segment_def(self, def); } else if def == Def::ToolMod && i + 1 != path.len() { let def = Def::NonMacroAttr(NonMacroAttrKind::Tool); return PathResult::NonModule(PathResolution::new(def)); diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs index c0b718e4863..839b8956b4c 100644 --- a/src/librustc_save_analysis/dump_visitor.rs +++ b/src/librustc_save_analysis/dump_visitor.rs @@ -771,8 +771,7 @@ fn dump_path_ref(&mut self, id: NodeId, path: &ast::Path) { } fn process_path(&mut self, id: NodeId, path: &'l ast::Path) { - debug!("process_path {:?}", path); - if generated_code(path.span) { + if self.span.filter_generated(path.span) { return; } self.dump_path_ref(id, path); -- 2.44.0