Skip to content

Commit 0108d40

Browse files
committed
refactor: simplify function-info gathering
1 parent 63e825e commit 0108d40

File tree

1 file changed

+27
-42
lines changed

1 file changed

+27
-42
lines changed

compiler/rustc_builtin_macros/src/autodiff.rs

+27-42
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ mod llvm_enzyme {
1616
use rustc_ast::tokenstream::*;
1717
use rustc_ast::visit::AssocCtxt::*;
1818
use rustc_ast::{
19-
self as ast, AssocItemKind, BindingMode, ExprKind, FnRetTy, FnSig, Generics, ItemKind,
20-
MetaItemInner, PatKind, QSelf, TyKind,
19+
self as ast, AssocItemKind, BindingMode, FnRetTy, FnSig, Generics, ItemKind, MetaItemInner,
20+
PatKind, QSelf, TyKind, Visibility,
2121
};
2222
use rustc_expand::base::{Annotatable, ExtCtxt};
2323
use rustc_span::{Ident, Span, Symbol, kw, sym};
@@ -72,6 +72,16 @@ mod llvm_enzyme {
7272
}
7373
}
7474

75+
// Get information about the function the macro is applied to
76+
fn extract_item_info(iitem: &P<ast::Item>) -> Option<(Visibility, FnSig, Ident)> {
77+
match &iitem.kind {
78+
ItemKind::Fn(box ast::Fn { sig, ident, .. }) => {
79+
Some((iitem.vis.clone(), sig.clone(), ident.clone()))
80+
}
81+
_ => None,
82+
}
83+
}
84+
7585
pub(crate) fn from_ast(
7686
ecx: &mut ExtCtxt<'_>,
7787
meta_item: &ThinVec<MetaItemInner>,
@@ -201,49 +211,24 @@ mod llvm_enzyme {
201211
let dcx = ecx.sess.dcx();
202212

203213
// first get information about the annotable item:
204-
let (sig, vis, primal) = match &item {
205-
Annotatable::Item(iitem) => {
206-
let (sig, ident) = match &iitem.kind {
207-
ItemKind::Fn(box ast::Fn { sig, ident, .. }) => (sig, ident),
208-
_ => {
209-
dcx.emit_err(errors::AutoDiffInvalidApplication { span: item.span() });
210-
return vec![item];
211-
}
212-
};
213-
(sig.clone(), iitem.vis.clone(), ident.clone())
214-
}
214+
let Some((vis, sig, primal)) = (match &item {
215+
Annotatable::Item(iitem) => extract_item_info(iitem),
216+
Annotatable::Stmt(stmt) => match &stmt.kind {
217+
ast::StmtKind::Item(iitem) => extract_item_info(iitem),
218+
_ => None,
219+
},
215220
Annotatable::AssocItem(assoc_item, Impl { of_trait: false }) => {
216-
let (sig, ident) = match &assoc_item.kind {
217-
ast::AssocItemKind::Fn(box ast::Fn { sig, ident, .. }) => (sig, ident),
218-
_ => {
219-
dcx.emit_err(errors::AutoDiffInvalidApplication { span: item.span() });
220-
return vec![item];
221-
}
222-
};
223-
(sig.clone(), assoc_item.vis.clone(), ident.clone())
224-
}
225-
Annotatable::Stmt(stmt) => {
226-
let (sig, vis, ident) = match &stmt.kind {
227-
ast::StmtKind::Item(iitem) => match &iitem.kind {
228-
ast::ItemKind::Fn(box ast::Fn { sig, ident, .. }) => {
229-
(sig.clone(), iitem.vis.clone(), ident.clone())
230-
}
231-
_ => {
232-
dcx.emit_err(errors::AutoDiffInvalidApplication { span: item.span() });
233-
return vec![item];
234-
}
235-
},
236-
_ => {
237-
dcx.emit_err(errors::AutoDiffInvalidApplication { span: item.span() });
238-
return vec![item];
221+
match &assoc_item.kind {
222+
ast::AssocItemKind::Fn(box ast::Fn { sig, ident, .. }) => {
223+
Some((assoc_item.vis.clone(), sig.clone(), ident.clone()))
239224
}
240-
};
241-
(sig, vis, ident)
242-
}
243-
_ => {
244-
dcx.emit_err(errors::AutoDiffInvalidApplication { span: item.span() });
245-
return vec![item];
225+
_ => None,
226+
}
246227
}
228+
_ => None,
229+
}) else {
230+
dcx.emit_err(errors::AutoDiffInvalidApplication { span: item.span() });
231+
return vec![item];
247232
};
248233

249234
let meta_item_vec: ThinVec<MetaItemInner> = match meta_item.kind {

0 commit comments

Comments
 (0)