Defer generics errors until after attribute errors
All attribute errors are nonfatal so we might as well report them all
even if an input contains unsupported generics.
diff --git a/syntax/parse.rs b/syntax/parse.rs
index e6cfd04..8110ce8 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -55,18 +55,6 @@
}
fn parse_struct(cx: &mut Errors, item: ItemStruct, namespace: &Namespace) -> Result<Api> {
- let generics = &item.generics;
- if !generics.params.is_empty() || generics.where_clause.is_some() {
- let struct_token = item.struct_token;
- let ident = &item.ident;
- let where_clause = &generics.where_clause;
- let span = quote!(#struct_token #ident #generics #where_clause);
- return Err(Error::new_spanned(
- span,
- "struct with generic parameters is not supported yet",
- ));
- }
-
let mut doc = Doc::new();
let mut derives = Vec::new();
let mut namespace = namespace.clone();
@@ -81,6 +69,18 @@
},
);
+ let generics = &item.generics;
+ if !generics.params.is_empty() || generics.where_clause.is_some() {
+ let struct_token = item.struct_token;
+ let ident = &item.ident;
+ let where_clause = &generics.where_clause;
+ let span = quote!(#struct_token #ident #generics #where_clause);
+ return Err(Error::new_spanned(
+ span,
+ "struct with generic parameters is not supported yet",
+ ));
+ }
+
let named_fields = match item.fields {
Fields::Named(fields) => fields,
Fields::Unit => return Err(Error::new_spanned(item, "unit structs are not supported")),
@@ -113,18 +113,6 @@
}
fn parse_enum(cx: &mut Errors, item: ItemEnum, namespace: &Namespace) -> Result<Api> {
- let generics = &item.generics;
- if !generics.params.is_empty() || generics.where_clause.is_some() {
- let enum_token = item.enum_token;
- let ident = &item.ident;
- let where_clause = &generics.where_clause;
- let span = quote!(#enum_token #ident #generics #where_clause);
- return Err(Error::new_spanned(
- span,
- "enums with generic parameters are not allowed",
- ));
- }
-
let mut doc = Doc::new();
let mut derives = Vec::new();
let mut repr = None;
@@ -141,6 +129,18 @@
},
);
+ let generics = &item.generics;
+ if !generics.params.is_empty() || generics.where_clause.is_some() {
+ let enum_token = item.enum_token;
+ let ident = &item.ident;
+ let where_clause = &generics.where_clause;
+ let span = quote!(#enum_token #ident #generics #where_clause);
+ return Err(Error::new_spanned(
+ span,
+ "enums with generic parameters are not allowed",
+ ));
+ }
+
let mut variants = Vec::new();
let mut discriminants = DiscriminantSet::new(repr);
for variant in item.variants {
@@ -366,6 +366,22 @@
trusted: bool,
namespace: &Namespace,
) -> Result<Api> {
+ let mut doc = Doc::new();
+ let mut cxx_name = None;
+ let mut rust_name = None;
+ let mut namespace = namespace.clone();
+ attrs::parse(
+ cx,
+ &foreign_fn.attrs,
+ attrs::Parser {
+ doc: Some(&mut doc),
+ cxx_name: Some(&mut cxx_name),
+ rust_name: Some(&mut rust_name),
+ namespace: Some(&mut namespace),
+ ..Default::default()
+ },
+ );
+
let generics = &foreign_fn.sig.generics;
if generics.where_clause.is_some()
|| generics.params.iter().any(|param| match param {
@@ -403,22 +419,6 @@
));
}
- let mut doc = Doc::new();
- let mut cxx_name = None;
- let mut rust_name = None;
- let mut namespace = namespace.clone();
- attrs::parse(
- cx,
- &foreign_fn.attrs,
- attrs::Parser {
- doc: Some(&mut doc),
- cxx_name: Some(&mut cxx_name),
- rust_name: Some(&mut rust_name),
- namespace: Some(&mut namespace),
- ..Default::default()
- },
- );
-
let mut receiver = None;
let mut args = Punctuated::new();
for arg in foreign_fn.sig.inputs.pairs() {