@@ -11,6 +11,7 @@ use quote::ToTokens;
11
11
use shared;
12
12
use syn;
13
13
use syn:: parse:: { Parse , ParseStream , Result as SynResult } ;
14
+ use syn:: spanned:: Spanned ;
14
15
15
16
thread_local ! ( static ATTRS : AttributeParseState = Default :: default ( ) ) ;
16
17
@@ -34,7 +35,7 @@ macro_rules! attrgen {
34
35
( constructor, Constructor ( Span ) ) ,
35
36
( method, Method ( Span ) ) ,
36
37
( static_method_of, StaticMethodOf ( Span , Ident ) ) ,
37
- ( js_namespace, JsNamespace ( Span , Ident ) ) ,
38
+ ( js_namespace, JsNamespace ( Span , Vec < String > , Vec < Span > ) ) ,
38
39
( module, Module ( Span , String , Span ) ) ,
39
40
( raw_module, RawModule ( Span , String , Span ) ) ,
40
41
( inline_js, InlineJs ( Span , String , Span ) ) ,
@@ -116,6 +117,21 @@ macro_rules! methods {
116
117
}
117
118
} ;
118
119
120
+ ( @method $name: ident, $variant: ident( Span , Vec <String >, Vec <Span >) ) => {
121
+ fn $name( & self ) -> Option <( & [ String ] , & [ Span ] ) > {
122
+ self . attrs
123
+ . iter( )
124
+ . filter_map( |a| match & a. 1 {
125
+ BindgenAttr :: $variant( _, ss, spans) => {
126
+ a. 0 . set( true ) ;
127
+ Some ( ( & ss[ ..] , & spans[ ..] ) )
128
+ }
129
+ _ => None ,
130
+ } )
131
+ . next( )
132
+ }
133
+ } ;
134
+
119
135
( @method $name: ident, $variant: ident( Span , $( $other: tt) * ) ) => {
120
136
#[ allow( unused) ]
121
137
fn $name( & self ) -> Option <& $( $other) * > {
@@ -280,6 +296,36 @@ impl Parse for BindgenAttr {
280
296
} ;
281
297
return Ok ( BindgenAttr :: $variant( attr_span, val, span) )
282
298
} ) ;
299
+
300
+ ( @parser $variant: ident( Span , Vec <String >, Vec <Span >) ) => ( {
301
+ input. parse:: <Token ![ =] >( ) ?;
302
+ let input_before_parse = input. fork( ) ;
303
+ let ( vals, spans) = match input. parse:: <syn:: ExprArray >( ) {
304
+ Ok ( exprs) => {
305
+ let mut vals = vec![ ] ;
306
+ let mut spans = vec![ ] ;
307
+
308
+ for expr in exprs. elems. iter( ) {
309
+ if let syn:: Expr :: Lit ( syn:: ExprLit {
310
+ lit: syn:: Lit :: Str ( ref str ) ,
311
+ ..
312
+ } ) = expr {
313
+ vals. push( str . value( ) ) ;
314
+ spans. push( str . span( ) ) ;
315
+ } else {
316
+ return Err ( syn:: Error :: new( expr. span( ) , "expected string literals" ) ) ;
317
+ }
318
+ }
319
+
320
+ ( vals, spans)
321
+ } ,
322
+ Err ( _) => {
323
+ let ident = input_before_parse. parse:: <AnyIdent >( ) ?. 0 ;
324
+ ( vec![ ident. to_string( ) ] , vec![ ident. span( ) ] )
325
+ }
326
+ } ;
327
+ return Ok ( BindgenAttr :: $variant( attr_span, vals, spans) )
328
+ } ) ;
283
329
}
284
330
285
331
attrgen ! ( parsers) ;
@@ -1270,7 +1316,7 @@ impl MacroParse<ast::ImportModule> for syn::ForeignItem {
1270
1316
} ;
1271
1317
BindgenAttrs :: find ( attrs) ?
1272
1318
} ;
1273
- let js_namespace = item_opts. js_namespace ( ) . cloned ( ) ;
1319
+ let js_namespace = item_opts. js_namespace ( ) . map ( | ( s , _ ) | s . to_owned ( ) ) ;
1274
1320
let kind = match self {
1275
1321
syn:: ForeignItem :: Fn ( f) => f. convert ( ( item_opts, & module) ) ?,
1276
1322
syn:: ForeignItem :: Type ( t) => t. convert ( item_opts) ?,
0 commit comments