diff options
| -rw-r--r-- | src/librustc_hir_pretty/lib.rs | 12 | ||||
| -rw-r--r-- | src/librustc_save_analysis/dump_visitor.rs | 5 | ||||
| -rw-r--r-- | src/librustc_save_analysis/lib.rs | 57 | ||||
| -rw-r--r-- | src/librustc_save_analysis/sig.rs | 9 |
4 files changed, 48 insertions, 35 deletions
diff --git a/src/librustc_hir_pretty/lib.rs b/src/librustc_hir_pretty/lib.rs index e642915b86a..4d04159022a 100644 --- a/src/librustc_hir_pretty/lib.rs +++ b/src/librustc_hir_pretty/lib.rs @@ -227,6 +227,18 @@ pub fn path_to_string(segment: &hir::Path<'_>) -> String { to_string(NO_ANN, |s| s.print_path(segment, false)) } +pub fn fn_to_string( + decl: &hir::FnDecl<'_>, + header: hir::FnHeader, + name: Option<Symbol>, + generics: &hir::Generics<'_>, + vis: &hir::Visibility<'_>, + arg_names: &[Ident], + body_id: Option<hir::BodyId>, +) -> String { + to_string(NO_ANN, |s| s.print_fn(decl, header, name, generics, vis, arg_names, body_id)) +} + impl<'a> State<'a> { pub fn cbox(&mut self, u: usize) { self.s.cbox(u); diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs index fdcf98b37af..fbde6bfd9aa 100644 --- a/src/librustc_save_analysis/dump_visitor.rs +++ b/src/librustc_save_analysis/dump_visitor.rs @@ -20,7 +20,7 @@ use rustc_hir as hir; use rustc_hir::def::{DefKind as HirDefKind, Res}; use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::intravisit::{self, Visitor}; -use rustc_hir_pretty::{bounds_to_string, generic_params_to_string, ty_to_string}; +use rustc_hir_pretty::{bounds_to_string, fn_to_string, generic_params_to_string, ty_to_string}; use rustc_middle::hir::map::Map; use rustc_middle::span_bug; use rustc_middle::ty::{self, DefIdTree, TyCtxt}; @@ -276,7 +276,8 @@ impl<'l, 'tcx> DumpVisitor<'l, 'tcx> { } v.process_generic_params(&generics, &method_data.qualname, hir_id); - method_data.value = crate::make_signature(&sig.decl, &generics); + method_data.value = + fn_to_string(sig.decl, sig.header, Some(ident.name), generics, vis, &[], None); method_data.sig = sig::method_signature(hir_id, ident, generics, sig, &v.save_ctxt); v.dumper.dump_def(&access_from_vis!(v.save_ctxt, vis, hir_id), method_data); diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs index 2f46301e76b..cc0f9b1c06e 100644 --- a/src/librustc_save_analysis/lib.rs +++ b/src/librustc_save_analysis/lib.rs @@ -17,7 +17,7 @@ use rustc_hir::def::{CtorOf, DefKind as HirDefKind, Res}; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::Node; -use rustc_hir_pretty::ty_to_string; +use rustc_hir_pretty::{fn_to_string, ty_to_string}; use rustc_middle::hir::map::Map; use rustc_middle::middle::cstore::ExternCrate; use rustc_middle::middle::privacy::AccessLevels; @@ -135,7 +135,7 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { let def_id = self.tcx.hir().local_def_id(item.hir_id).to_def_id(); let qualname = format!("::{}", self.tcx.def_path_str(def_id)); match item.kind { - hir::ForeignItemKind::Fn(ref decl, _, ref generics) => { + hir::ForeignItemKind::Fn(ref decl, arg_names, ref generics) => { filter!(self.span_utils, item.ident.span); Some(Data::DefData(Def { @@ -144,7 +144,23 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { span: self.span_from_span(item.ident.span), name: item.ident.to_string(), qualname, - value: make_signature(decl, generics), + value: fn_to_string( + decl, + hir::FnHeader { + // functions in extern block are implicitly unsafe + unsafety: hir::Unsafety::Unsafe, + // functions in extern block cannot be const + constness: hir::Constness::NotConst, + abi: self.tcx.hir().get_foreign_abi(item.hir_id), + // functions in extern block cannot be async + asyncness: hir::IsAsync::NotAsync, + }, + Some(item.ident.name), + generics, + &item.vis, + arg_names, + None, + ), parent: None, children: vec![], decl_id: None, @@ -191,7 +207,15 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { span: self.span_from_span(item.ident.span), name: item.ident.to_string(), qualname, - value: make_signature(&sig.decl, generics), + value: fn_to_string( + sig.decl, + sig.header, + Some(item.ident.name), + generics, + &item.vis, + &[], + None, + ), parent: None, children: vec![], decl_id: None, @@ -848,31 +872,6 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { } } -fn make_signature(decl: &hir::FnDecl<'_>, generics: &hir::Generics<'_>) -> String { - let mut sig = "fn ".to_owned(); - if !generics.params.is_empty() { - sig.push('<'); - sig.push_str( - &generics - .params - .iter() - .map(|param| param.name.ident().to_string()) - .collect::<Vec<_>>() - .join(", "), - ); - sig.push_str("> "); - } - sig.push('('); - sig.push_str(&decl.inputs.iter().map(ty_to_string).collect::<Vec<_>>().join(", ")); - sig.push(')'); - match decl.output { - hir::FnRetTy::DefaultReturn(_) => sig.push_str(" -> ()"), - hir::FnRetTy::Return(ref t) => sig.push_str(&format!(" -> {}", ty_to_string(t))), - } - - sig -} - // An AST visitor for collecting paths (e.g., the names of structs) and formal // variables (idents) from patterns. struct PathCollector<'l> { diff --git a/src/librustc_save_analysis/sig.rs b/src/librustc_save_analysis/sig.rs index 52c1c3b99db..5f337f5f770 100644 --- a/src/librustc_save_analysis/sig.rs +++ b/src/librustc_save_analysis/sig.rs @@ -324,10 +324,11 @@ impl<'hir> Sig for hir::Ty<'hir> { let text = format!("[{}; {}]", nested_ty.text, expr); Ok(replace_text(nested_ty, text)) } - hir::TyKind::Typeof(_) - | hir::TyKind::Infer - | hir::TyKind::Def(..) - | hir::TyKind::Err => Err("Ty"), + hir::TyKind::Def(item_id, _) => { + let item = scx.tcx.hir().item(item_id.id); + item.make(offset, Some(item_id.id), scx) + } + hir::TyKind::Typeof(_) | hir::TyKind::Infer | hir::TyKind::Err => Err("Ty"), } } } |
