diff --git a/crates/test-case-core/src/test_case.rs b/crates/test-case-core/src/test_case.rs index 70ed6cf..a0cd262 100644 --- a/crates/test-case-core/src/test_case.rs +++ b/crates/test-case-core/src/test_case.rs @@ -1,7 +1,7 @@ use crate::comment::TestCaseComment; use crate::expr::{TestCaseExpression, TestCaseResult}; use crate::utils::fmt_syn; -use proc_macro2::TokenStream as TokenStream2; +use proc_macro2::{Span as Span2, TokenStream as TokenStream2}; use quote::quote; use syn::parse::{Parse, ParseStream}; use syn::punctuated::Punctuated; @@ -46,10 +46,14 @@ impl TestCase { crate::utils::escape_test_name(case_desc) } - pub fn render(&self, mut item: ItemFn) -> TokenStream2 { + pub fn render(&self, mut item: ItemFn, origin_span: Span2) -> TokenStream2 { let item_name = item.sig.ident.clone(); let arg_values = self.args.iter(); - let test_case_name = self.test_case_name(); + let test_case_name = { + let mut test_case_name = self.test_case_name(); + test_case_name.set_span(origin_span); + test_case_name + }; let mut attrs = self .expression diff --git a/crates/test-case-macros/src/lib.rs b/crates/test-case-macros/src/lib.rs index d200b1a..7b34c4f 100644 --- a/crates/test-case-macros/src/lib.rs +++ b/crates/test-case-macros/src/lib.rs @@ -2,6 +2,7 @@ extern crate proc_macro; use proc_macro::TokenStream; +use proc_macro2::Span as Span2; use syn::{parse_macro_input, ItemFn}; use quote::quote; @@ -26,7 +27,7 @@ pub fn test_case(args: TokenStream, input: TokenStream) -> TokenStream { let test_case = parse_macro_input!(args as TestCase); let mut item = parse_macro_input!(input as ItemFn); - let mut test_cases = vec![test_case]; + let mut test_cases = vec![(test_case, Span2::call_site())]; let mut attrs_to_remove = vec![]; let legal_test_case_names = [ parse_quote!(test_case), @@ -48,7 +49,7 @@ pub fn test_case(args: TokenStream, input: TokenStream) -> TokenStream { .into() } }; - test_cases.push(test_case); + test_cases.push((test_case, attr.span())); attrs_to_remove.push(idx); } } @@ -61,11 +62,11 @@ pub fn test_case(args: TokenStream, input: TokenStream) -> TokenStream { } #[allow(unused_mut)] -fn render_test_cases(test_cases: &[TestCase], mut item: ItemFn) -> TokenStream { +fn render_test_cases(test_cases: &[(TestCase, Span2)], mut item: ItemFn) -> TokenStream { let mut rendered_test_cases = vec![]; - for test_case in test_cases { - rendered_test_cases.push(test_case.render(item.clone())); + for (test_case, span) in test_cases { + rendered_test_cases.push(test_case.render(item.clone(), *span)); } let mod_name = item.sig.ident.clone();