Skip to content

Commit 5ebb0e2

Browse files
committed
Implement a bunch more signature functions
1 parent 35abf13 commit 5ebb0e2

File tree

3 files changed

+231
-35
lines changed

3 files changed

+231
-35
lines changed

src/librustc_save_analysis/dump_visitor.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -701,8 +701,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
701701
scope: enum_data.scope,
702702
parent: Some(make_def_id(item.id, &self.tcx.hir)),
703703
docs: docs_for_attrs(&variant.node.attrs),
704-
// TODO
705-
sig: None,
704+
sig: sig::variant_signature(variant, &self.save_ctxt),
706705
attributes: variant.node.attrs.clone(),
707706
}.lower(self.tcx));
708707
}
@@ -729,8 +728,7 @@ impl<'l, 'tcx: 'l, 'll, D: Dump + 'll> DumpVisitor<'l, 'tcx, 'll, D> {
729728
scope: enum_data.scope,
730729
parent: Some(make_def_id(item.id, &self.tcx.hir)),
731730
docs: docs_for_attrs(&variant.node.attrs),
732-
// TODO
733-
sig: None,
731+
sig: sig::variant_signature(variant, &self.save_ctxt),
734732
attributes: variant.node.attrs.clone(),
735733
}.lower(self.tcx));
736734
}

src/librustc_save_analysis/lib.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
141141
visibility: From::from(&item.vis),
142142
parent: None,
143143
docs: docs_for_attrs(&item.attrs),
144-
// TODO
145-
sig: None,
144+
sig: sig::foreign_item_signature(item, self),
146145
attributes: item.attrs.clone(),
147146
}))
148147
}
@@ -162,8 +161,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
162161
type_value: ty_to_string(ty),
163162
visibility: From::from(&item.vis),
164163
docs: docs_for_attrs(&item.attrs),
165-
// TODO
166-
sig: None,
164+
sig: sig::foreign_item_signature(item, self),
167165
attributes: item.attrs.clone(),
168166
}))
169167
}
@@ -361,8 +359,7 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
361359
type_value: typ,
362360
visibility: From::from(&field.vis),
363361
docs: docs_for_attrs(&field.attrs),
364-
// TODO
365-
sig: None,
362+
sig: sig::field_signature(field, self),
366363
attributes: field.attrs.clone(),
367364
})
368365
} else {

src/librustc_save_analysis/sig.rs

Lines changed: 226 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@ pub fn item_signature(item: &ast::Item, scx: &SaveContext) -> Option<Signature>
4848
item.make(0, None, scx).ok()
4949
}
5050

51+
pub fn foreign_item_signature(item: &ast::ForeignItem, scx: &SaveContext) -> Option<Signature> {
52+
item.make(0, None, scx).ok()
53+
}
54+
55+
/// Signature for a struct or tuple field declaration.
56+
/// Does not include a trailing comma.
57+
pub fn field_signature(field: &ast::StructField, scx: &SaveContext) -> Option<Signature> {
58+
field.make(0, None, scx).ok()
59+
}
60+
61+
/// Does not include a trailing comma.
62+
pub fn variant_signature(variant: &ast::Variant, scx: &SaveContext) -> Option<Signature> {
63+
variant.node.make(0, None, scx).ok()
64+
}
65+
5166
type Result = ::std::result::Result<Signature, &'static str>;
5267

