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_name(tcx: TyCtxt<'_>, def_id: DefId) -> Option<Symbol> {
17    if def_id.is_local() {
18        if let Some(node) = tcx.hir_get_if_local(def_id) {
19            match node {
20                Item(item) => {
21                    let ident = tcx.hir_ident(item.hir_id());
22                    return Some(ident.name);
23                }
24                ImplItem(item) => {
25                    let ident = tcx.hir_ident(item.hir_id());
26                    return Some(ident.name);
27                }
28                ForeignItem(item) => {
29                    let ident = tcx.hir_ident(item.hir_id());
30                    return Some(ident.name);
31                }
32                TraitItem(item) => {
33                    let ident = tcx.hir_ident(item.hir_id());
34                    return Some(ident.name);
35                }
36                _ => {
37                    return None;
38                }
39            }
40        }
41    }
42    None
43}
44
45pub fn get_filename(tcx: TyCtxt<'_>, def_id: DefId) -> Option<String> {
46    // Get the HIR node corresponding to the DefId
47    if let Some(local_id) = def_id.as_local() {
48        let hir_id = tcx.local_def_id_to_hir_id(local_id);
49        let span = tcx.hir_span(hir_id);
50        let source_map = tcx.sess.source_map();
51
52        // Retrieve the file name
53        if let Some(filename) = source_map.span_to_filename(span).into() {
54            return Some(convert_filename(filename));
55        }
56    }
57    None
58}
59
60fn convert_filename(filename: FileName) -> String {
61    match filename {
62        FileName::Real(path) => path
63            .to_string_lossy(FileNameDisplayPreference::Local)
64            .into_owned(),
65        _ => "<unknown>".to_string(),
66    }
67}