diff --git a/CHANGELOG.md b/CHANGELOG.md index 263978f917..dd2b2b4de7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ The minor version will be incremented upon a breaking change and the patch versi - lang: Remove `arrayref` dependency ([#3201](https://github.com/coral-xyz/anchor/pull/3201)). - cli: Fix template code shouldn't escape ([#3210](https://github.com/coral-xyz/anchor/pull/3210)). - idl: Fix using `address` constraint with non-const expressions ([#3216](https://github.com/coral-xyz/anchor/pull/3216)). +- idl: Fix using full path types with `Program` ([#3228](https://github.com/coral-xyz/anchor/pull/3228)). ### Breaking diff --git a/lang/syn/src/idl/accounts.rs b/lang/syn/src/idl/accounts.rs index 2eb9b56417..4d32b0a19a 100644 --- a/lang/syn/src/idl/accounts.rs +++ b/lang/syn/src/idl/accounts.rs @@ -144,18 +144,12 @@ pub fn gen_idl_build_impl_accounts_struct(accounts: &AccountsStruct) -> TokenStr fn get_address(acc: &Field) -> TokenStream { match &acc.ty { - Ty::Program(ty) => ty - .account_type_path - .path - .segments - .last() - .map(|seg| &seg.ident) - .map(|ident| quote! { Some(#ident::id().to_string()) }) - .unwrap_or_else(|| quote! { None }), - Ty::Sysvar(_) => { + Ty::Program(_) | Ty::Sysvar(_) => { let ty = acc.account_ty(); - let sysvar_id_trait = quote!(anchor_lang::solana_program::sysvar::SysvarId); - quote! { Some(<#ty as #sysvar_id_trait>::id().to_string()) } + let id_trait = matches!(acc.ty, Ty::Program(_)) + .then(|| quote!(anchor_lang::Id)) + .unwrap_or_else(|| quote!(anchor_lang::solana_program::sysvar::SysvarId)); + quote! { Some(<#ty as #id_trait>::id().to_string()) } } _ => acc .constraints diff --git a/tests/idl/programs/new-idl/src/lib.rs b/tests/idl/programs/new-idl/src/lib.rs index 65d05198b1..97148f14ce 100644 --- a/tests/idl/programs/new-idl/src/lib.rs +++ b/tests/idl/programs/new-idl/src/lib.rs @@ -291,6 +291,7 @@ pub struct AccountAndEventFieldAccount { pub struct FullPath<'info> { #[account(zero)] pub account: Account<'info, FullPathAccount>, + pub external_program: Program<'info, external::program::External>, } #[account]