about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2015-07-16 14:14:54 +0530
committerManish Goregaokar <manishsmail@gmail.com>2015-07-16 16:37:40 +0530
commit77d5fca3effd71b2270d7bd00a758fd8522c0d4b (patch)
treee82daa4d803152b3f6aa1ddeb0665c879946ff93 /src
parentb8a9c801662fbddb833ff30aae578fcf6659bf77 (diff)
parent49d3a93c52e65b5b37370390dd352471c21dbaf7 (diff)
downloadrust-77d5fca3effd71b2270d7bd00a758fd8522c0d4b.tar.gz
rust-77d5fca3effd71b2270d7bd00a758fd8522c0d4b.zip
Rollup merge of #27030 - nrc:save-ctors, r=alexcrichton
Diffstat (limited to 'src')
-rw-r--r--src/librustc/ast_map/mod.rs7
-rw-r--r--src/librustc_trans/save/dump_csv.rs8
-rw-r--r--src/librustc_trans/save/mod.rs43
-rw-r--r--src/librustc_trans/save/span_utils.rs7
4 files changed, 48 insertions, 17 deletions
diff --git a/src/librustc/ast_map/mod.rs b/src/librustc/ast_map/mod.rs
index 3205141e604..5c10cc6aaa8 100644
--- a/src/librustc/ast_map/mod.rs
+++ b/src/librustc/ast_map/mod.rs
@@ -411,6 +411,13 @@ impl<'ast> Map<'ast> {
         }
     }
 
+    pub fn expect_trait_item(&self, id: NodeId) -> &'ast TraitItem {
+        match self.find(id) {
+            Some(NodeTraitItem(item)) => item,
+            _ => panic!("expected trait item, found {}", self.node_to_string(id))
+        }
+    }
+
     pub fn expect_struct(&self, id: NodeId) -> &'ast StructDef {
         match self.find(id) {
             Some(NodeItem(i)) => {
diff --git a/src/librustc_trans/save/dump_csv.rs b/src/librustc_trans/save/dump_csv.rs
index c5196d09e00..680999717ea 100644
--- a/src/librustc_trans/save/dump_csv.rs
+++ b/src/librustc_trans/save/dump_csv.rs
@@ -35,7 +35,6 @@ use session::Session;
 use middle::def;
 use middle::ty::{self, Ty};
 
-use std::cell::Cell;
 use std::fs::File;
 use std::path::Path;
 
@@ -76,14 +75,11 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
     pub fn new(tcx: &'l ty::ctxt<'tcx>,
                analysis: &'l ty::CrateAnalysis,
                output_file: Box<File>) -> DumpCsvVisitor<'l, 'tcx> {
-        let span_utils = SpanUtils {
-            sess: &tcx.sess,
-            err_count: Cell::new(0)
-        };
+        let span_utils = SpanUtils::new(&tcx.sess);
         DumpCsvVisitor {
             sess: &tcx.sess,
             tcx: tcx,
-            save_ctxt: SaveContext::new(tcx, span_utils.clone()),
+            save_ctxt: SaveContext::from_span_utils(tcx, span_utils.clone()),
             analysis: analysis,
             span: span_utils.clone(),
             fmt: FmtStrs::new(box Recorder {
diff --git a/src/librustc_trans/save/mod.rs b/src/librustc_trans/save/mod.rs
index 59da0c09d34..26da803de65 100644
--- a/src/librustc_trans/save/mod.rs
+++ b/src/librustc_trans/save/mod.rs
@@ -163,9 +163,14 @@ pub struct MethodCallData {
 
 
 impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
-    pub fn new(tcx: &'l ty::ctxt<'tcx>,
-               span_utils: SpanUtils<'l>)
-               -> SaveContext<'l, 'tcx> {
+    pub fn new(tcx: &'l ty::ctxt<'tcx>) -> SaveContext <'l, 'tcx> {
+        let span_utils = SpanUtils::new(&tcx.sess);
+        SaveContext::from_span_utils(tcx, span_utils)
+    }
+
+    pub fn from_span_utils(tcx: &'l ty::ctxt<'tcx>,
+                           span_utils: SpanUtils<'l>)
+                           -> SaveContext<'l, 'tcx> {
         SaveContext {
             tcx: tcx,
             span_utils: span_utils,
@@ -527,7 +532,10 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     ref_id: def.def_id(),
                 })
             }
-            def::DefStruct(def_id) | def::DefTy(def_id, _) => {
+            def::DefStruct(def_id) |
+            def::DefTy(def_id, _) |
+            def::DefTrait(def_id) |
+            def::DefTyParam(_, _, def_id, _) => {
                 Data::TypeRefData(TypeRefData {
                     span: sub_span.unwrap(),
                     ref_id: def_id,
@@ -540,13 +548,12 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     let ti = self.tcx.impl_or_trait_item(decl_id);
                     match provenence {
                         def::FromTrait(def_id) => {
-                            Some(self.tcx.trait_items(def_id)
-                                    .iter()
-                                    .find(|mr| {
-                                        mr.name() == ti.name()
-                                    })
-                                    .unwrap()
-                                    .def_id())
+                            self.tcx.trait_items(def_id)
+                                .iter()
+                                .find(|mr| {
+                                    mr.name() == ti.name() && self.trait_method_has_body(mr)
+                                })
+                                .map(|mr| mr.def_id())
                         }
                         def::FromImpl(def_id) => {
                             let impl_items = self.tcx.impl_items.borrow();
@@ -586,6 +593,20 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
         }
     }
 
+    fn trait_method_has_body(&self, mr: &ty::ImplOrTraitItem) -> bool {
+        let def_id = mr.def_id();
+        if def_id.krate != ast::LOCAL_CRATE {
+            return false;
+        }
+
+        let trait_item = self.tcx.map.expect_trait_item(def_id.node);
+        if let ast::TraitItem_::MethodTraitItem(_, Some(_)) = trait_item.node {
+            true
+        } else {
+            false
+        }
+    }
+
     pub fn get_field_ref_data(&self,
                               field_ref: &ast::Field,
                               struct_id: DefId,
diff --git a/src/librustc_trans/save/span_utils.rs b/src/librustc_trans/save/span_utils.rs
index 08cbd777c09..ee7b1c4ff6e 100644
--- a/src/librustc_trans/save/span_utils.rs
+++ b/src/librustc_trans/save/span_utils.rs
@@ -28,6 +28,13 @@ pub struct SpanUtils<'a> {
 }
 
 impl<'a> SpanUtils<'a> {
+    pub fn new(sess: &'a Session) -> SpanUtils<'a> {
+        SpanUtils {
+            sess: sess,
+            err_count: Cell::new(0)
+        }
+    }
+
     // Standard string for extents/location.
     pub fn extent_str(&self, span: Span) -> String {
         let lo_loc = self.sess.codemap().lookup_char_pos(span.lo);