Skip to content

Loses spans that cover multiple tokens

I added the following macros and test case to your test-crate:

use syn::Error;

#[proc_macro_attribute]
pub fn test1(_: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let input = proc_macro2::TokenStream::from(input);
    Error::new_spanned(input, "...").to_compile_error().into()
}

#[proc_macro_attribute]
#[proc_macro_error]
pub fn test2(_: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let input = proc_macro2::TokenStream::from(input);
    Err(Error::new_spanned(input, "...")).unwrap_or_abort()
}
#[test_crate::test1]
type T = ();

#[test_crate::test2]
type T = ();

fn main() {}

I would expect both to produce the same error but the proc-macro-error one points to the first token only.

error: ...
 --> $DIR/spanned.rs:2:1
  |
2 | type T = ();
  | ^^^^^^^^^^^^

error: ...
 --> $DIR/spanned.rs:5:1
  |
5 | type T = ();
  | ^^^^