Skip to content

Commit 71b34be

Browse files
authored
Merge pull request #380 from adetaylor/namespaces-syntax-update
Switch to #[namespace = A::B] syntax.
2 parents d60c07b + 3e5cff4 commit 71b34be

File tree

7 files changed

+33
-27
lines changed

7 files changed

+33
-27
lines changed

gen/src/file.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,6 @@ fn parse_args(attr: &Attribute) -> Result<Namespace> {
6767
if attr.tokens.is_empty() {
6868
Ok(Namespace::none())
6969
} else {
70-
attr.parse_args()
70+
attr.parse_args_with(Namespace::parse_bridge_attr_namespace)
7171
}
7272
}

macro/src/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::syntax::file::Module;
1818
use crate::syntax::namespace::Namespace;
1919
use crate::syntax::qualified::QualifiedName;
2020
use proc_macro::TokenStream;
21-
use syn::parse::{Parse, ParseStream, Result};
21+
use syn::parse::{Parse, ParseStream, Parser, Result};
2222
use syn::parse_macro_input;
2323

2424
/// `#[cxx::bridge] mod ffi { ... }`
@@ -42,7 +42,10 @@ use syn::parse_macro_input;
4242
pub fn bridge(args: TokenStream, input: TokenStream) -> TokenStream {
4343
let _ = syntax::error::ERRORS;
4444

45-
let namespace = parse_macro_input!(args as Namespace);
45+
let namespace = match Namespace::parse_bridge_attr_namespace.parse(args) {
46+
Ok(ns) => ns,
47+
Err(err) => return err.to_compile_error().into(),
48+
};
4649
let mut ffi = parse_macro_input!(input as Module);
4750
ffi.namespace = namespace;
4851

syntax/attrs.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ fn parse_function_alias_attribute(input: ParseStream) -> Result<Ident> {
132132
}
133133

134134
fn parse_namespace_attribute(input: ParseStream) -> Result<Namespace> {
135-
let content;
136-
syn::parenthesized!(content in input);
137-
let namespace = content.parse::<Namespace>()?;
135+
input.parse::<Token![=]>()?;
136+
let namespace = input.parse::<Namespace>()?;
138137
Ok(namespace)
139138
}

syntax/namespace.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,23 @@ impl Namespace {
2424
pub fn iter(&self) -> Iter<Ident> {
2525
self.segments.iter()
2626
}
27+
28+
pub fn parse_bridge_attr_namespace(input: ParseStream) -> Result<Namespace> {
29+
if input.is_empty() {
30+
return Ok(Namespace::none());
31+
}
32+
33+
input.parse::<kw::namespace>()?;
34+
input.parse::<Token![=]>()?;
35+
let ns = input.parse::<Namespace>()?;
36+
input.parse::<Option<Token![,]>>()?;
37+
Ok(ns)
38+
}
2739
}
2840

2941
impl Parse for Namespace {
3042
fn parse(input: ParseStream) -> Result<Self> {
31-
let mut segments = Vec::new();
32-
if !input.is_empty() {
33-
input.parse::<kw::namespace>()?;
34-
input.parse::<Token![=]>()?;
35-
segments = input
36-
.call(QualifiedName::parse_quoted_or_unquoted)?
37-
.segments;
38-
input.parse::<Option<Token![,]>>()?;
39-
}
43+
let segments = QualifiedName::parse_quoted_or_unquoted(input)?.segments;
4044
Ok(Namespace { segments })
4145
}
4246
}

tests/ffi/class_in_ns.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ pub mod ffi3 {
1010
extern "C" {
1111
include!("tests/ffi/tests.h");
1212

13-
#[namespace (namespace = I)]
13+
#[namespace = "I"]
1414
type I;
1515

1616
fn get(self: &I) -> u32;
1717

18-
#[namespace (namespace = I)]
18+
#[namespace = "I"]
1919
fn ns_c_return_unique_ptr_ns() -> UniquePtr<I>;
2020
}
2121
}

tests/ffi/extra.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ pub mod ffi2 {
2020

2121
type D = crate::other::D;
2222
type E = crate::other::E;
23-
#[namespace (namespace = F)]
23+
#[namespace = "F"]
2424
type F = crate::other::f::F;
25-
#[namespace (namespace = G)]
25+
#[namespace = "G"]
2626
type G = crate::other::G;
2727

28-
#[namespace(namespace = H)]
28+
#[namespace = "H"]
2929
type H;
3030

3131
fn c_take_trivial_ptr(d: UniquePtr<D>);
@@ -47,9 +47,9 @@ pub mod ffi2 {
4747
fn c_return_ns_unique_ptr() -> UniquePtr<H>;
4848
fn c_take_ref_ns_c(h: &H);
4949

50-
#[namespace (namespace = other)]
50+
#[namespace = "other"]
5151
fn ns_c_take_trivial(d: D);
52-
#[namespace (namespace = other)]
52+
#[namespace = "other"]
5353
fn ns_c_return_trivial() -> D;
5454
}
5555
}

tests/ffi/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,27 +76,27 @@ pub mod ffi {
7676
CVal,
7777
}
7878

79-
#[namespace(namespace = A)]
79+
#[namespace = "A"]
8080
#[derive(Clone)]
8181
struct AShared {
8282
z: usize,
8383
}
8484

85-
#[namespace(namespace = A)]
85+
#[namespace = "A"]
8686
enum AEnum {
8787
AAVal,
8888
ABVal = 2020,
8989
ACVal,
9090
}
9191

92-
#[namespace(namespace = A::B)]
92+
#[namespace = "A::B"]
9393
enum ABEnum {
9494
ABAVal,
9595
ABBVal = 2020,
9696
ABCVal,
9797
}
9898

99-
#[namespace(namespace = A::B)]
99+
#[namespace = "A::B"]
100100
#[derive(Clone)]
101101
struct ABShared {
102102
z: usize,
@@ -201,7 +201,7 @@ pub mod ffi {
201201
#[rust_name = "str_overloaded_function"]
202202
fn cOverloadedFunction(x: &str) -> String;
203203

204-
#[namespace (namespace = other)]
204+
#[namespace = "other"]
205205
fn ns_c_take_ns_shared(shared: AShared);
206206
}
207207

0 commit comments

Comments
 (0)