#[find_me] // ../my_file.rs
fn foo(){
}
#[proc_macro_attribute] // ../my_macros.rs
pub fn foo(attr: TokenStream, item: TokemStream) -> TokenStream{
// Gets the file name of each `foo` macro attribute
// I test file!() but just returns `../my_macros.rs`
}
I saw the proc_macro::Span and proc_macro2::Span APIs but the first is nightly and the second requires to pass a flag in each crate that depends of it.
You can get it at runtime by outputting ::std::file!() but not from within the proc macro. Cargo sets some environment variables that allow you to get things like the crate root, but not the current file. Note that proc-macro2 can never do anything proc-macro can't; proc-macro2 internally wraps proc-macro.