Skip to content

Commit c1e475e

Browse files
authored
Merge pull request #444 from dtolnay/namespace
Parse namespace attribute on foreign mods
2 parents 9b193c3 + 7feb264 commit c1e475e

File tree

2 files changed

+41
-25
lines changed

2 files changed

+41
-25
lines changed

syntax/file.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ impl Parse for Item {
9494
RustItem::Struct(item) => Ok(Item::Struct(ItemStruct { attrs, ..item })),
9595
RustItem::Enum(item) => Ok(Item::Enum(ItemEnum { attrs, ..item })),
9696
RustItem::ForeignMod(item) => Ok(Item::ForeignMod(ItemForeignMod {
97-
attrs: item.attrs,
97+
attrs,
9898
unsafety,
9999
abi: item.abi,
100100
brace_token: item.brace_token,

syntax/parse.rs

+40-24
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ pub fn parse_items(
3030
let mut apis = Vec::new();
3131
for item in items {
3232
match item {
33-
Item::Struct(item) => match parse_struct(cx, item, namespace.clone()) {
33+
Item::Struct(item) => match parse_struct(cx, item, namespace) {
3434
Ok(strct) => apis.push(strct),
3535
Err(err) => cx.push(err),
3636
},
37-
Item::Enum(item) => match parse_enum(cx, item, namespace.clone()) {
37+
Item::Enum(item) => match parse_enum(cx, item, namespace) {
3838
Ok(enm) => apis.push(enm),
3939
Err(err) => cx.push(err),
4040
},
@@ -52,7 +52,7 @@ pub fn parse_items(
5252
apis
5353
}
5454

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> {
5656
let generics = &item.generics;
5757
if !generics.params.is_empty() || generics.where_clause.is_some() {
5858
let struct_token = item.struct_token;
@@ -67,6 +67,7 @@ fn parse_struct(cx: &mut Errors, item: ItemStruct, mut namespace: Namespace) ->
6767

6868
let mut doc = Doc::new();
6969
let mut derives = Vec::new();
70+
let mut namespace = namespace.clone();
7071
attrs::parse(
7172
cx,
7273
&item.attrs,
@@ -78,34 +79,36 @@ fn parse_struct(cx: &mut Errors, item: ItemStruct, mut namespace: Namespace) ->
7879
},
7980
);
8081

81-
let fields = match item.fields {
82+
let named_fields = match item.fields {
8283
Fields::Named(fields) => fields,
8384
Fields::Unit => return Err(Error::new_spanned(item, "unit structs are not supported")),
8485
Fields::Unnamed(_) => {
8586
return Err(Error::new_spanned(item, "tuple structs are not supported"));
8687
}
8788
};
8889

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+
89101
Ok(Api::Struct(Struct {
90102
doc,
91103
derives,
92104
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,
105108
}))
106109
}
107110

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> {
109112
let generics = &item.generics;
110113
if !generics.params.is_empty() || generics.where_clause.is_some() {
111114
let enum_token = item.enum_token;
@@ -120,6 +123,7 @@ fn parse_enum(cx: &mut Errors, item: ItemEnum, mut namespace: Namespace) -> Resu
120123

121124
let mut doc = Doc::new();
122125
let mut repr = None;
126+
let mut namespace = namespace.clone();
123127
attrs::parse(
124128
cx,
125129
&item.attrs,
@@ -210,17 +214,26 @@ fn parse_foreign_mod(
210214

211215
let trusted = trusted || foreign_mod.unsafety.is_some();
212216

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+
213227
let mut items = Vec::new();
214228
for foreign in &foreign_mod.items {
215229
match foreign {
216230
ForeignItem::Type(foreign) => {
217-
match parse_extern_type(cx, foreign, lang, trusted, namespace.clone()) {
231+
match parse_extern_type(cx, foreign, lang, trusted, &namespace) {
218232
Ok(ety) => items.push(ety),
219233
Err(err) => cx.push(err),
220234
}
221235
}
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) {
224237
Ok(efn) => items.push(efn),
225238
Err(err) => cx.push(err),
226239
},
@@ -231,7 +244,7 @@ fn parse_foreign_mod(
231244
}
232245
}
233246
ForeignItem::Verbatim(tokens) => {
234-
match parse_extern_verbatim(cx, tokens, lang, namespace.clone()) {
247+
match parse_extern_verbatim(cx, tokens, lang, &namespace) {
235248
Ok(api) => items.push(api),
236249
Err(err) => cx.push(err),
237250
}
@@ -283,9 +296,10 @@ fn parse_extern_type(
283296
foreign_type: &ForeignItemType,
284297
lang: Lang,
285298
trusted: bool,
286-
mut namespace: Namespace,
299+
namespace: &Namespace,
287300
) -> Result<Api> {
288301
let mut doc = Doc::new();
302+
let mut namespace = namespace.clone();
289303
attrs::parse(
290304
cx,
291305
&foreign_type.attrs,
@@ -315,7 +329,7 @@ fn parse_extern_fn(
315329
cx: &mut Errors,
316330
foreign_fn: &ForeignItemFn,
317331
lang: Lang,
318-
mut namespace: Namespace,
332+
namespace: &Namespace,
319333
) -> Result<Api> {
320334
let generics = &foreign_fn.sig.generics;
321335
if !generics.params.is_empty() || generics.where_clause.is_some() {
@@ -334,6 +348,7 @@ fn parse_extern_fn(
334348
let mut doc = Doc::new();
335349
let mut cxx_name = None;
336350
let mut rust_name = None;
351+
let mut namespace = namespace.clone();
337352
attrs::parse(
338353
cx,
339354
&foreign_fn.attrs,
@@ -438,7 +453,7 @@ fn parse_extern_verbatim(
438453
cx: &mut Errors,
439454
tokens: &TokenStream,
440455
lang: Lang,
441-
mut namespace: Namespace,
456+
namespace: &Namespace,
442457
) -> Result<Api> {
443458
// type Alias = crate::path::to::Type;
444459
let parse = |input: ParseStream| -> Result<TypeAlias> {
@@ -455,6 +470,7 @@ fn parse_extern_verbatim(
455470
let ty: RustType = input.parse()?;
456471
let semi_token: Token![;] = input.parse()?;
457472
let mut doc = Doc::new();
473+
let mut namespace = namespace.clone();
458474
attrs::parse(
459475
cx,
460476
&attrs,

0 commit comments

Comments
 (0)