@@ -3,7 +3,7 @@ use quote::quote;
3
3
use syn:: parse:: { Error , Parse , ParseStream , Result } ;
4
4
use syn:: {
5
5
braced, token, Abi , Attribute , ForeignItem , Ident , Item as RustItem , ItemEnum , ItemStruct ,
6
- ItemUse , Token , Visibility ,
6
+ ItemUse , LitStr , Token , Visibility ,
7
7
} ;
8
8
9
9
pub struct Module {
@@ -75,18 +75,31 @@ impl Parse for Module {
75
75
76
76
impl Parse for Item {
77
77
fn parse ( input : ParseStream ) -> Result < Self > {
78
+ let attrs = input. call ( Attribute :: parse_outer) ?;
79
+
80
+ let ahead = input. fork ( ) ;
81
+ let unsafety = if ahead. parse :: < Option < Token ! [ unsafe ] > > ( ) ?. is_some ( )
82
+ && ahead. parse :: < Option < Token ! [ extern] > > ( ) ?. is_some ( )
83
+ && ahead. parse :: < Option < LitStr > > ( ) . is_ok ( )
84
+ && ahead. peek ( token:: Brace )
85
+ {
86
+ Some ( input. parse ( ) ?)
87
+ } else {
88
+ None
89
+ } ;
90
+
78
91
let item = input. parse ( ) ?;
79
92
match item {
80
- RustItem :: Struct ( item) => Ok ( Item :: Struct ( item) ) ,
81
- RustItem :: Enum ( item) => Ok ( Item :: Enum ( item) ) ,
93
+ RustItem :: Struct ( item) => Ok ( Item :: Struct ( ItemStruct { attrs , .. item } ) ) ,
94
+ RustItem :: Enum ( item) => Ok ( Item :: Enum ( ItemEnum { attrs , .. item } ) ) ,
82
95
RustItem :: ForeignMod ( item) => Ok ( Item :: ForeignMod ( ItemForeignMod {
83
96
attrs : item. attrs ,
84
- unsafety : None ,
97
+ unsafety,
85
98
abi : item. abi ,
86
99
brace_token : item. brace_token ,
87
100
items : item. items ,
88
101
} ) ) ,
89
- RustItem :: Use ( item) => Ok ( Item :: Use ( item) ) ,
102
+ RustItem :: Use ( item) => Ok ( Item :: Use ( ItemUse { attrs , .. item } ) ) ,
90
103
other => Ok ( Item :: Other ( other) ) ,
91
104
}
92
105
}
0 commit comments