@@ -30,11 +30,11 @@ pub fn parse_items(
30
30
let mut apis = Vec :: new ( ) ;
31
31
for item in items {
32
32
match item {
33
- Item :: Struct ( item) => match parse_struct ( cx, item, namespace. clone ( ) ) {
33
+ Item :: Struct ( item) => match parse_struct ( cx, item, namespace) {
34
34
Ok ( strct) => apis. push ( strct) ,
35
35
Err ( err) => cx. push ( err) ,
36
36
} ,
37
- Item :: Enum ( item) => match parse_enum ( cx, item, namespace. clone ( ) ) {
37
+ Item :: Enum ( item) => match parse_enum ( cx, item, namespace) {
38
38
Ok ( enm) => apis. push ( enm) ,
39
39
Err ( err) => cx. push ( err) ,
40
40
} ,
@@ -52,7 +52,7 @@ pub fn parse_items(
52
52
apis
53
53
}
54
54
55
- fn parse_struct ( cx : & mut Errors , item : ItemStruct , mut namespace : Namespace ) -> Result < Api > {
55
+ fn parse_struct ( cx : & mut Errors , item : ItemStruct , namespace : & Namespace ) -> Result < Api > {
56
56
let generics = & item. generics ;
57
57
if !generics. params . is_empty ( ) || generics. where_clause . is_some ( ) {
58
58
let struct_token = item. struct_token ;
@@ -67,6 +67,7 @@ fn parse_struct(cx: &mut Errors, item: ItemStruct, mut namespace: Namespace) ->
67
67
68
68
let mut doc = Doc :: new ( ) ;
69
69
let mut derives = Vec :: new ( ) ;
70
+ let mut namespace = namespace. clone ( ) ;
70
71
attrs:: parse (
71
72
cx,
72
73
& item. attrs ,
@@ -78,34 +79,36 @@ fn parse_struct(cx: &mut Errors, item: ItemStruct, mut namespace: Namespace) ->
78
79
} ,
79
80
) ;
80
81
81
- let fields = match item. fields {
82
+ let named_fields = match item. fields {
82
83
Fields :: Named ( fields) => fields,
83
84
Fields :: Unit => return Err ( Error :: new_spanned ( item, "unit structs are not supported" ) ) ,
84
85
Fields :: Unnamed ( _) => {
85
86
return Err ( Error :: new_spanned ( item, "tuple structs are not supported" ) ) ;
86
87
}
87
88
} ;
88
89
90
+ let fields = named_fields
91
+ . named
92
+ . into_iter ( )
93
+ . map ( |field| {
94
+ Ok ( Var {
95
+ ident : field. ident . unwrap ( ) ,
96
+ ty : parse_type ( & field. ty , & namespace) ?,
97
+ } )
98
+ } )
99
+ . collect :: < Result < _ > > ( ) ?;
100
+
89
101
Ok ( Api :: Struct ( Struct {
90
102
doc,
91
103
derives,
92
104
struct_token : item. struct_token ,
93
- name : Pair :: new ( namespace. clone ( ) , item. ident ) ,
94
- brace_token : fields. brace_token ,
95
- fields : fields
96
- . named
97
- . into_iter ( )
98
- . map ( |field| {
99
- Ok ( Var {
100
- ident : field. ident . unwrap ( ) ,
101
- ty : parse_type ( & field. ty , & namespace) ?,
102
- } )
103
- } )
104
- . collect :: < Result < _ > > ( ) ?,
105
+ name : Pair :: new ( namespace, item. ident ) ,
106
+ brace_token : named_fields. brace_token ,
107
+ fields,
105
108
} ) )
106
109
}
107
110
108
- fn parse_enum ( cx : & mut Errors , item : ItemEnum , mut namespace : Namespace ) -> Result < Api > {
111
+ fn parse_enum ( cx : & mut Errors , item : ItemEnum , namespace : & Namespace ) -> Result < Api > {
109
112
let generics = & item. generics ;
110
113
if !generics. params . is_empty ( ) || generics. where_clause . is_some ( ) {
111
114
let enum_token = item. enum_token ;
@@ -120,6 +123,7 @@ fn parse_enum(cx: &mut Errors, item: ItemEnum, mut namespace: Namespace) -> Resu
120
123
121
124
let mut doc = Doc :: new ( ) ;
122
125
let mut repr = None ;
126
+ let mut namespace = namespace. clone ( ) ;
123
127
attrs:: parse (
124
128
cx,
125
129
& item. attrs ,
@@ -210,17 +214,26 @@ fn parse_foreign_mod(
210
214
211
215
let trusted = trusted || foreign_mod. unsafety . is_some ( ) ;
212
216
217
+ let mut namespace = namespace. clone ( ) ;
218
+ attrs:: parse (
219
+ cx,
220
+ & foreign_mod. attrs ,
221
+ attrs:: Parser {
222
+ namespace : Some ( & mut namespace) ,
223
+ ..Default :: default ( )
224
+ } ,
225
+ ) ;
226
+
213
227
let mut items = Vec :: new ( ) ;
214
228
for foreign in & foreign_mod. items {
215
229
match foreign {
216
230
ForeignItem :: Type ( foreign) => {
217
- match parse_extern_type ( cx, foreign, lang, trusted, namespace. clone ( ) ) {
231
+ match parse_extern_type ( cx, foreign, lang, trusted, & namespace) {
218
232
Ok ( ety) => items. push ( ety) ,
219
233
Err ( err) => cx. push ( err) ,
220
234
}
221
235
}
222
- ForeignItem :: Fn ( foreign) => match parse_extern_fn ( cx, foreign, lang, namespace. clone ( ) )
223
- {
236
+ ForeignItem :: Fn ( foreign) => match parse_extern_fn ( cx, foreign, lang, & namespace) {
224
237
Ok ( efn) => items. push ( efn) ,
225
238
Err ( err) => cx. push ( err) ,
226
239
} ,
@@ -231,7 +244,7 @@ fn parse_foreign_mod(
231
244
}
232
245
}
233
246
ForeignItem :: Verbatim ( tokens) => {
234
- match parse_extern_verbatim ( cx, tokens, lang, namespace. clone ( ) ) {
247
+ match parse_extern_verbatim ( cx, tokens, lang, & namespace) {
235
248
Ok ( api) => items. push ( api) ,
236
249
Err ( err) => cx. push ( err) ,
237
250
}
@@ -283,9 +296,10 @@ fn parse_extern_type(
283
296
foreign_type : & ForeignItemType ,
284
297
lang : Lang ,
285
298
trusted : bool ,
286
- mut namespace : Namespace ,
299
+ namespace : & Namespace ,
287
300
) -> Result < Api > {
288
301
let mut doc = Doc :: new ( ) ;
302
+ let mut namespace = namespace. clone ( ) ;
289
303
attrs:: parse (
290
304
cx,
291
305
& foreign_type. attrs ,
@@ -315,7 +329,7 @@ fn parse_extern_fn(
315
329
cx : & mut Errors ,
316
330
foreign_fn : & ForeignItemFn ,
317
331
lang : Lang ,
318
- mut namespace : Namespace ,
332
+ namespace : & Namespace ,
319
333
) -> Result < Api > {
320
334
let generics = & foreign_fn. sig . generics ;
321
335
if !generics. params . is_empty ( ) || generics. where_clause . is_some ( ) {
@@ -334,6 +348,7 @@ fn parse_extern_fn(
334
348
let mut doc = Doc :: new ( ) ;
335
349
let mut cxx_name = None ;
336
350
let mut rust_name = None ;
351
+ let mut namespace = namespace. clone ( ) ;
337
352
attrs:: parse (
338
353
cx,
339
354
& foreign_fn. attrs ,
@@ -438,7 +453,7 @@ fn parse_extern_verbatim(
438
453
cx : & mut Errors ,
439
454
tokens : & TokenStream ,
440
455
lang : Lang ,
441
- mut namespace : Namespace ,
456
+ namespace : & Namespace ,
442
457
) -> Result < Api > {
443
458
// type Alias = crate::path::to::Type;
444
459
let parse = |input : ParseStream | -> Result < TypeAlias > {
@@ -455,6 +470,7 @@ fn parse_extern_verbatim(
455
470
let ty: RustType = input. parse ( ) ?;
456
471
let semi_token: Token ! [ ; ] = input. parse ( ) ?;
457
472
let mut doc = Doc :: new ( ) ;
473
+ let mut namespace = namespace. clone ( ) ;
458
474
attrs:: parse (
459
475
cx,
460
476
& attrs,
0 commit comments