Skip to content

Commit c47ed14

Browse files
committed
save-analysis: Get path def from parent in case there's no def for the path itself.
This fixes rust-lang#57462. The relevant part from the hir type collector is: ``` DEBUG 2019-01-09T15:42:58Z: rustc::hir::map::collector: hir_map: NodeId(32) => Entry { parent: NodeId(33), dep_node: 4294967040, node: Expr(expr(32: <Foo>::new)) } DEBUG 2019-01-09T15:42:58Z: rustc::hir::map::collector: hir_map: NodeId(48) => Entry { parent: NodeId(32), dep_node: 4294967040, node: Ty(type(Foo)) } DEBUG 2019-01-09T15:42:58Z: rustc::hir::map::collector: hir_map: NodeId(30) => Entry { parent: NodeId(48), dep_node: 4294967040, node: PathSegment(PathSegment { ident: Foo#0, id: Some(NodeId(30)), def: Some(Err), args: None, infer_types: true }) } DEBUG 2019-01-09T15:42:58Z: rustc::hir::map::collector: hir_map: NodeId(31) => Entry { parent: NodeId(32), dep_node: 4294967040, node: PathSegment(PathSegment { ident: new#0, id: Some(NodeId(31)), def: Some(Err), args: None, infer_types: true }) } ``` We have the right ID when looking for NodeId(31) and try with NodeId(32) (which is the right thing to look for) from get_path_data, but not for the segments that we write from `write_sub_paths_truncated`. Basically `process_path` takes an id which is always the parent, and that we fall back to in `get_path_data()`, so we get the right result for the last path segment, but not for the other segments that get written to from `write_sub_paths_truncated`. I think we can stop passing the explicit id around to `get_path_data` now, will consider sending that as a followup.
1 parent 8c97b6f commit c47ed14

File tree

1 file changed

+5
-3
lines changed
  • src/librustc_save_analysis

1 file changed

+5
-3
lines changed

src/librustc_save_analysis/lib.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -622,9 +622,11 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
622622
Node::Visibility(&Spanned {
623623
node: hir::VisibilityKind::Restricted { ref path, .. }, .. }) => path.def,
624624

625-
Node::PathSegment(seg) => match seg.def {
626-
Some(def) => def,
627-
None => HirDef::Err,
625+
Node::PathSegment(seg) => {
626+
match seg.def {
627+
Some(def) if def != HirDef::Err => def,
628+
_ => self.get_path_def(self.tcx.hir().get_parent_node(id)),
629+
}
628630
},
629631
Node::Expr(&hir::Expr {
630632
node: hir::ExprKind::Struct(ref qpath, ..),

0 commit comments

Comments
 (0)