about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNick Cameron <ncameron@mozilla.com>2017-05-31 15:59:48 +1200
committerNick Cameron <ncameron@mozilla.com>2017-06-12 14:14:23 +1200
commita2a999f0356d037d09b7cd1d3b5b3011d6b810db (patch)
tree5cd8ef45dfa80e856894d38d0ac09a3add55209c
parent0058fdd110bd98a8e3e8b487247bef5f4e6cb618 (diff)
downloadrust-a2a999f0356d037d09b7cd1d3b5b3011d6b810db.tar.gz
rust-a2a999f0356d037d09b7cd1d3b5b3011d6b810db.zip
Use the new signature stuff
And fix a couple of bugs
-rw-r--r--src/librustc_save_analysis/data.rs41
-rw-r--r--src/librustc_save_analysis/dump_visitor.rs37
-rw-r--r--src/librustc_save_analysis/external_data.rs65
-rw-r--r--src/librustc_save_analysis/json_api_dumper.rs14
-rw-r--r--src/librustc_save_analysis/json_dumper.rs43
-rw-r--r--src/librustc_save_analysis/lib.rs79
-rw-r--r--src/librustc_save_analysis/sig.rs27
7 files changed, 95 insertions, 211 deletions
diff --git a/src/librustc_save_analysis/data.rs b/src/librustc_save_analysis/data.rs
index cac1a2e3c5a..e15e3f6e79e 100644
--- a/src/librustc_save_analysis/data.rs
+++ b/src/librustc_save_analysis/data.rs
@@ -18,7 +18,7 @@ use rustc::hir::def_id::{CrateNum, DefId};
 use syntax::ast::{self, Attribute, NodeId};
 use syntax_pos::Span;
 
-use rls_data::ExternalCrateData;
+use rls_data::{ExternalCrateData, Signature};
 
 pub struct CrateData {
     pub name: String,
@@ -129,7 +129,7 @@ pub struct EnumData {
     pub variants: Vec<NodeId>,
     pub visibility: Visibility,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -165,7 +165,7 @@ pub struct FunctionData {
     pub visibility: Visibility,
     pub parent: Option<DefId>,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -251,7 +251,7 @@ pub struct MethodData {
     pub parent: Option<DefId>,
     pub visibility: Visibility,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -292,7 +292,7 @@ pub struct StructData {
     pub fields: Vec<NodeId>,
     pub visibility: Visibility,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -307,7 +307,7 @@ pub struct StructVariantData {
     pub scope: NodeId,
     pub parent: Option<DefId>,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -322,7 +322,7 @@ pub struct TraitData {
     pub items: Vec<NodeId>,
     pub visibility: Visibility,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -337,7 +337,7 @@ pub struct TupleVariantData {
     pub scope: NodeId,
     pub parent: Option<DefId>,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -419,28 +419,3 @@ pub struct VariableRefData {
     pub scope: NodeId,
     pub ref_id: DefId,
 }
-
-
-/// Encodes information about the signature of a definition. This should have
-/// enough information to create a nice display about a definition without
-/// access to the source code.
-#[derive(Clone, Debug)]
-pub struct Signature {
-    pub span: Span,
-    pub text: String,
-    // These identify the main identifier for the defintion as byte offsets into
-    // `text`. E.g., of `foo` in `pub fn foo(...)`
-    pub ident_start: usize,
-    pub ident_end: usize,
-    pub defs: Vec<SigElement>,
-    pub refs: Vec<SigElement>,
-}
-
-/// An element of a signature. `start` and `end` are byte offsets into the `text`
-/// of the parent `Signature`.
-#[derive(Clone, Debug)]
-pub struct SigElement {
-    pub id: DefId,
-    pub start: usize,
-    pub end: usize,
-}
diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs
index a95236e2a50..568670cbdb6 100644
--- a/src/librustc_save_analysis/dump_visitor.rs
+++ b/src/librustc_save_analysis/dump_visitor.rs
@@ -48,12 +48,13 @@ use syntax::ptr::P;
 use syntax::codemap::Spanned;
 use syntax_pos::*;
 
-use super::{escape, generated_code, SaveContext, PathCollector, docs_for_attrs};
-use super::data::*;
-use super::dump::Dump;
-use super::external_data::{Lower, make_def_id};
-use super::span_utils::SpanUtils;
-use super::recorder;
+use {escape, generated_code, SaveContext, PathCollector, docs_for_attrs};
+use data::*;
+use dump::Dump;
+use external_data::{Lower, make_def_id};
+use recorder;
+use span_utils::SpanUtils;
+use sig;
 
 use rls_data::ExternalCrateData;
 
@@ -646,7 +647,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
                 fields: fields,
                 visibility: From::from(&item.vis),
                 docs: docs_for_attrs(&item.attrs),
-                sig: self.save_ctxt.sig_base(item),
+                sig: sig::item_signature(item, &self.save_ctxt),
                 attributes: item.attrs.clone(),
             }.lower(self.tcx));
         }
@@ -679,18 +680,6 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
             qualname.push_str("::");
             qualname.push_str(&name);
 
-            let text = self.span.signature_string_for_span(variant.span);
-            let ident_start = text.find(&name).unwrap();
-            let ident_end = ident_start + name.len();
-            let sig = Signature {
-                span: variant.span,
-                text: text,
-                ident_start: ident_start,
-                ident_end: ident_end,
-                defs: vec![],
-                refs: vec![],
-            };
-
             match variant.node.data {
                 ast::VariantData::Struct(ref fields, _) => {
                     let sub_span = self.span.span_for_first_ident(variant.span);
@@ -712,7 +701,8 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
                             scope: enum_data.scope,
                             parent: Some(make_def_id(item.id, &self.tcx.hir)),
                             docs: docs_for_attrs(&variant.node.attrs),
-                            sig: sig,
+                            // TODO
+                            sig: None,
                             attributes: variant.node.attrs.clone(),
                         }.lower(self.tcx));
                     }
@@ -739,7 +729,8 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
                             scope: enum_data.scope,
                             parent: Some(make_def_id(item.id, &self.tcx.hir)),
                             docs: docs_for_attrs(&variant.node.attrs),
-                            sig: sig,
+                            // TODO
+                            sig: None,
                             attributes: variant.node.attrs.clone(),
                         }.lower(self.tcx));
                     }
@@ -811,7 +802,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
                 items: methods.iter().map(|i| i.id).collect(),
                 visibility: From::from(&item.vis),
                 docs: docs_for_attrs(&item.attrs),
-                sig: self.save_ctxt.sig_base(item),
+                sig: sig::item_signature(item, &self.save_ctxt),
                 attributes: item.attrs.clone(),
             }.lower(self.tcx));
         }
