lang: Fix constant bytes declarations when using `declare_program!` (#3287)

This commit is contained in:
acheron 2024-09-30 17:28:33 +02:00 committed by GitHub
parent aa3ace36e9
commit 143893f67e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 112 additions and 27 deletions

View File

@ -78,6 +78,7 @@ The minor version will be incremented upon a breaking change and the patch versi
- lang: Use closures for `init` constraints to reduce the stack usage of `try_accounts` ([#2939](https://github.com/coral-xyz/anchor/pull/2939)).
- lang: Allow the `cfg` attribute above the instructions ([#2339](https://github.com/coral-xyz/anchor/pull/2339)).
- idl: Log output with `ANCHOR_LOG` on failure and improve build error message ([#3284](https://github.com/coral-xyz/anchor/pull/3284)).
- lang: Fix constant bytes declarations when using `declare_program!` ([#3287](https://github.com/coral-xyz/anchor/pull/3287)).
### Breaking

View File

@ -1,16 +1,19 @@
use anchor_lang_idl::types::{Idl, IdlType};
use quote::{format_ident, quote, ToTokens};
use super::common::convert_idl_type_to_str;
use super::common::convert_idl_type_to_syn_type;
pub fn gen_constants_mod(idl: &Idl) -> proc_macro2::TokenStream {
let constants = idl.constants.iter().map(|c| {
let name = format_ident!("{}", c.name);
let ty = match &c.ty {
IdlType::String => quote!(&str),
_ => parse_expr_ts(&convert_idl_type_to_str(&c.ty)),
let val = syn::parse_str::<syn::Expr>(&c.value)
.unwrap()
.to_token_stream();
let (ty, val) = match &c.ty {
IdlType::Bytes => (quote!(&[u8]), quote! { &#val }),
IdlType::String => (quote!(&str), val),
_ => (convert_idl_type_to_syn_type(&c.ty).to_token_stream(), val),
};
let val = parse_expr_ts(&c.value);
// TODO: Docs
quote! { pub const #name: #ty = #val; }
@ -23,7 +26,3 @@ pub fn gen_constants_mod(idl: &Idl) -> proc_macro2::TokenStream {
}
}
}
fn parse_expr_ts(s: &str) -> proc_macro2::TokenStream {
syn::parse_str::<syn::Expr>(s).unwrap().to_token_stream()
}

View File

@ -229,5 +229,12 @@
]
}
}
],
"constants": [
{
"name": "MASTER_SEED",
"type": "bytes",
"value": "[109, 97, 115, 116, 101, 114]"
}
]
}

View File

@ -1,26 +1,55 @@
{
"version": "0.1.0",
"name": "external",
"metadata": {
"address": "Externa111111111111111111111111111111111111"
},
"constants": [
{
"name": "MASTER_SEED",
"type": "bytes",
"value": "[109, 97, 115, 116, 101, 114]"
}
],
"instructions": [
{
"name": "init",
"accounts": [
{ "name": "authority", "isMut": true, "isSigner": true },
{ "name": "myAccount", "isMut": true, "isSigner": false },
{ "name": "systemProgram", "isMut": false, "isSigner": false }
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "myAccount",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "update",
"accounts": [
{ "name": "authority", "isMut": false, "isSigner": true },
{ "name": "myAccount", "isMut": true, "isSigner": false }
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "myAccount",
"isMut": true,
"isSigner": false
}
],
"args": [{ "name": "value", "type": "u32" }]
"args": [
{
"name": "value",
"type": "u32"
}
]
},
{
"name": "updateComposite",
@ -28,21 +57,53 @@
{
"name": "update",
"accounts": [
{ "name": "authority", "isMut": false, "isSigner": true },
{ "name": "myAccount", "isMut": true, "isSigner": false }
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "myAccount",
"isMut": true,
"isSigner": false
}
]
}
],
"args": [{ "name": "value", "type": "u32" }]
"args": [
{
"name": "value",
"type": "u32"
}
]
},
{
"name": "testCompilationDefinedTypeParam",
"accounts": [{ "name": "signer", "isMut": false, "isSigner": true }],
"args": [{ "name": "myAccount", "type": { "defined": "MyAccount" } }]
"accounts": [
{
"name": "signer",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "myAccount",
"type": {
"defined": "MyAccount"
}
}
]
},
{
"name": "testCompilationReturnType",
"accounts": [{ "name": "signer", "isMut": false, "isSigner": true }],
"accounts": [
{
"name": "signer",
"isMut": false,
"isSigner": true
}
],
"args": [],
"returns": "bool"
}
@ -52,14 +113,28 @@
"name": "MyAccount",
"type": {
"kind": "struct",
"fields": [{ "name": "field", "type": "u32" }]
"fields": [
{
"name": "field",
"type": "u32"
}
]
}
}
],
"events": [
{
"name": "MyEvent",
"fields": [{ "name": "value", "type": "u32", "index": false }]
"fields": [
{
"name": "value",
"type": "u32",
"index": false
}
]
}
]
],
"metadata": {
"address": "Externa111111111111111111111111111111111111"
}
}

View File

@ -2,6 +2,9 @@ use anchor_lang::prelude::*;
declare_id!("Externa111111111111111111111111111111111111");
#[constant]
pub const MASTER_SEED: &[u8] = b"master";
#[program]
pub mod external {
use super::*;