rapx/utils/
source.rs

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