5368
trait Sig {
@@ -255,20 +270,6 @@ impl Sig for ast::Item {
255270
fn make(&self, offset: usize, _parent_id: Option<NodeId>, scx: &SaveContext) -> Result {
256271
let id = Some(self.id);
257272

258-
let name_and_generics = |mut text: String, generics: &ast::Generics| -> Result {
259-
let name = self.ident.to_string();
260-
let def = SigElement {
261-
id: id_from_node_id(self.id, scx),
262-
start: offset + text.len(),
263-
end: offset + text.len() + name.len(),
264-
};
265-
text.push_str(&name);
266-
let generics: Signature = generics.make(offset + text.len(), id, scx)?;
267-
// FIXME where clause
268-
let text = format!("{}{}", text, generics.text);
269-
Ok(extend_sig(generics, text, vec![def], vec![]))
270-
};
271-
272273
match self.node {
273274
ast::ItemKind::Static(ref ty, m, ref expr) => {
274275
let mut text = "static ".to_owned();
@@ -330,7 +331,12 @@ impl Sig for ast::Item {
330331
}
331332
text.push_str("fn ");
332333

333-
let mut sig = name_and_generics(text, generics)?;
334+
let mut sig = name_and_generics(text,
335+
offset,
336+
generics,
337+
self.id,
338+
self.ident,
339+
scx)?;
334340

335341
sig.text.push('(');
336342
for i in &decl.inputs {
@@ -352,6 +358,7 @@ impl Sig for ast::Item {
352358
sig.defs.extend(nested.defs.into_iter());
353359
sig.refs.extend(nested.refs.into_iter());
354360
}
361+
sig.text.push_str(" {}");
355362

356363
Ok(sig)
357364
}
@@ -375,7 +382,12 @@ impl Sig for ast::Item {
375382
}
376383
ast::ItemKind::Ty(ref ty, ref generics) => {
377384
let text = "type ".to_owned();
378-
let mut sig = name_and_generics(text, generics)?;
385+
let mut sig = name_and_generics(text,
386+
offset,
387+
generics,
388+
self.id,
389+
self.ident,
390+
scx)?;
379391

380392
sig.text.push_str(" = ");
381393
let ty = ty.make(offset + sig.text.len(), id, scx)?;
@@ -386,19 +398,34 @@ impl Sig for ast::Item {
386398
}
387399
ast::ItemKind::Enum(_, ref generics) => {
388400
let text = "enum ".to_owned();
389-
let mut sig = name_and_generics(text, generics)?;
401+
let mut sig = name_and_generics(text,
402+
offset,
403+
generics,
404+
self.id,
405+
self.ident,
406+
scx)?;
390407
sig.text.push_str(" {}");
391408
Ok(sig)
392409
}
393410
ast::ItemKind::Struct(_, ref generics) => {
394411
let text = "struct ".to_owned();
395-
let mut sig = name_and_generics(text, generics)?;
412+
let mut sig = name_and_generics(text,
413+
offset,
414+
generics,
415+
self.id,
416+
self.ident,
417+
scx)?;
396418
sig.text.push_str(" {}");
397419
Ok(sig)
398420
}
399421
ast::ItemKind::Union(_, ref generics) => {
400422
let text = "union ".to_owned();
401-
let mut sig = name_and_generics(text, generics)?;
423+
let mut sig = name_and_generics(text,
424+
offset,
425+
generics,
426+
self.id,
427+
self.ident,
428+
scx)?;
402429
sig.text.push_str(" {}");
403430
Ok(sig)
404431
}
@@ -408,7 +435,12 @@ impl Sig for ast::Item {
408435
text.push_str("unsafe ");
409436
}
410437
text.push_str("trait ");
411-
let mut sig = name_and_generics(text, generics)?;
438+
let mut sig = name_and_generics(text,
439+
offset,
440+
generics,
441+
self.id,
442+
self.ident,
443+
scx)?;
412444

413445
if !bounds.is_empty() {
414446
sig.text.push_str(": ");
@@ -485,10 +517,6 @@ impl Sig for ast::Item {
485517

486518
impl Sig for ast::Path {
487519
fn make(&self, offset: usize, id: Option<NodeId>, scx: &SaveContext) -> Result {
488-
// if generated_code(span) {
489-
// return Err("Generated code");
490-
// }
491-
492520
let def = scx.get_path_def(id.ok_or("Missing id for Path")?);
493521

494522
let (name, start, end) = match def {
@@ -583,4 +611,177 @@ impl Sig for ast::Generics {
583611
}
584612
}
585613

586-
// TODO impl items, trait items, fields, extern items, enum variant
614+
impl Sig for ast::StructField {
615+
fn make(&self, offset: usize, _parent_id: Option<NodeId>, scx: &SaveContext) -> Result {
616+
let mut text = String::new();
617+
let mut defs = None;
618+
if let Some(ref ident) = self.ident {
619+
text.push_str(&ident.to_string());
620+
defs = Some(SigElement {
621+
id: id_from_node_id(self.id, scx),
622+
start: offset,
623+
end: offset + text.len(),
624+
});
625+
text.push_str(": ");
626+
}
627+
628+
let mut ty_sig = self.ty.make(offset + text.len(), Some(self.id), scx)?;
629+
text.push_str(&ty_sig.text);
630+
ty_sig.text = text;
631+
ty_sig.defs.extend(defs.into_iter());
632+
Ok(ty_sig)
633+
}
634+
}
635+
636+
637+
impl Sig for ast::Variant_ {
638+
fn make(&self, offset: usize, _parent_id: Option<NodeId>, scx: &SaveContext) -> Result {
639+
let mut text = self.name.to_string();
640+
match self.data {
641+
ast::VariantData::Struct(ref fields, id) => {
642+
let name_def = SigElement {
643+
id: id_from_node_id(id, scx),
644+
start: offset,
645+
end: offset + text.len(),
646+
};
647+
text.push_str(" { ");
648+
let mut defs = vec![name_def];
649+
let mut refs = vec![];
650+
for f in fields {
651+
let field_sig = f.make(offset + text.len(), Some(id), scx)?;
652+
text.push_str(&field_sig.text);
653+
text.push_str(", ");
654+
defs.extend(field_sig.defs.into_iter());
655+
refs.extend(field_sig.refs.into_iter());
656+
}
657+
text.push('}');
658+
Ok(Signature {
659+
text,
660+
defs: defs,
661+
refs: refs,
662+
})
663+
}
664+
ast::VariantData::Tuple(ref fields, id) => {
665+
let name_def = SigElement {
666+
id: id_from_node_id(id, scx),
667+
start: offset,
668+
end: offset + text.len(),
669+
};
670+
text.push('(');
671+
let mut defs = vec![name_def];
672+
let mut refs = vec![];
673+
for f in fields {
674+
let field_sig = f.make(offset + text.len(), Some(id), scx)?;
675+
text.push_str(&field_sig.text);
676+
text.push_str(", ");
677+
defs.extend(field_sig.defs.into_iter());
678+
refs.extend(field_sig.refs.into_iter());
679+
}
680+
text.push(')');
681+
Ok(Signature {
682+
text,
683+
defs: defs,
684+
refs: refs,
685+
})
686+
}
687+
ast::VariantData::Unit(id) => {
688+
let name_def = SigElement {
689+
id: id_from_node_id(id, scx),
690+
start: offset,
691+
end: offset + text.len(),
692+
};
693+
Ok(Signature {
694+
text,
695+
defs: vec![name_def],
696+
refs: vec![],
697+
})
698+
}
699+
}
700+
}
701+
}
702+
703+
impl Sig for ast::ForeignItem {
704+
fn make(&self, offset: usize, _parent_id: Option<NodeId>, scx: &SaveContext) -> Result {
705+
let id = Some(self.id);
706+
match self.node {
707+
ast::ForeignItemKind::Fn(ref decl, ref generics) => {
708+
let mut text = String::new();
709+
text.push_str("fn ");
710+
711+
let mut sig = name_and_generics(text,
712+
offset,
713+
generics,
714+
self.id,
715+
self.ident,
716+
scx)?;
717+
718+
sig.text.push('(');
719+
for i in &decl.inputs {
720+
// FIXME should descend into patterns to add defs.
721+
sig.text.push_str(&pprust::pat_to_string(&i.pat));
722+
sig.text.push_str(": ");
723+
let nested = i.ty.make(offset + sig.text.len(), Some(i.id), scx)?;
724+
sig.text.push_str(&nested.text);
725+
sig.text.push(',');
726+
sig.defs.extend(nested.defs.into_iter());
727+
sig.refs.extend(nested.refs.into_iter());
728+
}
729+
sig.text.push(')');
730+
731+
if let ast::FunctionRetTy::Ty(ref t) = decl.output {
732+
sig.text.push_str(" -> ");
733+
let nested = t.make(offset + sig.text.len(), None, scx)?;
734+
sig.text.push_str(&nested.text);
735+
sig.defs.extend(nested.defs.into_iter());
736+
sig.refs.extend(nested.refs.into_iter());
737+
}
738+
sig.text.push(';');
739+
740+
Ok(sig)
741+
}
742+
ast::ForeignItemKind::Static(ref ty, m) => {
743+
let mut text = "static ".to_owned();
744+
if m {
745+
text.push_str("mut ");
746+
}
747+
let name = self.ident.to_string();
748+
let defs = vec![SigElement {
749+
id: id_from_node_id(self.id, scx),
750+
start: offset + text.len(),
751+
end: offset + text.len() + name.len(),
752+
}];
753+
text.push_str(&name);
754+
text.push_str(": ");
755+
756+
let ty_sig = ty.make(offset + text.len(), id, scx)?;
757+
text.push(';');
758+
759+
Ok(extend_sig(ty_sig, text, defs, vec![]))
760+
}
761+
}
762+
}
763+
}
764+
765+
fn name_and_generics(mut text: String,
766+
offset: usize,
767+
generics: &ast::Generics,
768+
id: NodeId,
769+
name: ast::Ident,
770+
scx: &SaveContext)
771+
-> Result {
772+
let name = name.to_string();
773+
let def = SigElement {
774+
id: id_from_node_id(id, scx),
775+
start: offset + text.len(),
776+
end: offset + text.len() + name.len(),
777+
};
778+
text.push_str(&name);
779+
let generics: Signature = generics.make(offset + text.len(), Some(id), scx)?;
780+
// FIXME where clause
781+
let text = format!("{}{}", text, generics.text);
782+
Ok(extend_sig(generics, text, vec![def], vec![]))
783+
}
784+
785+
786+
// TODO impl items, trait items
787+
// for impl/trait sigs - function for each kind, rather than use trait.

0 commit comments

Comments
 (0)