1- use crate :: codegen:: program:: common:: { generate_ix_variant, generate_ix_variant_name} ;
1+ use crate :: codegen:: program:: common:: {
2+ generate_ix_variant_name_spanned, generate_ix_variant_spanned,
3+ } ;
24use crate :: Program ;
35use heck:: SnakeCase ;
4- use quote:: { quote, ToTokens } ;
6+ use quote:: { quote_spanned, ToTokens } ;
7+ #[ allow( unused_imports) ]
8+ use syn:: spanned:: Spanned ;
59
610pub fn generate ( program : & Program ) -> proc_macro2:: TokenStream {
11+ let program_span = program. program_mod . span ( ) ;
712 // Generate cpi methods for global methods.
813 let global_cpi_methods: Vec < proc_macro2:: TokenStream > = program
914 . ixs
@@ -13,24 +18,25 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
1318 let cpi_method = {
1419 let name = & ix. raw_method . sig . ident ;
1520 let name_str = name. to_string ( ) ;
16- let ix_variant = generate_ix_variant ( & name_str, & ix. args ) ;
21+ let ix_span = ix. raw_method . span ( ) ;
22+ let ix_variant = generate_ix_variant_spanned ( & name_str, & ix. args , ix_span) ;
1723 let method_name = & ix. ident ;
1824 let args: Vec < & syn:: PatType > = ix. args . iter ( ) . map ( |arg| & arg. raw_arg ) . collect ( ) ;
1925 let discriminator = {
20- let name = generate_ix_variant_name ( & name_str) ;
21- quote ! { <instruction:: #name as anchor_lang:: Discriminator >:: DISCRIMINATOR }
26+ let name = generate_ix_variant_name_spanned ( & name_str, ix_span ) ;
27+ quote_spanned ! { ix_span => <instruction:: #name as anchor_lang:: Discriminator >:: DISCRIMINATOR }
2228 } ;
2329 let ret_type = & ix. returns . ty . to_token_stream ( ) ;
2430 let ix_cfgs = & ix. cfgs ;
2531 let ( method_ret, maybe_return) = match ret_type. to_string ( ) . as_str ( ) {
26- "()" => ( quote ! { anchor_lang:: Result <( ) > } , quote ! { Ok ( ( ) ) } ) ,
32+ "()" => ( quote_spanned ! { ix_span => anchor_lang:: Result <( ) > } , quote_spanned ! { ix_span => Ok ( ( ) ) } ) ,
2733 _ => (
28- quote ! { anchor_lang:: Result <crate :: cpi:: Return :: <#ret_type>> } ,
29- quote ! { Ok ( crate :: cpi:: Return :: <#ret_type> { phantom: crate :: cpi:: PhantomData } ) }
34+ quote_spanned ! { ix_span => anchor_lang:: Result <crate :: cpi:: Return :: <#ret_type>> } ,
35+ quote_spanned ! { ix_span => Ok ( crate :: cpi:: Return :: <#ret_type> { phantom: crate :: cpi:: PhantomData } ) }
3036 )
3137 } ;
3238
33- quote ! {
39+ quote_spanned ! { ix_span =>
3440 #( #ix_cfgs) *
3541 pub fn #method_name<' a, ' b, ' c, ' info>(
3642 ctx: anchor_lang:: context:: CpiContext <' a, ' b, ' c, ' info, #accounts_ident<' info>>,
@@ -69,7 +75,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
6975
7076 let accounts = generate_accounts ( program) ;
7177
72- quote ! {
78+ quote_spanned ! { program_span =>
7379 #[ cfg( feature = "cpi" ) ]
7480 pub mod cpi {
7581 use super :: * ;
@@ -95,6 +101,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
95101}
96102
97103pub fn generate_accounts ( program : & Program ) -> proc_macro2:: TokenStream {
104+ let program_span = program. program_mod . span ( ) ;
98105 let mut accounts = std:: collections:: HashMap :: new ( ) ;
99106
100107 // Go through instruction accounts.
@@ -114,14 +121,14 @@ pub fn generate_accounts(program: &Program) -> proc_macro2::TokenStream {
114121 . iter ( )
115122 . map ( |( macro_name, cfgs) | {
116123 let macro_name: proc_macro2:: TokenStream = macro_name. parse ( ) . unwrap ( ) ;
117- quote ! {
124+ quote_spanned ! { program_span =>
118125 #( #cfgs) *
119126 pub use crate :: #macro_name:: * ;
120127 }
121128 } )
122129 . collect ( ) ;
123130
124- quote ! {
131+ quote_spanned ! { program_span =>
125132 /// An Anchor generated module, providing a set of structs
126133 /// mirroring the structs deriving `Accounts`, where each field is
127134 /// an `AccountInfo`. This is useful for CPI.
0 commit comments