save_analysis: better handle functions signature
This commit is contained in:
parent
7b94fdb95c
commit
51e17249da
4 changed files with 48 additions and 35 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue