Skip to content

Commit e8e4c9a

Browse files
committed
fix: Apply quote_spanned selectively in #[program] macro for better error attribution
Signed-off-by: AvhiMaz <avhimazumder5@outlook.com>
1 parent 0f32682 commit e8e4c9a

File tree

7 files changed

+23
-37
lines changed

7 files changed

+23
-37
lines changed

lang/syn/src/codegen/program/accounts.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
use crate::Program;
22
use heck::SnakeCase;
3-
use quote::quote_spanned;
4-
use syn::spanned::Spanned;
3+
use quote::quote;
54

65
pub fn generate(program: &Program) -> proc_macro2::TokenStream {
7-
let program_span = program.program_mod.span();
86
let mut accounts = std::collections::HashMap::new();
97

108
// Go through instruction accounts.
@@ -23,7 +21,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
2321
.iter()
2422
.map(|(macro_name, cfgs)| {
2523
let macro_name: proc_macro2::TokenStream = macro_name.parse().unwrap();
26-
quote_spanned! { program_span =>
24+
quote! {
2725
#(#cfgs)*
2826
pub use crate::#macro_name::*;
2927
}
@@ -33,7 +31,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
3331
// TODO: calculate the account size and add it as a constant field to
3432
// each struct here. This is convenient for Rust clients.
3533

36-
quote_spanned! { program_span =>
34+
quote! {
3735
/// An Anchor generated module, providing a set of structs
3836
/// mirroring the structs deriving `Accounts`, where each field is
3937
/// a `Pubkey`. This is useful for specifying accounts for a client.

lang/syn/src/codegen/program/cpi.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@ use crate::codegen::program::common::{
33
};
44
use crate::Program;
55
use heck::SnakeCase;
6-
use quote::{quote_spanned, ToTokens};
7-
#[allow(unused_imports)]
6+
use quote::{quote, quote_spanned, ToTokens};
87
use syn::spanned::Spanned;
98

109
pub fn generate(program: &Program) -> proc_macro2::TokenStream {
11-
let program_span = program.program_mod.span();
1210
// Generate cpi methods for global methods.
1311
let global_cpi_methods: Vec<proc_macro2::TokenStream> = program
1412
.ixs
@@ -75,7 +73,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
7573

7674
let accounts = generate_accounts(program);
7775

78-
quote_spanned! { program_span =>
76+
quote! {
7977
#[cfg(feature = "cpi")]
8078
pub mod cpi {
8179
use super::*;
@@ -101,7 +99,6 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
10199
}
102100

103101
pub fn generate_accounts(program: &Program) -> proc_macro2::TokenStream {
104-
let program_span = program.program_mod.span();
105102
let mut accounts = std::collections::HashMap::new();
106103

107104
// Go through instruction accounts.
@@ -121,14 +118,14 @@ pub fn generate_accounts(program: &Program) -> proc_macro2::TokenStream {
121118
.iter()
122119
.map(|(macro_name, cfgs)| {
123120
let macro_name: proc_macro2::TokenStream = macro_name.parse().unwrap();
124-
quote_spanned! { program_span =>
121+
quote! {
125122
#(#cfgs)*
126123
pub use crate::#macro_name::*;
127124
}
128125
})
129126
.collect();
130127

131-
quote_spanned! { program_span =>
128+
quote! {
132129
/// An Anchor generated module, providing a set of structs
133130
/// mirroring the structs deriving `Accounts`, where each field is
134131
/// an `AccountInfo`. This is useful for CPI.

lang/syn/src/codegen/program/dispatch.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::Program;
22
use heck::CamelCase;
3-
use quote::quote_spanned;
3+
use quote::{quote, quote_spanned};
44
use syn::spanned::Spanned;
55

66
pub fn generate(program: &Program) -> proc_macro2::TokenStream {
@@ -30,10 +30,9 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
3030
});
3131

3232
// Generate the event-cpi instruction handler based on whether the `event-cpi` feature is enabled.
33-
let program_span = program.program_mod.span();
3433
let event_cpi_handler = {
3534
#[cfg(feature = "event-cpi")]
36-
quote_spanned! { program_span =>
35+
quote! {
3736
// `event-cpi` feature is enabled, dispatch self-cpi instruction
3837
__private::__events::__event_dispatch(
3938
program_id,
@@ -42,7 +41,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
4241
)
4342
}
4443
#[cfg(not(feature = "event-cpi"))]
45-
quote_spanned! { program_span =>
44+
quote! {
4645
// `event-cpi` feature is not enabled
4746
Err(anchor_lang::error::ErrorCode::EventInstructionStub.into())
4847
}
@@ -60,8 +59,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
6059
}
6160
})
6261
.unwrap_or_else(|| {
63-
let program_span = program.program_mod.span();
64-
quote_spanned! { program_span =>
62+
quote! {
6563
Err(anchor_lang::error::ErrorCode::InstructionFallbackNotFound.into())
6664
}
6765
});

lang/syn/src/codegen/program/handlers.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::codegen::program::common::*;
22
use crate::program_codegen::idl::idl_accounts_and_functions;
33
use crate::Program;
4-
use quote::{quote_spanned, ToTokens};
4+
use quote::{quote, quote_spanned, ToTokens};
55
use syn::spanned::Spanned;
66

77
// Generate non-inlined wrappers for each instruction handler, since Solana's
@@ -12,9 +12,8 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
1212
// A constant token stream that stores the accounts and functions, required to live
1313
// inside the target program in order to get the program ID.
1414
let idl_accounts_and_functions = idl_accounts_and_functions();
15-
let program_span = program.program_mod.span();
1615
let non_inlined_idl: proc_macro2::TokenStream = {
17-
quote_spanned! { program_span =>
16+
quote! {
1817
// Entry for all IDL related instructions. Use the "no-idl" feature
1918
// to eliminate this code, for example, if one wants to make the
2019
// IDL no longer mutable or if one doesn't want to store the IDL
@@ -169,7 +168,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
169168
})
170169
.collect();
171170

172-
quote_spanned! { program_span =>
171+
quote! {
173172
/// Create a private module to not clutter the program's namespace.
174173
/// Defines an entrypoint for each individual instruction handler
175174
/// wrapper.
@@ -201,9 +200,8 @@ fn generate_event_cpi_mod() -> proc_macro2::TokenStream {
201200
{
202201
let authority = crate::parser::accounts::event_cpi::EventAuthority::get();
203202
let authority_name = authority.name;
204-
let span = proc_macro2::Span::call_site();
205203

206-
quote_spanned! { span =>
204+
quote! {
207205
/// __events mod defines handler for self-cpi based event logging
208206
pub mod __events {
209207
use super::*;
@@ -237,7 +235,6 @@ fn generate_event_cpi_mod() -> proc_macro2::TokenStream {
237235
}
238236
#[cfg(not(feature = "event-cpi"))]
239237
{
240-
let span = proc_macro2::Span::call_site();
241-
quote_spanned! { span => }
238+
quote! { }
242239
}
243240
}

lang/syn/src/codegen/program/idl.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
use quote::quote_spanned;
1+
use quote::quote;
22

33
pub fn idl_accounts_and_functions() -> proc_macro2::TokenStream {
4-
let span = proc_macro2::Span::call_site();
5-
quote_spanned! { span =>
4+
quote! {
65
use anchor_lang::idl::ERASED_AUTHORITY;
76

87
#[account("internal")]

lang/syn/src/codegen/program/instruction.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ use crate::codegen::program::common::*;
22
use crate::parser;
33
use crate::Program;
44
use heck::CamelCase;
5-
use quote::quote_spanned;
5+
use quote::{quote, quote_spanned};
66
use syn::spanned::Spanned;
77

88
pub fn generate(program: &Program) -> proc_macro2::TokenStream {
9-
let program_span = program.program_mod.span();
109
let variants: Vec<proc_macro2::TokenStream> = program
1110
.ixs
1211
.iter()
@@ -78,7 +77,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
7877
})
7978
.collect();
8079

81-
quote_spanned! { program_span =>
80+
quote! {
8281
/// An Anchor generated module containing the program's set of
8382
/// instructions, where each method handler in the `#[program]` mod is
8483
/// associated with a struct defining the input arguments to the

lang/syn/src/codegen/program/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::Program;
2-
use quote::quote_spanned;
3-
use syn::spanned::Spanned;
2+
use quote::quote;
43

54
mod accounts;
65
pub mod common;
@@ -13,7 +12,6 @@ mod instruction;
1312

1413
pub fn generate(program: &Program) -> proc_macro2::TokenStream {
1514
let mod_name = &program.name;
16-
let program_span = program.program_mod.span();
1715

1816
let entry = entry::generate(program);
1917
let dispatch = dispatch::generate(program);
@@ -25,7 +23,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
2523

2624
#[allow(clippy::let_and_return)]
2725
let ret = {
28-
quote_spanned! { program_span =>
26+
quote! {
2927
// TODO: remove once we allow segmented paths in `Accounts` structs.
3028
use self::#mod_name::*;
3129

@@ -42,7 +40,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
4240
#[cfg(feature = "idl-build")]
4341
{
4442
let idl_build_impl = crate::idl::gen_idl_print_fn_program(program);
45-
return quote_spanned! { program_span =>
43+
return quote! {
4644
#ret
4745
#idl_build_impl
4846
};

0 commit comments

Comments
 (0)