ink_codegen/generator/
contract.rs1use crate::{
16 generator,
17 GenerateCode,
18 GenerateCodeUsing,
19};
20use derive_more::From;
21use proc_macro2::TokenStream as TokenStream2;
22use quote::quote;
23
24#[derive(From)]
26pub struct Contract<'a> {
27 contract: &'a ir::Contract,
29}
30impl_as_ref_for_generator!(Contract);
31
32impl GenerateCode for Contract<'_> {
33 fn generate_code(&self) -> TokenStream2 {
35 let module = self.contract.module();
36 let ident = module.ident();
37 let attrs = module.attrs();
38 let vis = module.vis();
39 let env = self.generate_code_using::<generator::Env>();
40 let storage = self.generate_code_using::<generator::Storage>();
41 let events = module.events().map(move |event| {
42 let event_generator = generator::Event::from(event);
43 event_generator.generate_code()
44 });
45 let dispatch2 = self.generate_code_using::<generator::Dispatch>();
46 let item_impls = self.generate_code_using::<generator::ItemImpls>();
47 let metadata = self.generate_code_using::<generator::Metadata>();
48 let contract_reference =
49 self.generate_code_using::<generator::ContractReference>();
50 let non_ink_items = self
51 .contract
52 .module()
53 .items()
54 .iter()
55 .filter_map(ir::Item::map_rust_item);
56
57 #[cfg(not(any(ink_abi = "sol", ink_abi = "all")))]
58 let solidity_metadata = quote!();
59
60 #[cfg(any(ink_abi = "sol", ink_abi = "all"))]
61 let solidity_metadata = self.generate_code_using::<generator::SolidityMetadata>();
62
63 quote! {
64 #( #attrs )*
65 #vis mod #ident {
66 #env
67 #storage
68 #( #events )*
69 #dispatch2
70 #item_impls
71 #contract_reference
72 #metadata
73 #solidity_metadata
74 #( #non_ink_items )*
75 }
76 }
77 }
78}