Skip to content

Commit 9629722

Browse files
committed
Add expansion test
1 parent 0ca90a3 commit 9629722

File tree

15 files changed

+93
-6
lines changed

15 files changed

+93
-6
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/burner/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/crypto-verify/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/cyberpunk/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/empty/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/floaty/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/hackatom/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/ibc-reflect-send/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/ibc-reflect/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/queue/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/reflect/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/staking/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/virus/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/derive/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ proc-macro = true
1515
default = []
1616

1717
[dependencies]
18+
proc-macro2 = "1.0.79"
1819
quote = "1.0.35"
1920
syn = { version = "2", features = ["full"] }
2021

packages/derive/src/lib.rs

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
1-
use proc_macro::TokenStream;
1+
use proc_macro2::TokenStream;
22
use quote::{format_ident, quote, ToTokens};
33
use syn::{
44
parse::{Parse, ParseStream},
5-
parse_macro_input, parse_quote,
5+
parse_quote,
66
punctuated::Punctuated,
77
Token,
88
};
99

10+
macro_rules! maybe {
11+
($result:expr) => {{
12+
match { $result } {
13+
Ok(val) => val,
14+
Err(err) => return err.into_compile_error(),
15+
}
16+
}};
17+
}
18+
1019
struct Options {
1120
crate_path: syn::Path,
1221
}
@@ -85,10 +94,17 @@ impl Parse for Options {
8594
/// where `InstantiateMsg`, `ExecuteMsg`, and `QueryMsg` are contract defined
8695
/// types that implement `DeserializeOwned + JsonSchema`.
8796
#[proc_macro_attribute]
88-
pub fn entry_point(attr: TokenStream, mut item: TokenStream) -> TokenStream {
97+
pub fn entry_point(
98+
attr: proc_macro::TokenStream,
99+
item: proc_macro::TokenStream,
100+
) -> proc_macro::TokenStream {
101+
entry_point_impl(attr.into(), item.into()).into()
102+
}
103+
104+
fn entry_point_impl(attr: TokenStream, mut item: TokenStream) -> TokenStream {
89105
let cloned = item.clone();
90-
let function = parse_macro_input!(cloned as syn::ItemFn);
91-
let Options { crate_path } = parse_macro_input!(attr as Options);
106+
let function: syn::ItemFn = maybe!(syn::parse2(cloned));
107+
let Options { crate_path } = maybe!(syn::parse2(attr));
92108

93109
// The first argument is `deps`, the rest is region pointers
94110
let args = function.sig.inputs.len() - 1;
@@ -109,6 +125,63 @@ pub fn entry_point(attr: TokenStream, mut item: TokenStream) -> TokenStream {
109125
}
110126
};
111127

112-
item.extend(TokenStream::from(new_code));
128+
item.extend(new_code);
113129
item
114130
}
131+
132+
#[cfg(test)]
133+
mod test {
134+
use proc_macro2::TokenStream;
135+
use quote::quote;
136+
137+
use crate::entry_point_impl;
138+
139+
#[test]
140+
fn default_expansion() {
141+
let code = quote! {
142+
fn instantiate(deps: DepsMut, env: Env) -> Response {
143+
// Logic here
144+
}
145+
};
146+
147+
let actual = entry_point_impl(TokenStream::new(), code);
148+
let expected = quote! {
149+
fn instantiate(deps: DepsMut, env: Env) -> Response { }
150+
151+
#[cfg(target_arch = "wasm32")]
152+
mod __wasm_export_instantiate {
153+
#[no_mangle]
154+
extern "C" fn instantiate(ptr_0: u32) -> u32 {
155+
::cosmwasm_std::do_instantiate(&super::instantiate, ptr_0)
156+
}
157+
}
158+
};
159+
160+
assert_eq!(actual.to_string(), expected.to_string());
161+
}
162+
163+
#[test]
164+
fn renamed_expansion() {
165+
let attribute = quote!(crate = "::my_crate::cw_std");
166+
let code = quote! {
167+
fn instantiate(deps: DepsMut, env: Env) -> Response {
168+
// Logic here
169+
}
170+
};
171+
172+
let actual = entry_point_impl(attribute, code);
173+
let expected = quote! {
174+
fn instantiate(deps: DepsMut, env: Env) -> Response { }
175+
176+
#[cfg(target_arch = "wasm32")]
177+
mod __wasm_export_instantiate {
178+
#[no_mangle]
179+
extern "C" fn instantiate(ptr_0: u32) -> u32 {
180+
::my_crate::cw_std::do_instantiate(&super::instantiate, ptr_0)
181+
}
182+
}
183+
};
184+
185+
assert_eq!(actual.to_string(), expected.to_string());
186+
}
187+
}

0 commit comments

Comments
 (0)