@@ -41,8 +41,8 @@ fn expand(ffi: Module, apis: &[Api], types: &Types) -> TokenStream {
41
41
for api in apis {
42
42
match api {
43
43
Api :: Include ( _) | Api :: RustType ( _) => { }
44
- Api :: Struct ( strct) => expanded. extend ( expand_struct ( strct) ) ,
45
- Api :: Enum ( enm) => expanded. extend ( expand_enum ( enm) ) ,
44
+ Api :: Struct ( strct) => expanded. extend ( expand_struct ( namespace , strct) ) ,
45
+ Api :: Enum ( enm) => expanded. extend ( expand_enum ( namespace , enm) ) ,
46
46
Api :: CxxType ( ety) => {
47
47
let ident = & ety. ident ;
48
48
if !types. structs . contains_key ( ident) && !types. enums . contains_key ( ident) {
@@ -120,7 +120,7 @@ fn expand(ffi: Module, apis: &[Api], types: &Types) -> TokenStream {
120
120
}
121
121
}
122
122
123
- fn expand_struct ( strct : & Struct ) -> TokenStream {
123
+ fn expand_struct ( namespace : & Namespace , strct : & Struct ) -> TokenStream {
124
124
let ident = & strct. ident ;
125
125
let doc = & strct. doc ;
126
126
let derives = & strct. derives ;
@@ -130,17 +130,24 @@ fn expand_struct(strct: &Struct) -> TokenStream {
130
130
let vis = Token ! [ pub ] ( field. ident . span ( ) ) ;
131
131
quote ! ( #vis #field)
132
132
} ) ;
133
+ let type_id = type_id ( namespace, ident) ;
134
+ // TODO: Add ui test for mismatched alias kinds
133
135
quote ! {
134
136
#doc
135
137
#[ derive( #( #derives) , * ) ]
136
138
#[ repr( C ) ]
137
139
pub struct #ident {
138
140
#( #fields, ) *
139
141
}
142
+
143
+ unsafe impl :: cxx:: ExternType for #ident {
144
+ type Kind = :: cxx:: extern_type:: KindShared ;
145
+ type Id = #type_id;
146
+ }
140
147
}
141
148
}
142
149
143
- fn expand_enum ( enm : & Enum ) -> TokenStream {
150
+ fn expand_enum ( namespace : & Namespace , enm : & Enum ) -> TokenStream {
144
151
let ident = & enm. ident ;
145
152
let doc = & enm. doc ;
146
153
let repr = enm. repr ;
@@ -151,6 +158,7 @@ fn expand_enum(enm: &Enum) -> TokenStream {
151
158
pub const #variant_ident: Self = #ident { repr: #discriminant } ;
152
159
} )
153
160
} ) ;
161
+ let type_id = type_id ( namespace, ident) ;
154
162
quote ! {
155
163
#doc
156
164
#[ derive( Copy , Clone , PartialEq , Eq ) ]
@@ -163,6 +171,11 @@ fn expand_enum(enm: &Enum) -> TokenStream {
163
171
impl #ident {
164
172
#( #variants) *
165
173
}
174
+
175
+ unsafe impl :: cxx:: ExternType for #ident {
176
+ type Kind = :: cxx:: extern_type:: KindShared ;
177
+ type Id = #type_id;
178
+ }
166
179
}
167
180
}
168
181
0 commit comments