Super new to rustc_* libraries, I want to traverse the hir to inspect if a function is called.
I'm using rustc_interface::run_compiler when I am in queries.global_ctxt() I get the hir and start traversing it from some predefined entrypoint that are functions. What I want to do is to check the function calls that I have inside the body of the function, so when I get an ExprKind(path) I follow the path and look at the called function.
Now when I have QPath::Resolved this is very easy to do. But when I have QPath::TypeRelative I'm lost. I get it when I try to call al method for example:
struct A;
impl A {
pub fn new() -> Self {
A
}
}
When a function call A::new() I get QPath::TypeRelative .
Is possible to resolve the path? I tried various things like calling rustc_hir_analysis::check_crate or other functions that seem related to type checking, but the truth is that I'm just trying random things without a clear idea of what I'm doing
going through the docs I found TypeckResults::qpath_res(&self, qpath: &QPath<'_>, id: HirId) .
I think that I want something like that. Not sure which qpath and id should I pass.
I tried dbg!(tcx.typeck(segment.hir_id.owner.def_id).qpath_res(qpath, segment.hir_id));
With:
qpath = the TypeRelative qpath that I want to resolve.
hir_id = the hir A::new() (I guess that the issue is here and is the local_id (*))
But something is wrong cause I get an Err. Btw I feel like I'm in the right direction cause I can see that TypeckResults have the right path for A::new().
(*) seems that local_id in segment.hir_id is different from the one in the TypeRelative maps. But they both are local respect to the same Item cause TypeRelative.hir_owner is the function that call A::new() , and I'm pretty sure that segment.hir_id.local_id refer the the function that call A::new().
I'm saying that cause the only way to change segment.hir_id.local_id is changing that function.
Specifically I always get segment.hir_id.loca_id = local_id_in_the_type_relative_map + 3