moverox_codegen/
move_type.rs

1use std::collections::HashMap;
2
3use move_syn::{Type, TypePath};
4use proc_macro2::{Ident, TokenStream};
5use quote::{ToTokens, quote};
6use unsynn::ToTokens as _;
7
8/// Generate Rust-equivalent type, substituting Move named addresses with Rust paths to oxidized
9/// Move packages using `address_map`.
10pub(super) fn to_rust_with_substitutions(
11    this: &Type,
12    address_map: &HashMap<Ident, TokenStream>,
13) -> TokenStream {
14    let type_args = this
15        .type_args
16        .as_ref()
17        .map_or_else(TokenStream::new, |type_args| {
18            let types = type_args
19                .types()
20                .map(|ty| to_rust_with_substitutions(ty, address_map));
21            quote!(<#(#types),*>)
22        });
23
24    let path = if let TypePath::Full {
25        named_address,
26        module,
27        r#type: type_,
28        ..
29    } = &this.path
30    {
31        let prefix: &dyn ToTokens = address_map
32            .get(named_address)
33            .map_or(named_address, |path| path);
34        quote!(#prefix::#module::#type_)
35    } else {
36        this.path.to_token_stream()
37    };
38
39    quote! {
40        #path #type_args
41    }
42}