@@ -17,7 +17,7 @@ mod llvm_enzyme {
17
17
use rustc_ast:: visit:: AssocCtxt :: * ;
18
18
use rustc_ast:: {
19
19
self as ast, AssocItemKind , BindingMode , FnRetTy , FnSig , Generics , ItemKind , MetaItemInner ,
20
- PatKind , TyKind ,
20
+ PatKind , TyKind , Visibility ,
21
21
} ;
22
22
use rustc_expand:: base:: { Annotatable , ExtCtxt } ;
23
23
use rustc_span:: { Ident , Span , Symbol , kw, sym} ;
@@ -54,6 +54,16 @@ mod llvm_enzyme {
54
54
first_ident ( x) . name . to_string ( )
55
55
}
56
56
57
+ // Get information about the function the macro is applied to
58
+ fn extract_item_info ( iitem : & P < ast:: Item > ) -> Option < ( Visibility , FnSig , Ident ) > {
59
+ match & iitem. kind {
60
+ ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
61
+ Some ( ( iitem. vis . clone ( ) , sig. clone ( ) , ident. clone ( ) ) )
62
+ }
63
+ _ => None ,
64
+ }
65
+ }
66
+
57
67
pub ( crate ) fn from_ast (
58
68
ecx : & mut ExtCtxt < ' _ > ,
59
69
meta_item : & ThinVec < MetaItemInner > ,
@@ -147,49 +157,24 @@ mod llvm_enzyme {
147
157
let dcx = ecx. sess . dcx ( ) ;
148
158
149
159
// first get information about the annotable item:
150
- let ( sig, vis, primal) = match & item {
151
- Annotatable :: Item ( iitem) => {
152
- let ( sig, ident) = match & iitem. kind {
153
- ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => ( sig, ident) ,
154
- _ => {
155
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
156
- return vec ! [ item] ;
157
- }
158
- } ;
159
- ( sig. clone ( ) , iitem. vis . clone ( ) , ident. clone ( ) )
160
- }
160
+ let Some ( ( vis, sig, primal) ) = ( match & item {
161
+ Annotatable :: Item ( iitem) => extract_item_info ( iitem) ,
162
+ Annotatable :: Stmt ( stmt) => match & stmt. kind {
163
+ ast:: StmtKind :: Item ( iitem) => extract_item_info ( iitem) ,
164
+ _ => None ,
165
+ } ,
161
166
Annotatable :: AssocItem ( assoc_item, Impl { of_trait : false } ) => {
162
- let ( sig, ident) = match & assoc_item. kind {
163
- ast:: AssocItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => ( sig, ident) ,
164
- _ => {
165
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
166
- return vec ! [ item] ;
167
+ match & assoc_item. kind {
168
+ ast:: AssocItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
169
+ Some ( ( assoc_item. vis . clone ( ) , sig. clone ( ) , ident. clone ( ) ) )
167
170
}
168
- } ;
169
- ( sig. clone ( ) , assoc_item. vis . clone ( ) , ident. clone ( ) )
170
- }
171
- Annotatable :: Stmt ( stmt) => {
172
- let ( sig, vis, ident) = match & stmt. kind {
173
- ast:: StmtKind :: Item ( iitem) => match & iitem. kind {
174
- ast:: ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
175
- ( sig. clone ( ) , iitem. vis . clone ( ) , ident. clone ( ) )
176
- }
177
- _ => {
178
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
179
- return vec ! [ item] ;
180
- }
181
- } ,
182
- _ => {
183
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
184
- return vec ! [ item] ;
185
- }
186
- } ;
187
- ( sig, vis, ident)
188
- }
189
- _ => {
190
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
191
- return vec ! [ item] ;
171
+ _ => None ,
172
+ }
192
173
}
174
+ _ => None ,
175
+ } ) else {
176
+ dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
177
+ return vec ! [ item] ;
193
178
} ;
194
179
195
180
let meta_item_vec: ThinVec < MetaItemInner > = match meta_item. kind {
0 commit comments