blob: 22432356d22886f93b94169ecf064b8fa1a82f09 [file] [log] [blame]
David Tolnay3c64a4e2020-08-29 14:07:38 -07001use crate::syntax::namespace::Namespace;
2use quote::quote;
David Tolnay05ef6ff2020-08-29 11:27:05 -07003use syn::parse::{Error, Parse, ParseStream, Result};
4use syn::{braced, token, Attribute, Ident, Item, Token, Visibility};
5
6pub struct Module {
David Tolnay3c64a4e2020-08-29 14:07:38 -07007 pub namespace: Namespace,
David Tolnay05ef6ff2020-08-29 11:27:05 -07008 pub attrs: Vec<Attribute>,
9 pub vis: Visibility,
David Tolnay633f5662020-08-29 14:47:45 -070010 pub unsafety: Option<Token![unsafe]>,
David Tolnay05ef6ff2020-08-29 11:27:05 -070011 pub mod_token: Token![mod],
12 pub ident: Ident,
13 pub brace_token: token::Brace,
14 pub content: Vec<Item>,
15}
16
17impl Parse for Module {
18 fn parse(input: ParseStream) -> Result<Self> {
David Tolnay3c64a4e2020-08-29 14:07:38 -070019 let namespace = Namespace::none();
David Tolnay05ef6ff2020-08-29 11:27:05 -070020 let mut attrs = input.call(Attribute::parse_outer)?;
21 let vis: Visibility = input.parse()?;
David Tolnay633f5662020-08-29 14:47:45 -070022 let unsafety: Option<Token![unsafe]> = input.parse()?;
David Tolnay05ef6ff2020-08-29 11:27:05 -070023 let mod_token: Token![mod] = input.parse()?;
24 let ident: Ident = input.parse()?;
25
David Tolnay3c64a4e2020-08-29 14:07:38 -070026 let semi: Option<Token![;]> = input.parse()?;
27 if let Some(semi) = semi {
28 let span = quote!(#vis #mod_token #semi);
29 return Err(Error::new_spanned(
30 span,
David Tolnay05ef6ff2020-08-29 11:27:05 -070031 "#[cxx::bridge] module must have inline contents",
32 ))?;
33 }
34
35 let content;
36 let brace_token = braced!(content in input);
37 attrs.extend(content.call(Attribute::parse_inner)?);
38
39 let mut items = Vec::new();
40 while !content.is_empty() {
41 items.push(content.parse()?);
42 }
43
44 Ok(Module {
David Tolnay3c64a4e2020-08-29 14:07:38 -070045 namespace,
David Tolnay05ef6ff2020-08-29 11:27:05 -070046 attrs,
47 vis,
David Tolnay633f5662020-08-29 14:47:45 -070048 unsafety,
David Tolnay05ef6ff2020-08-29 11:27:05 -070049 mod_token,
50 ident,
51 brace_token,
52 content: items,
53 })
54 }
55}