Do not abort parser on namespace ident checks
diff --git a/gen/src/mod.rs b/gen/src/mod.rs
index 928c6ec..be46533 100644
--- a/gen/src/mod.rs
+++ b/gen/src/mod.rs
@@ -43,10 +43,11 @@
match (|| -> Result<_> {
let syntax = syn::parse_file(&source)?;
let bridge = find_bridge_mod(syntax)?;
+ let namespace = bridge.namespace;
let apis = syntax::parse_items(bridge.module)?;
let types = Types::collect(&apis)?;
- check::typecheck(&apis, &types)?;
- let out = write::gen(bridge.namespace, &apis, &types, opt, header);
+ check::typecheck(&namespace, &apis, &types)?;
+ let out = write::gen(namespace, &apis, &types, opt, header);
Ok(out)
})() {
Ok(out) => out.content(),
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index 472c079..2e1873c 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -16,7 +16,7 @@
))?;
let apis = syntax::parse_items(content.1)?;
let ref types = Types::collect(&apis)?;
- check::typecheck(&apis, types)?;
+ check::typecheck(namespace, &apis, types)?;
let mut expanded = TokenStream::new();
let mut hidden = TokenStream::new();
diff --git a/syntax/check.rs b/syntax/check.rs
index 7ddcea3..c2ee1d1 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -1,4 +1,5 @@
use crate::syntax::atom::Atom::{self, *};
+use crate::syntax::namespace::Namespace;
use crate::syntax::{
error, ident, Api, Enum, ExternFn, ExternType, Lang, Receiver, Ref, Slice, Struct, Ty1, Type,
Types,
@@ -10,14 +11,16 @@
use syn::{Error, Result};
struct Check<'a> {
+ namespace: &'a Namespace,
apis: &'a [Api],
types: &'a Types<'a>,
errors: &'a mut Vec<Error>,
}
-pub(crate) fn typecheck(apis: &[Api], types: &Types) -> Result<()> {
+pub(crate) fn typecheck(namespace: &Namespace, apis: &[Api], types: &Types) -> Result<()> {
let mut errors = Vec::new();
let mut cx = Check {
+ namespace,
apis,
types,
errors: &mut errors,
@@ -27,6 +30,10 @@
}
fn do_typecheck(cx: &mut Check) {
+ for segment in cx.namespace {
+ cx.errors.extend(ident::check(segment).err());
+ }
+
for ty in cx.types {
match ty {
Type::Ident(ident) => check_type_ident(cx, ident),
diff --git a/syntax/namespace.rs b/syntax/namespace.rs
index 5230eb6..e2dce18 100644
--- a/syntax/namespace.rs
+++ b/syntax/namespace.rs
@@ -1,4 +1,3 @@
-use crate::syntax::ident;
use quote::IdentFragment;
use std::fmt::{self, Display};
use std::slice::Iter;
@@ -34,7 +33,6 @@
input.parse::<Token![=]>()?;
let path = input.call(Path::parse_mod_style)?;
for segment in path.segments {
- ident::check(&segment.ident)?;
segments.push(segment.ident);
}
input.parse::<Option<Token![,]>>()?;