File tree Expand file tree Collapse file tree 7 files changed +33
-27
lines changed Expand file tree Collapse file tree 7 files changed +33
-27
lines changed Original file line number Diff line number Diff line change @@ -67,6 +67,6 @@ fn parse_args(attr: &Attribute) -> Result<Namespace> {
67
67
if attr. tokens . is_empty ( ) {
68
68
Ok ( Namespace :: none ( ) )
69
69
} else {
70
- attr. parse_args ( )
70
+ attr. parse_args_with ( Namespace :: parse_bridge_attr_namespace )
71
71
}
72
72
}
Original file line number Diff line number Diff line change @@ -18,7 +18,7 @@ use crate::syntax::file::Module;
18
18
use crate :: syntax:: namespace:: Namespace ;
19
19
use crate :: syntax:: qualified:: QualifiedName ;
20
20
use proc_macro:: TokenStream ;
21
- use syn:: parse:: { Parse , ParseStream , Result } ;
21
+ use syn:: parse:: { Parse , ParseStream , Parser , Result } ;
22
22
use syn:: parse_macro_input;
23
23
24
24
/// `#[cxx::bridge] mod ffi { ... }`
@@ -42,7 +42,10 @@ use syn::parse_macro_input;
42
42
pub fn bridge ( args : TokenStream , input : TokenStream ) -> TokenStream {
43
43
let _ = syntax:: error:: ERRORS ;
44
44
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
+ } ;
46
49
let mut ffi = parse_macro_input ! ( input as Module ) ;
47
50
ffi. namespace = namespace;
48
51
Original file line number Diff line number Diff line change @@ -132,8 +132,7 @@ fn parse_function_alias_attribute(input: ParseStream) -> Result<Ident> {
132
132
}
133
133
134
134
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 > ( ) ?;
138
137
Ok ( namespace)
139
138
}
Original file line number Diff line number Diff line change @@ -24,19 +24,23 @@ impl Namespace {
24
24
pub fn iter ( & self ) -> Iter < Ident > {
25
25
self . segments . iter ( )
26
26
}
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
+ }
27
39
}
28
40
29
41
impl Parse for Namespace {
30
42
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 ;
40
44
Ok ( Namespace { segments } )
41
45
}
42
46
}
Original file line number Diff line number Diff line change @@ -10,12 +10,12 @@ pub mod ffi3 {
10
10
extern "C" {
11
11
include ! ( "tests/ffi/tests.h" ) ;
12
12
13
- #[ namespace ( namespace = I ) ]
13
+ #[ namespace = "I" ]
14
14
type I ;
15
15
16
16
fn get ( self : & I ) -> u32 ;
17
17
18
- #[ namespace ( namespace = I ) ]
18
+ #[ namespace = "I" ]
19
19
fn ns_c_return_unique_ptr_ns ( ) -> UniquePtr < I > ;
20
20
}
21
21
}
Original file line number Diff line number Diff line change @@ -20,12 +20,12 @@ pub mod ffi2 {
20
20
21
21
type D = crate :: other:: D ;
22
22
type E = crate :: other:: E ;
23
- #[ namespace ( namespace = F ) ]
23
+ #[ namespace = "F" ]
24
24
type F = crate :: other:: f:: F ;
25
- #[ namespace ( namespace = G ) ]
25
+ #[ namespace = "G" ]
26
26
type G = crate :: other:: G ;
27
27
28
- #[ namespace( namespace = H ) ]
28
+ #[ namespace = "H" ]
29
29
type H ;
30
30
31
31
fn c_take_trivial_ptr ( d : UniquePtr < D > ) ;
@@ -47,9 +47,9 @@ pub mod ffi2 {
47
47
fn c_return_ns_unique_ptr ( ) -> UniquePtr < H > ;
48
48
fn c_take_ref_ns_c ( h : & H ) ;
49
49
50
- #[ namespace ( namespace = other) ]
50
+ #[ namespace = " other" ]
51
51
fn ns_c_take_trivial ( d : D ) ;
52
- #[ namespace ( namespace = other) ]
52
+ #[ namespace = " other" ]
53
53
fn ns_c_return_trivial ( ) -> D ;
54
54
}
55
55
}
Original file line number Diff line number Diff line change @@ -76,27 +76,27 @@ pub mod ffi {
76
76
CVal ,
77
77
}
78
78
79
- #[ namespace( namespace = A ) ]
79
+ #[ namespace = "A" ]
80
80
#[ derive( Clone ) ]
81
81
struct AShared {
82
82
z : usize ,
83
83
}
84
84
85
- #[ namespace( namespace = A ) ]
85
+ #[ namespace = "A" ]
86
86
enum AEnum {
87
87
AAVal ,
88
88
ABVal = 2020 ,
89
89
ACVal ,
90
90
}
91
91
92
- #[ namespace( namespace = A :: B ) ]
92
+ #[ namespace = " A::B" ]
93
93
enum ABEnum {
94
94
ABAVal ,
95
95
ABBVal = 2020 ,
96
96
ABCVal ,
97
97
}
98
98
99
- #[ namespace( namespace = A :: B ) ]
99
+ #[ namespace = " A::B" ]
100
100
#[ derive( Clone ) ]
101
101
struct ABShared {
102
102
z : usize ,
@@ -201,7 +201,7 @@ pub mod ffi {
201
201
#[ rust_name = "str_overloaded_function" ]
202
202
fn cOverloadedFunction ( x : & str ) -> String ;
203
203
204
- #[ namespace ( namespace = other) ]
204
+ #[ namespace = " other" ]
205
205
fn ns_c_take_ns_shared ( shared : AShared ) ;
206
206
}
207
207
You can’t perform that action at this time.
0 commit comments