ink_codegen/generator/
contract.rs

1// Copyright (C) Use Ink (UK) Ltd.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use crate::{
16    generator,
17    GenerateCode,
18    GenerateCodeUsing,
19};
20use derive_more::From;
21use proc_macro2::TokenStream as TokenStream2;
22use quote::quote;
23
24/// Generates code for the entirety of the ink! contract.
25#[derive(From)]
26pub struct Contract<'a> {
27    /// The contract to generate code for.
28    contract: &'a ir::Contract,
29}
30impl_as_ref_for_generator!(Contract);
31
32impl GenerateCode for Contract<'_> {
33    /// Generates ink! contract code.
34    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        quote! {
57            #( #attrs )*
58            #vis mod #ident {
59                #env
60                #storage
61                #( #events )*
62                #dispatch2
63                #item_impls
64                #contract_reference
65                #metadata
66                #( #non_ink_items )*
67            }
68        }
69    }
70}