1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
use std::borrow::Cow;
use crate::generator::rust::*;
use crate::target::Acc;
use enum_dispatch::enum_dispatch;
#[enum_dispatch]
pub trait TypeRustGeneratorTrait {
fn wire2api_body(&self) -> Acc<Option<String>>;
fn wire2api_jsvalue(&self) -> Option<Cow<str>> {
None
}
fn wire_struct_fields(&self) -> Option<Vec<String>> {
None
}
fn static_checks(&self) -> Option<String> {
None
}
fn wrapper_struct(&self) -> Option<String> {
None
}
fn self_access(&self, obj: String) -> String {
obj
}
fn wrap_obj(&self, obj: String) -> String {
obj
}
fn convert_to_dart(&self, obj: String) -> String {
format!("{}.into_dart()", obj)
}
fn structs(&self) -> String {
"".to_string()
}
fn allocate_funcs(
&self,
_collector: &mut ExternFuncCollector,
_block_index: BlockIndex,
) -> Acc<Option<String>> {
Acc::default()
}
fn related_funcs(
&self,
_collector: &mut ExternFuncCollector,
_block_index: BlockIndex,
) -> Acc<Option<String>> {
Acc::default()
}
fn impl_intodart(&self) -> String {
"".to_string()
}
fn new_with_nullptr(&self, _collector: &mut ExternFuncCollector) -> String {
"".to_string()
}
fn imports(&self) -> Option<String> {
None
}
}
#[derive(Debug, Clone)]
pub struct TypeGeneratorContext<'a> {
pub ir_file: &'a IrFile,
pub config: &'a Opts,
}
#[macro_export]
macro_rules! type_rust_generator_struct {
($cls:ident, $ir_cls:ty) => {
#[derive(Debug, Clone)]
pub struct $cls<'a> {
pub ir: $ir_cls,
pub context: TypeGeneratorContext<'a>,
}
};
}
#[enum_dispatch(TypeRustGeneratorTrait)]
#[derive(Debug, Clone)]
pub enum TypeRustGenerator<'a> {
Primitive(TypePrimitiveGenerator<'a>),
Delegate(TypeDelegateGenerator<'a>),
PrimitiveList(TypePrimitiveListGenerator<'a>),
Optional(TypeOptionalGenerator<'a>),
GeneralList(TypeGeneralListGenerator<'a>),
StructRef(TypeStructRefGenerator<'a>),
Boxed(TypeBoxedGenerator<'a>),
EnumRef(TypeEnumRefGenerator<'a>),
SyncReturn(TypeSyncReturnGenerator<'a>),
DartOpaque(TypeDartOpaqueGenerator<'a>),
RustOpaque(TypeRustOpaqueGenerator<'a>),
}
impl<'a> TypeRustGenerator<'a> {
pub fn new(ty: IrType, ir_file: &'a IrFile, config: &'a Opts) -> Self {
let context = TypeGeneratorContext { ir_file, config };
match ty {
Primitive(ir) => TypePrimitiveGenerator { ir, context }.into(),
Delegate(ir) => TypeDelegateGenerator { ir, context }.into(),
PrimitiveList(ir) => TypePrimitiveListGenerator { ir, context }.into(),
Optional(ir) => TypeOptionalGenerator { ir, context }.into(),
GeneralList(ir) => TypeGeneralListGenerator { ir, context }.into(),
StructRef(ir) => TypeStructRefGenerator { ir, context }.into(),
Boxed(ir) => TypeBoxedGenerator { ir, context }.into(),
EnumRef(ir) => TypeEnumRefGenerator { ir, context }.into(),
SyncReturn(ir) => TypeSyncReturnGenerator { ir, context }.into(),
DartOpaque(ir) => TypeDartOpaqueGenerator { ir, context }.into(),
RustOpaque(ir) => TypeRustOpaqueGenerator { ir, context }.into(),
}
}
}