Skip to content

Commit 6f9b91d

Browse files
committed
save-analysis: handle type defs in struct patterns
1 parent dcc6ce2 commit 6f9b91d

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

src/librustc_trans/save/mod.rs

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,28 +1002,39 @@ impl <'l, 'tcx> DxrVisitor<'l, 'tcx> {
10021002
ast::PatStruct(ref path, ref fields, _) => {
10031003
self.collected_paths.push((p.id, path.clone(), false, recorder::StructRef));
10041004
visit::walk_path(self, path);
1005-
let struct_def = match self.lookup_type_ref(p.id) {
1006-
Some(sd) => sd,
1007-
None => {
1008-
self.sess.span_bug(p.span,
1009-
&format!("Could not find struct_def for `{}`",
1010-
self.span.snippet(p.span)));
1005+
1006+
let def = self.analysis.ty_cx.def_map.borrow()[p.id];
1007+
let struct_def = match def {
1008+
def::DefConst(..) => None,
1009+
def::DefVariant(_, variant_id, _) => Some(variant_id),
1010+
_ => {
1011+
match ty::ty_to_def_id(ty::node_id_to_type(&self.analysis.ty_cx, p.id)) {
1012+
None => {
1013+
self.sess.span_bug(p.span,
1014+
&format!("Could not find struct_def for `{}`",
1015+
self.span.snippet(p.span)));
1016+
}
1017+
Some(def_id) => Some(def_id),
1018+
}
10111019
}
10121020
};
1013-
for &Spanned { node: ref field, span } in fields {
1014-
let sub_span = self.span.span_for_first_ident(span);
1015-
let fields = ty::lookup_struct_fields(&self.analysis.ty_cx, struct_def);
1016-
for f in fields {
1017-
if f.name == field.ident.name {
1018-
self.fmt.ref_str(recorder::VarRef,
1019-
span,
1020-
sub_span,
1021-
f.id,
1022-
self.cur_scope);
1023-
break;
1021+
1022+
if let Some(struct_def) = struct_def {
1023+
let struct_fields = ty::lookup_struct_fields(&self.analysis.ty_cx, struct_def);
1024+
for &Spanned { node: ref field, span } in fields {
1025+
let sub_span = self.span.span_for_first_ident(span);
1026+
for f in &struct_fields {
1027+
if f.name == field.ident.name {
1028+
self.fmt.ref_str(recorder::VarRef,
1029+
span,
1030+
sub_span,
1031+
f.id,
1032+
self.cur_scope);
1033+
break;
1034+
}
10241035
}
1036+
self.visit_pat(&*field.pat);
10251037
}
1026-
self.visit_pat(&*field.pat);
10271038
}
10281039
}
10291040
ast::PatEnum(ref path, _) => {

0 commit comments

Comments
 (0)