@@ -1369,7 +1360,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'l> for DumpVisitor<'l, 'tcx, 'll,
                         visibility: From::from(&item.vis),
                         parent: None,
                         docs: docs_for_attrs(&item.attrs),
-                        sig: Some(self.save_ctxt.sig_base(item)),
+                        sig: sig::item_signature(item, &self.save_ctxt),
                         attributes: item.attrs.clone(),
                     }.lower(self.tcx));
                 }
diff --git a/src/librustc_save_analysis/external_data.rs b/src/librustc_save_analysis/external_data.rs
index 02441a0587e..245a3bcc617 100644
--- a/src/librustc_save_analysis/external_data.rs
+++ b/src/librustc_save_analysis/external_data.rs
@@ -16,9 +16,9 @@ use syntax::codemap::CodeMap;
 use syntax::print::pprust;
 use syntax_pos::Span;
 
-use data::{self, Visibility, SigElement};
+use data::{self, Visibility};
 
-use rls_data::{SpanData, CratePreludeData, Attribute};
+use rls_data::{SpanData, CratePreludeData, Attribute, Signature};
 use rls_span::{Column, Row};
 
 // FIXME: this should be pub(crate), but the current snapshot doesn't allow it yet
@@ -103,7 +103,7 @@ pub struct EnumData {
     pub variants: Vec<DefId>,
     pub visibility: Visibility,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -121,7 +121,7 @@ impl Lower for data::EnumData {
             variants: self.variants.into_iter().map(|id| make_def_id(id, &tcx.hir)).collect(),
             visibility: self.visibility,
             docs: self.docs,
-            sig: self.sig.lower(tcx),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -186,7 +186,7 @@ pub struct FunctionData {
     pub visibility: Visibility,
     pub parent: Option<DefId>,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -205,7 +205,7 @@ impl Lower for data::FunctionData {
             visibility: self.visibility,
             parent: self.parent,
             docs: self.docs,
-            sig: self.sig.lower(tcx),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -355,7 +355,7 @@ pub struct MethodData {
     pub visibility: Visibility,
     pub parent: Option<DefId>,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -374,7 +374,7 @@ impl Lower for data::MethodData {
             visibility: self.visibility,
             parent: self.parent,
             docs: self.docs,
-            sig: self.sig.lower(tcx),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -410,7 +410,7 @@ impl Lower for data::ModData {
             items: self.items.into_iter().map(|id| make_def_id(id, &tcx.hir)).collect(),
             visibility: self.visibility,
             docs: self.docs,
-            sig: self.sig.map(|s| s.lower(tcx)),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -450,7 +450,7 @@ pub struct StructData {
     pub fields: Vec<DefId>,
     pub visibility: Visibility,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -469,7 +469,7 @@ impl Lower for data::StructData {
             fields: self.fields.into_iter().map(|id| make_def_id(id, &tcx.hir)).collect(),
             visibility: self.visibility,
             docs: self.docs,
-            sig: self.sig.lower(tcx),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -486,7 +486,7 @@ pub struct StructVariantData {
     pub scope: DefId,
     pub parent: Option<DefId>,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -504,7 +504,7 @@ impl Lower for data::StructVariantData {
             scope: make_def_id(self.scope, &tcx.hir),
             parent: self.parent,
             docs: self.docs,
-            sig: self.sig.lower(tcx),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -521,7 +521,7 @@ pub struct TraitData {
     pub items: Vec<DefId>,
     pub visibility: Visibility,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -539,7 +539,7 @@ impl Lower for data::TraitData {
             items: self.items.into_iter().map(|id| make_def_id(id, &tcx.hir)).collect(),
             visibility: self.visibility,
             docs: self.docs,
-            sig: self.sig.lower(tcx),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -556,7 +556,7 @@ pub struct TupleVariantData {
     pub scope: DefId,
     pub parent: Option<DefId>,
     pub docs: String,
-    pub sig: Signature,
+    pub sig: Option<Signature>,
     pub attributes: Vec<Attribute>,
 }
 
@@ -574,7 +574,7 @@ impl Lower for data::TupleVariantData {
             scope: make_def_id(self.scope, &tcx.hir),
             parent: self.parent,
             docs: self.docs,
-            sig: self.sig.lower(tcx),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -608,7 +608,7 @@ impl Lower for data::TypeDefData {
             visibility: self.visibility,
             parent: self.parent,
             docs: self.docs,
-            sig: self.sig.map(|s| s.lower(tcx)),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -718,7 +718,7 @@ impl Lower for data::VariableData {
             parent: self.parent,
             visibility: self.visibility,
             docs: self.docs,
-            sig: self.sig.map(|s| s.lower(tcx)),
+            sig: self.sig,
             attributes: self.attributes.lower(tcx),
         }
     }
@@ -746,30 +746,3 @@ impl Lower for data::VariableRefData {
         }
     }
 }
-
-#[derive(Clone, Debug)]
-pub struct Signature {
-    pub span: SpanData,
-    pub text: String,
-    // These identify the main identifier for the defintion as byte offsets into
-    // `text`. E.g., of `foo` in `pub fn foo(...)`
-    pub ident_start: usize,
-    pub ident_end: usize,
-    pub defs: Vec<SigElement>,
-    pub refs: Vec<SigElement>,
-}
-
-impl Lower for data::Signature {
-    type Target = Signature;
-
-    fn lower(self, tcx: TyCtxt) -> Signature {
-        Signature {
-            span: span_from_span(self.span, tcx.sess.codemap()),
-            text: self.text,
-            ident_start: self.ident_start,
-            ident_end: self.ident_end,
-            defs: self.defs,
-            refs: self.refs,
-        }
-    }
-}
diff --git a/src/librustc_save_analysis/json_api_dumper.rs b/src/librustc_save_analysis/json_api_dumper.rs
index 49b14f5eca0..1f65efbf9dc 100644
--- a/src/librustc_save_analysis/json_api_dumper.rs
+++ b/src/librustc_save_analysis/json_api_dumper.rs
@@ -133,7 +133,7 @@ impl Into<Option<Def>> for EnumData {
                 children: self.variants.into_iter().map(|id| id_from_def_id(id)).collect(),
                 decl_id: None,
                 docs: self.docs,
-                sig: Some(self.sig.into()),
+                sig: self.sig,
                 attributes: vec![],
             }),
             _ => None,
@@ -154,7 +154,7 @@ impl Into<Option<Def>> for TupleVariantData {
             children: vec![],
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: vec![],
         })
     }
@@ -172,7 +172,7 @@ impl Into<Option<Def>> for StructVariantData {
             children: vec![],
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: vec![],
         })
     }
@@ -191,7 +191,7 @@ impl Into<Option<Def>> for StructData {
             children: self.fields.into_iter().map(|id| id_from_def_id(id)).collect(),
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: vec![],
         }),
             _ => None,
@@ -212,7 +212,7 @@ impl Into<Option<Def>> for TraitData {
                 parent: None,
                 decl_id: None,
                 docs: self.docs,
-                sig: Some(self.sig.into()),
+                sig: self.sig,
                 attributes: vec![],
             }),
             _ => None,
@@ -233,7 +233,7 @@ impl Into<Option<Def>> for FunctionData {
                 parent: self.parent.map(|id| id_from_def_id(id)),
                 decl_id: None,
                 docs: self.docs,
-                sig: Some(self.sig.into()),
+                sig: self.sig,
                 attributes: vec![],
             }),
             _ => None,
@@ -254,7 +254,7 @@ impl Into<Option<Def>> for MethodData {
                 parent: self.parent.map(|id| id_from_def_id(id)),
                 decl_id: self.decl_id.map(|id| id_from_def_id(id)),
                 docs: self.docs,
-                sig: Some(self.sig.into()),
+                sig: self.sig,
                 attributes: vec![],
             }),
             _ => None,
diff --git a/src/librustc_save_analysis/json_dumper.rs b/src/librustc_save_analysis/json_dumper.rs
index a315cca9f4d..2832eb505ec 100644
--- a/src/librustc_save_analysis/json_dumper.rs
+++ b/src/librustc_save_analysis/json_dumper.rs
@@ -14,12 +14,11 @@ use rustc::hir::def_id::DefId;
 use rustc_serialize::json::as_json;
 
 use rls_data::{self, Id, Analysis, Import, ImportKind, Def, DefKind, Ref, RefKind, MacroRef,
-               Relation, RelationKind, Signature, SigElement, CratePreludeData};
+               Relation, RelationKind, CratePreludeData};
 use rls_span::{Column, Row};
 
-use external_data;
 use external_data::*;
-use data::{self, VariableKind};
+use data::VariableKind;
 use dump::Dump;
 
 pub struct JsonDumper<O: DumpOutput> {
@@ -121,7 +120,7 @@ impl<'b, O: DumpOutput + 'b> Dump for JsonDumper<O> {
             children: data.items.into_iter().map(|id| id_from_def_id(id)).collect(),
             decl_id: None,
             docs: data.docs,
-            sig: data.sig.map(|s| s.into()),
+            sig: data.sig,
             attributes: data.attributes.into_iter().map(|a| a.into()).collect(),
         };
         if def.span.file_name.to_str().unwrap() != def.value {
@@ -220,7 +219,7 @@ impl Into<Def> for EnumData {
             children: self.variants.into_iter().map(|id| id_from_def_id(id)).collect(),
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: self.attributes,
         }
     }
@@ -239,7 +238,7 @@ impl Into<Def> for TupleVariantData {
             children: vec![],
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: self.attributes,
         }
     }
@@ -257,7 +256,7 @@ impl Into<Def> for StructVariantData {
             children: vec![],
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: self.attributes,
         }
     }
@@ -275,7 +274,7 @@ impl Into<Def> for StructData {
             children: self.fields.into_iter().map(|id| id_from_def_id(id)).collect(),
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: self.attributes,
         }
     }
