]> git.lizzy.rs Git - rust.git/commitdiff
save-analysis: add a decl_id for methods
authorNick Cameron <ncameron@mozilla.com>
Thu, 16 Jun 2016 10:28:39 +0000 (11:28 +0100)
committerNick Cameron <ncameron@mozilla.com>
Thu, 16 Jun 2016 10:28:39 +0000 (11:28 +0100)
This is non-null if the method is in a (non-inherent) impl and in that case will be the id for the method declaration in the implemented trait.

src/librustc_save_analysis/data.rs
src/librustc_save_analysis/dump_visitor.rs
src/librustc_save_analysis/external_data.rs
src/librustc_save_analysis/json_dumper.rs

index 94e2a52c6ada9ff7df950e48f738455e3f2ceab8..15aaa77cc3518fe3ef7a6a587b0fa539c58c4ef9 100644 (file)
@@ -214,6 +214,7 @@ pub struct MethodData {
     pub span: Span,
     pub scope: NodeId,
     pub value: String,
+    pub decl_id: Option<DefId>,
 }
 
 /// Data for modules.
index a6bc6e180acbdf28bf8935519313974d48dc2f6d..56c7436a8fe5c3b08875bfa642fe81b21493322e 100644 (file)
@@ -30,7 +30,7 @@
 use rustc::hir::def::Def;
 use rustc::hir::def_id::DefId;
 use rustc::session::Session;
-use rustc::ty::{self, TyCtxt};
+use rustc::ty::{self, TyCtxt, ImplOrTraitItem, ImplOrTraitItemContainer};
 
 use std::collections::HashSet;
 use std::hash::*;
@@ -381,24 +381,42 @@ fn process_method(&mut self,
 
             let sig_str = ::make_signature(&sig.decl, &sig.generics);
             if body.is_some() {
-                if !self.span.filter_generated(Some(method_data.span), span) {
-                    let mut data = method_data.clone();
-                    data.value = sig_str;
-                    self.dumper.function(data.lower(self.tcx));
-                }
                 self.process_formals(&sig.decl.inputs, &method_data.qualname);
-            } else {
-                if !self.span.filter_generated(Some(method_data.span), span) {
-                    self.dumper.method(MethodData {
-                        id: method_data.id,
-                        name: method_data.name,
-                        span: method_data.span,
-                        scope: method_data.scope,
-                        qualname: method_data.qualname.clone(),
-                        value: sig_str,
-                    }.lower(self.tcx));
-                }
             }
+
+            // If the method is defined in an impl, then try and find the corresponding
+            // method decl in a trait, and if there is one, make a decl_id for it. This
+            // requires looking up the impl, then the trait, then searching for a method
+            // with the right name.
+            if !self.span.filter_generated(Some(method_data.span), span) {
+                let container =
+                    self.tcx.impl_or_trait_item(self.tcx.map.local_def_id(id)).container();
+                let decl_id = if let ImplOrTraitItemContainer::ImplContainer(id) = container {
+                    self.tcx.trait_id_of_impl(id).and_then(|id| {
+                        for item in &**self.tcx.trait_items(id) {
+                            if let &ImplOrTraitItem::MethodTraitItem(ref m) = item {
+                                if m.name == name {
+                                    return Some(m.def_id);
+                                }
+                            }
+                        }
+                        None
+                    })
+                } else {
+                    None
+                };
+
+                self.dumper.method(MethodData {
+                    id: method_data.id,
+                    name: method_data.name,
+                    span: method_data.span,
+                    scope: method_data.scope,
+                    qualname: method_data.qualname.clone(),
+                    value: sig_str,
+                    decl_id: decl_id,
+                }.lower(self.tcx));
+            }
+
             self.process_generic_params(&sig.generics, span, &method_data.qualname, id);
         }
 
index 3c59765e6c1421ce7e97703ad6fa8b4f407af5a6..7efd2624561e7ff915b8099df602d96cfe1c83fe 100644 (file)
@@ -321,6 +321,7 @@ pub struct MethodData {
     pub span: SpanData,
     pub scope: DefId,
     pub value: String,
+    pub decl_id: Option<DefId>,
 }
 
 impl Lower for data::MethodData {
@@ -334,6 +335,7 @@ fn lower(self, tcx: TyCtxt) -> MethodData {
             id: make_def_id(self.id, &tcx.map),
             qualname: self.qualname,
             value: self.value,
+            decl_id: self.decl_id,
         }
     }
 }
index f1ca127667c62898cbf3c580452e066d58fa2d49..b1955cbd7b8016cc9b0d85ea99b2f52d17c7286a 100644 (file)
@@ -182,6 +182,7 @@ struct Def {
     qualname: String,
     value: String,
     children: Vec<Id>,
+    decl_id: Option<Id>,
 }
 
 #[derive(Debug, RustcEncodable)]
@@ -221,6 +222,7 @@ fn from(data: EnumData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: data.variants.into_iter().map(|id| From::from(id)).collect(),
+            decl_id: None,
         }
     }
 }
@@ -235,6 +237,7 @@ fn from(data: TupleVariantData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: vec![],
+            decl_id: None,
         }
     }
 }
@@ -248,6 +251,7 @@ fn from(data: StructVariantData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: vec![],
+            decl_id: None,
         }
     }
 }
@@ -261,6 +265,7 @@ fn from(data: StructData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: data.fields.into_iter().map(|id| From::from(id)).collect(),
+            decl_id: None,
         }
     }
 }
@@ -274,6 +279,7 @@ fn from(data: TraitData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: data.items.into_iter().map(|id| From::from(id)).collect(),
+            decl_id: None,
         }
     }
 }
@@ -287,6 +293,7 @@ fn from(data: FunctionData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: vec![],
+            decl_id: None,
         }
     }
 }
@@ -300,6 +307,7 @@ fn from(data: MethodData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: vec![],
+            decl_id: data.decl_id.map(|id| From::from(id)),
         }
     }
 }
@@ -313,6 +321,7 @@ fn from(data: MacroData) -> Def {
             qualname: data.qualname,
             value: String::new(),
             children: vec![],
+            decl_id: None,
         }
     }
 }
@@ -326,6 +335,7 @@ fn from(data:ModData) -> Def {
             qualname: data.qualname,
             value: data.filename,
             children: data.items.into_iter().map(|id| From::from(id)).collect(),
+            decl_id: None,
         }
     }
 }
@@ -339,6 +349,7 @@ fn from(data: TypeDefData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: vec![],
+            decl_id: None,
         }
     }
 }
@@ -357,6 +368,7 @@ fn from(data: VariableData) -> Def {
             qualname: data.qualname,
             value: data.value,
             children: vec![],
+            decl_id: None,
         }
     }
 }