about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNick Cameron <ncameron@mozilla.com>2018-08-31 10:10:57 +1200
committerNick Cameron <ncameron@mozilla.com>2018-08-31 10:10:57 +1200
commit6aafd7adc6f882fcb1f9b60fd90ad5af9e391a0a (patch)
tree2e637eafd20f1ecd6bf82f8c1d032b959d62b02b
parentf8d34596ff74da91e0877212a9979cb9ca13eb7e (diff)
downloadrust-6aafd7adc6f882fcb1f9b60fd90ad5af9e391a0a.tar.gz
rust-6aafd7adc6f882fcb1f9b60fd90ad5af9e391a0a.zip
save-analysis: record info for the types in `where` clauses
cc https://github.com/rust-lang-nursery/rls/issues/987
-rw-r--r--src/librustc_save_analysis/dump_visitor.rs29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs
index dc9310cdcda..eee6dca9f98 100644
--- a/src/librustc_save_analysis/dump_visitor.rs
+++ b/src/librustc_save_analysis/dump_visitor.rs
@@ -1362,6 +1362,14 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
             }
         }
     }
+
+    fn process_bounds(&mut self, bounds: &'l ast::GenericBounds) {
+        for bound in bounds {
+            if let ast::GenericBound::Trait(ref trait_ref, _) = *bound {
+                self.process_path(trait_ref.trait_ref.ref_id, &trait_ref.trait_ref.path)
+            }
+        }
+    }
 }
 
 impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> Visitor<'l> for DumpVisitor<'l, 'tcx, 'll, O> {
@@ -1527,20 +1535,19 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> Visitor<'l> for DumpVisitor<'l, 'tc
 
     fn visit_generics(&mut self, generics: &'l ast::Generics) {
         for param in &generics.params {
-            match param.kind {
-                ast::GenericParamKind::Lifetime { .. } => {}
-                ast::GenericParamKind::Type { ref default, .. } => {
-                    for bound in &param.bounds {
-                        if let ast::GenericBound::Trait(ref trait_ref, _) = *bound {
-                            self.process_path(trait_ref.trait_ref.ref_id, &trait_ref.trait_ref.path)
-                        }
-                    }
-                    if let Some(ref ty) = default {
-                        self.visit_ty(&ty);
-                    }
+            if let ast::GenericParamKind::Type { ref default, .. } = param.kind {
+                self.process_bounds(&param.bounds);
+                if let Some(ref ty) = default {
+                    self.visit_ty(&ty);
                 }
             }
         }
+        for pred in &generics.where_clause.predicates {
+            if let ast::WherePredicate::BoundPredicate(ref wbp) = *pred {
+                self.process_bounds(&wbp.bounds);
+                self.visit_ty(&wbp.bounded_ty);
+            }
+        }
     }
 
     fn visit_ty(&mut self, t: &'l ast::Ty) {