@@ -293,7 +292,7 @@ impl Into<Def> for TraitData {
             children: self.items.into_iter().map(|id| id_from_def_id(id)).collect(),
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: self.attributes,
         }
     }
@@ -311,7 +310,7 @@ impl Into<Def> for FunctionData {
             children: vec![],
             decl_id: None,
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: self.attributes,
         }
     }
@@ -329,7 +328,7 @@ impl Into<Def> for MethodData {
             children: vec![],
             decl_id: self.decl_id.map(|id| id_from_def_id(id)),
             docs: self.docs,
-            sig: Some(self.sig.into()),
+            sig: self.sig,
             attributes: self.attributes,
         }
     }
@@ -365,7 +364,7 @@ impl Into<Def> for TypeDefData {
             children: vec![],
             decl_id: None,
             docs: String::new(),
-            sig: self.sig.map(|s| s.into()),
+            sig: self.sig,
             attributes: self.attributes,
         }
     }
@@ -480,23 +479,3 @@ impl Into<Relation> for InheritanceData {
         }
     }
 }
-
-impl Into<Signature> for external_data::Signature {
-    fn into(self) -> Signature {
-        Signature {
-            text: self.text,
-            defs: self.defs.into_iter().map(|s| s.into()).collect(),
-            refs: self.refs.into_iter().map(|s| s.into()).collect(),
-        }
-    }
-}
-
-impl Into<SigElement> for data::SigElement {
-    fn into(self) -> SigElement {
-        SigElement {
-            id: id_from_def_id(self.id),
-            start: self.start,
-            end: self.end,
-        }
-    }
-}
diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs
index 655901aa859..06309a4f79e 100644
--- a/src/librustc_save_analysis/lib.rs
+++ b/src/librustc_save_analysis/lib.rs
@@ -141,7 +141,8 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     visibility: From::from(&item.vis),
                     parent: None,
                     docs: docs_for_attrs(&item.attrs),
