Data structure for parsed contents of bridge module
diff --git a/syntax/file.rs b/syntax/file.rs
index 2243235..f227900 100644
--- a/syntax/file.rs
+++ b/syntax/file.rs
@@ -1,7 +1,10 @@
use crate::syntax::namespace::Namespace;
use quote::quote;
use syn::parse::{Error, Parse, ParseStream, Result};
-use syn::{braced, token, Attribute, Ident, Item, Token, Visibility};
+use syn::{
+ braced, token, Attribute, Ident, Item as RustItem, ItemEnum, ItemForeignMod, ItemStruct,
+ ItemUse, Token, Visibility,
+};
pub struct Module {
pub namespace: Namespace,
@@ -14,6 +17,14 @@
pub content: Vec<Item>,
}
+pub enum Item {
+ Struct(ItemStruct),
+ Enum(ItemEnum),
+ ForeignMod(ItemForeignMod),
+ Use(ItemUse),
+ Other(RustItem),
+}
+
impl Parse for Module {
fn parse(input: ParseStream) -> Result<Self> {
let namespace = Namespace::none();
@@ -53,3 +64,16 @@
})
}
}
+
+impl Parse for Item {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let item = input.parse()?;
+ match item {
+ RustItem::Struct(item) => Ok(Item::Struct(item)),
+ RustItem::Enum(item) => Ok(Item::Enum(item)),
+ RustItem::ForeignMod(item) => Ok(Item::ForeignMod(item)),
+ RustItem::Use(item) => Ok(Item::Use(item)),
+ other => Ok(Item::Other(other)),
+ }
+ }
+}
diff --git a/syntax/parse.rs b/syntax/parse.rs
index e195081..117d025 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -1,4 +1,5 @@
use crate::syntax::discriminant::DiscriminantSet;
+use crate::syntax::file::Item;
use crate::syntax::report::Errors;
use crate::syntax::Atom::*;
use crate::syntax::{
@@ -11,7 +12,7 @@
use syn::punctuated::Punctuated;
use syn::{
Abi, Attribute, Error, Fields, FnArg, ForeignItem, ForeignItemFn, ForeignItemType,
- GenericArgument, Ident, Item, ItemEnum, ItemForeignMod, ItemStruct, LitStr, Pat, PathArguments,
+ GenericArgument, Ident, ItemEnum, ItemForeignMod, ItemStruct, LitStr, Pat, PathArguments,
Result, ReturnType, Token, Type as RustType, TypeBareFn, TypePath, TypeReference, TypeSlice,
};
@@ -33,7 +34,7 @@
},
Item::ForeignMod(foreign_mod) => parse_foreign_mod(cx, foreign_mod, &mut apis),
Item::Use(item) => cx.error(item, error::USE_NOT_ALLOWED),
- _ => cx.error(item, "unsupported item"),
+ Item::Other(item) => cx.error(item, "unsupported item"),
}
}
apis