Adopt default variant name on name parse error
diff --git a/macro/src/clang.rs b/macro/src/clang.rs
index 4ee00a2..953d0a5 100644
--- a/macro/src/clang.rs
+++ b/macro/src/clang.rs
@@ -3,6 +3,7 @@
use crate::syntax::report::Errors;
use crate::syntax::{Api, Doc, Enum, ForeignName, Pair, Variant};
use proc_macro2::Ident;
+use quote::format_ident;
use serde::Deserialize;
use std::env;
use std::fs;
@@ -78,7 +79,7 @@
};
let ref mut namespace = Vec::new();
- traverse(root, namespace, variants_from_header, None);
+ traverse(cx, root, namespace, variants_from_header, None);
for enm in variants_from_header {
if enm.variants.is_empty() {
@@ -95,6 +96,7 @@
}
fn traverse<'a>(
+ cx: &mut Errors,
node: &'a Node,
namespace: &mut Vec<&'a str>,
variants_from_header: &mut [&mut Enum],
@@ -139,11 +141,15 @@
.span();
let cxx_name = match ForeignName::parse(&decl.name, span) {
Ok(foreign_name) => foreign_name,
- Err(_) => return,
+ Err(_) => {
+ let span = &enm.variants_from_header_attr;
+ let msg = format!("unsupported C++ variant name: {}", decl.name);
+ return cx.error(span, msg);
+ }
};
let rust_name: Ident = match syn::parse_str(&decl.name) {
Ok(ident) => ident,
- Err(_) => return,
+ Err(_) => format_ident!("__Variant{}", enm.variants.len()),
};
enm.variants.push(Variant {
doc: Doc::new(),
@@ -161,7 +167,7 @@
_ => {}
}
for inner in &node.inner {
- traverse(inner, namespace, variants_from_header, idx);
+ traverse(cx, inner, namespace, variants_from_header, idx);
}
if let Clang::NamespaceDecl(_) = &node.kind {
let _ = namespace.pop().unwrap();