-                    sig: self.sig_base_extern(item),
+                    // TODO
+                    sig: None,
                     attributes: item.attrs.clone(),
                 }))
             }
@@ -161,7 +162,8 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     type_value: ty_to_string(ty),
                     visibility: From::from(&item.vis),
                     docs: docs_for_attrs(&item.attrs),
-                    sig: Some(self.sig_base_extern(item)),
+                    // TODO
+                    sig: None,
                     attributes: item.attrs.clone(),
                 }))
             }
@@ -187,7 +189,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     visibility: From::from(&item.vis),
                     parent: None,
                     docs: docs_for_attrs(&item.attrs),
-                    sig: self.sig_base(item),
+                    sig: sig::item_signature(item, self),
                     attributes: item.attrs.clone(),
                 }))
             }
@@ -216,7 +218,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     type_value: ty_to_string(&typ),
                     visibility: From::from(&item.vis),
                     docs: docs_for_attrs(&item.attrs),
-                    sig: Some(self.sig_base(item)),
+                    sig: sig::item_signature(item, self),
                     attributes: item.attrs.clone(),
                 }))
             }
@@ -236,7 +238,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     type_value: ty_to_string(&typ),
                     visibility: From::from(&item.vis),
                     docs: docs_for_attrs(&item.attrs),
