22
33use std:: ops:: Deref ;
44
5- use syn:: punctuated:: Punctuated ;
6- use syn:: visit:: Visit ;
7-
8- use crate :: {
9- Abi ,
10- BoxStr ,
11- Const ,
12- Field ,
13- Fn ,
14- Parameter ,
15- Static ,
16- Struct ,
17- Type ,
18- Union ,
5+ use syn:: {
6+ Attribute , Expr , ExprLit , Fields , FnArg , ForeignItem , ForeignItemFn , ForeignItemStatic ,
7+ ItemConst , ItemForeignMod , ItemStruct , ItemType , ItemUnion , Lit , Meta , MetaNameValue , Pat ,
8+ ReturnType , punctuated:: Punctuated , visit:: Visit ,
199} ;
2010
11+ use crate :: { Abi , BoxStr , Const , Field , Fn , Parameter , Static , Struct , Type , Union } ;
12+
2113/// Represents a collected set of top-level Rust items relevant to FFI generation or analysis.
2214///
2315/// Includes foreign functions/statics, type aliases, structs, unions, and constants.
@@ -105,7 +97,7 @@ fn collect_fields(fields: &Punctuated<syn::Field, syn::Token![,]>) -> Vec<Field>
10597 . collect ( )
10698}
10799
108- fn extract_single_link_name ( attrs : & [ syn :: Attribute ] ) -> Option < BoxStr > {
100+ fn extract_single_link_name ( attrs : & [ Attribute ] ) -> Option < BoxStr > {
109101 let mut link_name_iter = attrs
110102 . iter ( )
111103 . filter ( |attr| attr. path ( ) . is_ident ( "link_name" ) ) ;
@@ -115,17 +107,17 @@ fn extract_single_link_name(attrs: &[syn::Attribute]) -> Option<BoxStr> {
115107 panic ! ( "multiple `#[link_name = ...]` attributes found: {attr:?}" ) ;
116108 }
117109
118- if let syn :: Meta :: NameValue ( nv ) = & link_name. meta
119- && let syn :: Expr :: Lit ( expr_lit ) = & nv . value
120- && let syn :: Lit :: Str ( lit_str) = & expr_lit . lit
110+ if let Meta :: NameValue ( MetaNameValue { value , .. } ) = & link_name. meta
111+ && let Expr :: Lit ( ExprLit { lit , .. } ) = value
112+ && let Lit :: Str ( lit_str) = lit
121113 {
122114 return Some ( lit_str. value ( ) . into_boxed_str ( ) ) ;
123115 }
124116
125117 panic ! ( "unrecognized `link_name` syntax: {link_name:?}" ) ;
126118}
127119
128- fn visit_foreign_item_fn ( table : & mut FfiItems , i : & syn :: ForeignItemFn , abi : & Abi ) {
120+ fn visit_foreign_item_fn ( table : & mut FfiItems , i : & ForeignItemFn , abi : & Abi ) {
129121 let public = is_visible ( & i. vis ) ;
130122 let abi = abi. clone ( ) ;
131123 let ident = i. sig . ident . to_string ( ) . into_boxed_str ( ) ;
@@ -134,23 +126,22 @@ fn visit_foreign_item_fn(table: &mut FfiItems, i: &syn::ForeignItemFn, abi: &Abi
134126 . inputs
135127 . iter ( )
136128 . map ( |arg| match arg {
137- syn:: FnArg :: Typed ( arg) => Parameter {
138- ident : match arg. pat . deref ( ) {
139- syn:: Pat :: Ident ( i) => i. ident . to_string ( ) . into_boxed_str ( ) ,
140- _ => {
141- unimplemented ! ( "Foreign functions are unlikely to have any other pattern." )
142- }
129+ FnArg :: Typed ( arg) => Parameter {
130+ ident : if let Pat :: Ident ( i) = arg. pat . deref ( ) {
131+ i. ident . to_string ( ) . into_boxed_str ( )
132+ } else {
133+ unimplemented ! ( "Foreign functions are unlikely to have any other pattern." ) ;
143134 } ,
144135 ty : arg. ty . deref ( ) . clone ( ) ,
145136 } ,
146- syn :: FnArg :: Receiver ( _) => {
137+ FnArg :: Receiver ( _) => {
147138 unreachable ! ( "Foreign functions can't have self/receiver parameters." )
148139 }
149140 } )
150- . collect :: < Vec < _ > > ( ) ;
141+ . collect ( ) ;
151142 let return_type = match & i. sig . output {
152- syn :: ReturnType :: Default => None ,
153- syn :: ReturnType :: Type ( _, ty) => Some ( ty. deref ( ) . clone ( ) ) ,
143+ ReturnType :: Default => None ,
144+ ReturnType :: Type ( _, ty) => Some ( ty. deref ( ) . clone ( ) ) ,
154145 } ;
155146 let link_name = extract_single_link_name ( & i. attrs ) ;
156147
@@ -164,7 +155,7 @@ fn visit_foreign_item_fn(table: &mut FfiItems, i: &syn::ForeignItemFn, abi: &Abi
164155 } ) ;
165156}
166157
167- fn visit_foreign_item_static ( table : & mut FfiItems , i : & syn :: ForeignItemStatic , abi : & Abi ) {
158+ fn visit_foreign_item_static ( table : & mut FfiItems , i : & ForeignItemStatic , abi : & Abi ) {
168159 let public = is_visible ( & i. vis ) ;
169160 let abi = abi. clone ( ) ;
170161 let ident = i. ident . to_string ( ) . into_boxed_str ( ) ;
@@ -181,21 +172,21 @@ fn visit_foreign_item_static(table: &mut FfiItems, i: &syn::ForeignItemStatic, a
181172}
182173
183174impl < ' ast > Visit < ' ast > for FfiItems {
184- fn visit_item_type ( & mut self , i : & ' ast syn :: ItemType ) {
175+ fn visit_item_type ( & mut self , i : & ' ast ItemType ) {
185176 let public = is_visible ( & i. vis ) ;
186177 let ty = i. ty . deref ( ) . clone ( ) ;
187178 let ident = i. ident . to_string ( ) . into_boxed_str ( ) ;
188179
189180 self . aliases . push ( Type { public, ident, ty } ) ;
190181 }
191182
192- fn visit_item_struct ( & mut self , i : & ' ast syn :: ItemStruct ) {
183+ fn visit_item_struct ( & mut self , i : & ' ast ItemStruct ) {
193184 let public = is_visible ( & i. vis ) ;
194185 let ident = i. ident . to_string ( ) . into_boxed_str ( ) ;
195186 let fields = match & i. fields {
196- syn :: Fields :: Named ( fields) => collect_fields ( & fields. named ) ,
197- syn :: Fields :: Unnamed ( fields ) => collect_fields ( & fields . unnamed ) ,
198- syn :: Fields :: Unit => Vec :: new ( ) ,
187+ Fields :: Named ( fields) => collect_fields ( & fields. named ) ,
188+ Fields :: Unnamed ( _ ) => Vec :: new ( ) ,
189+ Fields :: Unit => Vec :: new ( ) ,
199190 } ;
200191
201192 self . structs . push ( Struct {
@@ -205,7 +196,7 @@ impl<'ast> Visit<'ast> for FfiItems {
205196 } ) ;
206197 }
207198
208- fn visit_item_union ( & mut self , i : & ' ast syn :: ItemUnion ) {
199+ fn visit_item_union ( & mut self , i : & ' ast ItemUnion ) {
209200 let public = is_visible ( & i. vis ) ;
210201 let ident = i. ident . to_string ( ) . into_boxed_str ( ) ;
211202 let fields = collect_fields ( & i. fields . named ) ;
@@ -217,15 +208,15 @@ impl<'ast> Visit<'ast> for FfiItems {
217208 } ) ;
218209 }
219210
220- fn visit_item_const ( & mut self , i : & ' ast syn :: ItemConst ) {
211+ fn visit_item_const ( & mut self , i : & ' ast ItemConst ) {
221212 let public = is_visible ( & i. vis ) ;
222213 let ident = i. ident . to_string ( ) . into_boxed_str ( ) ;
223214 let ty = i. ty . deref ( ) . clone ( ) ;
224215
225216 self . constants . push ( Const { public, ident, ty } ) ;
226217 }
227218
228- fn visit_item_foreign_mod ( & mut self , i : & ' ast syn :: ItemForeignMod ) {
219+ fn visit_item_foreign_mod ( & mut self , i : & ' ast ItemForeignMod ) {
229220 // Because we need to store the ABI we can't directly visit the foreign
230221 // functions/statics.
231222
@@ -235,12 +226,12 @@ impl<'ast> Visit<'ast> for FfiItems {
235226 . name
236227 . clone ( )
237228 . map ( |s| Abi :: from ( s. value ( ) . as_str ( ) ) )
238- . unwrap_or_else ( || Abi :: C ) ;
229+ . unwrap_or ( Abi :: C ) ;
239230
240231 for item in & i. items {
241232 match item {
242- syn :: ForeignItem :: Fn ( function) => visit_foreign_item_fn ( self , function, & abi) ,
243- syn :: ForeignItem :: Static ( static_variable) => {
233+ ForeignItem :: Fn ( function) => visit_foreign_item_fn ( self , function, & abi) ,
234+ ForeignItem :: Static ( static_variable) => {
244235 visit_foreign_item_static ( self , static_variable, & abi)
245236 }
246237 _ => ( ) ,
0 commit comments