rapx/utils/
source.rs

1use rustc_hir::Node::*;
2use rustc_middle::ty::TyCtxt;
3use rustc_span::def_id::DefId;
4use rustc_span::symbol::Symbol;
5use rustc_span::{FileName, FileNameDisplayPreference};
6
7extern crate rustc_hir;
8extern crate rustc_middle;
9extern crate rustc_span;
10
11pub fn get_fn_name(tcx: TyCtxt<'_>, def_id: DefId) -> Option<String> {
12    let name = tcx.def_path(def_id).to_string_no_crate_verbose();
13    Some(name)
14}
15
16pub fn get_fn_name_byid(def_id: &DefId) -> String {
17    let s = format!("{:?}", *def_id);
18    if let Some(start) = s.find("DefId") {
19        if let Some(end) = s.find("]::") {
20            let s1 = s.replace(&s[start..end + 3], "").to_string();
21            if let Some(start) = s1.find(")") {
22                let result = s1.replace(&s1[start..start + 1], "").to_string();
23                return result;
24            }
25            return s1;
26        }
27    }
28    s.clone()
29}
30pub fn get_name(tcx: TyCtxt<'_>, def_id: DefId) -> Option<Symbol> {
31    if def_id.is_local() {
32        if let Some(node) = tcx.hir_get_if_local(def_id) {
33            match node {
34                Item(item) => {
35                    let ident = tcx.hir_ident(item.hir_id());
36                    return Some(ident.name);
37                }
38                ImplItem(item) => {
39                    let ident = tcx.hir_ident(item.hir_id());
40                    return Some(ident.name);
41                }
42                ForeignItem(item) => {
43                    let ident = tcx.hir_ident(item.hir_id());
44                    return Some(ident.name);
45                }
46                TraitItem(item) => {
47                    let ident = tcx.hir_ident(item.hir_id());
48                    return Some(ident.name);
49                }
50                _ => {
51                    return None;
52                }
53            }
54        }
55    }
56    None
57}
58
59pub fn get_filename(tcx: TyCtxt<'_>, def_id: DefId) -> Option<String> {
60    // Get the HIR node corresponding to the DefId
61    if let Some(local_id) = def_id.as_local() {
62        let hir_id = tcx.local_def_id_to_hir_id(local_id);
63        let span = tcx.hir_span(hir_id);
64        let source_map = tcx.sess.source_map();
65
66        // Retrieve the file name
67        if let Some(filename) = source_map.span_to_filename(span).into() {
68            return Some(convert_filename(filename));
69        }
70    }
71    None
72}
73
74fn convert_filename(filename: FileName) -> String {
75    match filename {
76        FileName::Real(path) => path
77            .to_string_lossy(FileNameDisplayPreference::Local)
78            .into_owned(),
79        _ => "<unknown>".to_string(),
80    }
81}