-                    sig: Some(self.sig_base(item)),
+                    sig: sig::item_signature(item, self),
                     attributes: item.attrs.clone(),
                 }))
             }
@@ -259,7 +261,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     items: m.items.iter().map(|i| i.id).collect(),
                     visibility: From::from(&item.vis),
                     docs: docs_for_attrs(&item.attrs),
-                    sig: Some(self.sig_base(item)),
+                    sig: sig::item_signature(item, self),
                     attributes: item.attrs.clone(),
                 }))
             }
@@ -283,7 +285,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                     variants: def.variants.iter().map(|v| v.node.data.id()).collect(),
                     visibility: From::from(&item.vis),
                     docs: docs_for_attrs(&item.attrs),
-                    sig: self.sig_base(item),
+                    sig: sig::item_signature(item, self),
                     attributes: item.attrs.clone(),
                 }))
             }
@@ -347,18 +349,6 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
             let def_id = self.tcx.hir.local_def_id(field.id);
             let typ = self.tcx.type_of(def_id).to_string();
 
-            let span = field.span;
-            let text = self.span_utils.snippet(field.span);
-            let ident_start = text.find(&name).unwrap();
-            let ident_end = ident_start + name.len();
-            let sig = Signature {
-                span: span,
-                text: text,
-                ident_start: ident_start,
-                ident_end: ident_end,
-                defs: vec![],
-                refs: vec![],
-            };
             Some(VariableData {
                 id: field.id,
                 kind: VariableKind::Field,
@@ -371,7 +361,8 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
                 type_value: typ,
                 visibility: From::from(&field.vis),
                 docs: docs_for_attrs(&field.attrs),
-                sig: Some(sig),
+                // TODO
+                sig: None,
                 attributes: field.attrs.clone(),
             })
         } else {
@@ -460,22 +451,9 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
         let sub_span = self.span_utils.sub_span_after_keyword(span, keywords::Fn);
         filter!(self.span_utils, sub_span, span, None);
 
-        let name = name.to_string();
-        let text = self.span_utils.signature_string_for_span(span);
-        let ident_start = text.find(&name).unwrap();
-        let ident_end = ident_start + name.len();
-        let sig = Signature {
-            span: span,
-            text: text,
-            ident_start: ident_start,
-            ident_end: ident_end,
-            defs: vec![],
-            refs: vec![],
-        };
-
         Some(FunctionData {
             id: id,
-            name: name,
+            name: name.to_string(),
             qualname: qualname,
             declaration: decl_id,
             span: sub_span.unwrap(),
@@ -485,7 +463,8 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
             visibility: vis,
             parent: parent_scope,
             docs: docs,
-            sig: sig,
+            // TODO
+            sig: None,
             attributes: attributes,
         })
     }
@@ -787,36 +766,6 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
         }
     }
 
-    fn sig_base(&self, item: &ast::Item) -> Signature {
-        let text = self.span_utils.signature_string_for_span(item.span);
-        let name = item.ident.to_string();
-        let ident_start = text.find(&name).expect("Name not in signature?");
-        let ident_end = ident_start + name.len();
-        Signature {
-            span: Span { hi: item.span.lo + BytePos(text.len() as u32), ..item.span },
-            text: text,
-            ident_start: ident_start,
-            ident_end: ident_end,
-            defs: vec![],
-            refs: vec![],
-        }
-    }
-
-    fn sig_base_extern(&self, item: &ast::ForeignItem) -> Signature {
-        let text = self.span_utils.signature_string_for_span(item.span);
-        let name = item.ident.to_string();
-        let ident_start = text.find(&name).expect("Name not in signature?");
-        let ident_end = ident_start + name.len();
-        Signature {
-            span: Span { hi: item.span.lo + BytePos(text.len() as u32), ..item.span },
-            text: text,
-            ident_start: ident_start,
-            ident_end: ident_end,
-            defs: vec![],
-            refs: vec![],
-        }
-    }
-
     #[inline]
     pub fn enclosing_scope(&self, id: NodeId) -> NodeId {
         self.tcx.hir.get_enclosing_scope(id).unwrap_or(CRATE_NODE_ID)
diff --git a/src/librustc_save_analysis/sig.rs b/src/librustc_save_analysis/sig.rs
index 945f405659d..0dd0112a1b6 100644
--- a/src/librustc_save_analysis/sig.rs
+++ b/src/librustc_save_analysis/sig.rs
@@ -22,6 +22,10 @@ use syntax::ast::{self, NodeId};
 use syntax::print::pprust;
 
 
+pub fn item_signature(item: &ast::Item, scx: &SaveContext) -> Option<Signature> {
+    item.make(0, None, scx).ok()
+}
+
 // TODO dup from json_dumper
 fn id_from_def_id(id: DefId) -> Id {
     Id {
@@ -246,8 +250,8 @@ impl Sig for ast::Item {
             let name = self.ident.to_string();
             let def = SigElement {
                 id: id_from_node_id(self.id, scx),
-                start: offset + 5,
-                end: offset + 5 + name.len(),
+                start: offset + text.len(),
+                end: offset + text.len() + name.len(),
             };
             text.push_str(&name);
             let generics: Signature = generics.make(offset + text.len(), id, scx)?;
@@ -336,7 +340,6 @@ impl Sig for ast::Item {
                     sig.text.push_str(" -> ");
                     let nested = t.make(offset + sig.text.len(), None, scx)?;
                     sig.text.push_str(&nested.text);
-                    sig.text.push(',');
                     sig.defs.extend(nested.defs.into_iter());
                     sig.refs.extend(nested.refs.into_iter());
                 }
@@ -473,10 +476,23 @@ impl Sig for ast::Item {
 
 impl Sig for ast::Path {
     fn make(&self, offset: usize, id: Option<NodeId>, scx: &SaveContext) -> Result {
+        // if generated_code(span) {
+        //     return Err("Generated code");
+        // }
+
         let def = scx.get_path_def(id.ok_or("Missing id for Path")?);
-        let id = id_from_def_id(def.def_id());
 
         let (name, start, end) = match def {
+            Def::Label(..)  |
+            Def::PrimTy(..) |
+            Def::SelfTy(..) |
+            Def::Err => {
+                return Ok(Signature {
+                    text: pprust::path_to_string(self),
+                    defs: vec![],
+                    refs: vec![],
+                })
+            }
             Def::AssociatedConst(..) |
             Def::Variant(..) |
             Def::VariantCtor(..) => {
@@ -499,6 +515,7 @@ impl Sig for ast::Path {
             }
         };
 
+        let id = id_from_def_id(def.def_id());
         Ok(Signature {
             text: name,
             defs: vec![],
@@ -557,4 +574,4 @@ impl Sig for ast::Generics {
     }
 }
 
-// TODO impl items, trait items
+// TODO impl items, trait items, fields, extern items, enum variant