Skip to content

Commit 05ef6ff

Browse files
committed
Data structure to represent possibly unsafe module
1 parent 5e668bc commit 05ef6ff

File tree

4 files changed

+59
-11
lines changed

4 files changed

+59
-11
lines changed

macro/src/expand.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
use crate::syntax::atom::Atom::{self, *};
2+
use crate::syntax::file::Module;
23
use crate::syntax::namespace::Namespace;
34
use crate::syntax::report::Errors;
45
use crate::syntax::symbol::Symbol;
56
use crate::syntax::{
67
self, check, mangle, Api, Enum, ExternFn, ExternType, Signature, Struct, Type, TypeAlias, Types,
78
};
8-
use proc_macro2::{Ident, Span, TokenStream};
9+
use proc_macro2::{Ident, TokenStream};
910
use quote::{format_ident, quote, quote_spanned, ToTokens};
10-
use syn::{parse_quote, Error, ItemMod, Result, Token};
11+
use std::mem;
12+
use syn::{parse_quote, Result, Token};
1113

12-
pub fn bridge(namespace: &Namespace, mut ffi: ItemMod) -> Result<TokenStream> {
14+
pub fn bridge(namespace: &Namespace, mut ffi: Module) -> Result<TokenStream> {
1315
let ref mut errors = Errors::new();
14-
let content = ffi.content.take().ok_or(Error::new(
15-
Span::call_site(),
16-
"#[cxx::bridge] module must have inline contents",
17-
))?;
18-
let ref apis = syntax::parse_items(errors, content.1);
16+
let content = mem::take(&mut ffi.content);
17+
let ref apis = syntax::parse_items(errors, content);
1918
let ref types = Types::collect(errors, apis);
2019
errors.propagate()?;
2120
check::typecheck(errors, namespace, apis, types);
@@ -24,7 +23,7 @@ pub fn bridge(namespace: &Namespace, mut ffi: ItemMod) -> Result<TokenStream> {
2423
Ok(expand(namespace, ffi, apis, types))
2524
}
2625

27-
fn expand(namespace: &Namespace, ffi: ItemMod, apis: &[Api], types: &Types) -> TokenStream {
26+
fn expand(namespace: &Namespace, ffi: Module, apis: &[Api], types: &Types) -> TokenStream {
2827
let mut expanded = TokenStream::new();
2928
let mut hidden = TokenStream::new();
3029

macro/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ mod expand;
1313
mod syntax;
1414
mod type_id;
1515

16+
use crate::syntax::file::Module;
1617
use crate::syntax::namespace::Namespace;
1718
use proc_macro::TokenStream;
18-
use syn::{parse_macro_input, ItemMod, LitStr};
19+
use syn::{parse_macro_input, LitStr};
1920

2021
/// `#[cxx::bridge] mod ffi { ... }`
2122
///
@@ -39,7 +40,7 @@ pub fn bridge(args: TokenStream, input: TokenStream) -> TokenStream {
3940
let _ = syntax::error::ERRORS;
4041

4142
let namespace = parse_macro_input!(args as Namespace);
42-
let ffi = parse_macro_input!(input as ItemMod);
43+
let ffi = parse_macro_input!(input as Module);
4344

4445
expand::bridge(&namespace, ffi)
4546
.unwrap_or_else(|err| err.to_compile_error())

syntax/file.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use proc_macro2::Span;
2+
use syn::parse::{Error, Parse, ParseStream, Result};
3+
use syn::{braced, token, Attribute, Ident, Item, Token, Visibility};
4+
5+
pub struct Module {
6+
pub attrs: Vec<Attribute>,
7+
pub vis: Visibility,
8+
// TODO: unsafety
9+
pub mod_token: Token![mod],
10+
pub ident: Ident,
11+
pub brace_token: token::Brace,
12+
pub content: Vec<Item>,
13+
}
14+
15+
impl Parse for Module {
16+
fn parse(input: ParseStream) -> Result<Self> {
17+
let mut attrs = input.call(Attribute::parse_outer)?;
18+
let vis: Visibility = input.parse()?;
19+
let mod_token: Token![mod] = input.parse()?;
20+
let ident: Ident = input.parse()?;
21+
22+
if input.peek(Token![;]) {
23+
return Err(Error::new(
24+
Span::call_site(),
25+
"#[cxx::bridge] module must have inline contents",
26+
))?;
27+
}
28+
29+
let content;
30+
let brace_token = braced!(content in input);
31+
attrs.extend(content.call(Attribute::parse_inner)?);
32+
33+
let mut items = Vec::new();
34+
while !content.is_empty() {
35+
items.push(content.parse()?);
36+
}
37+
38+
Ok(Module {
39+
attrs,
40+
vis,
41+
mod_token,
42+
ident,
43+
brace_token,
44+
content: items,
45+
})
46+
}
47+
}

syntax/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ mod derive;
77
mod discriminant;
88
mod doc;
99
pub mod error;
10+
pub mod file;
1011
pub mod ident;
1112
mod impls;
1213
pub mod mangle;

0 commit comments

Comments
 (0)