Skip to content

Commit 284672a

Browse files
committed
refactor: simplify function-info gathering
1 parent 90fc4b7 commit 284672a

File tree

1 file changed

+26
-41
lines changed

1 file changed

+26
-41
lines changed

compiler/rustc_builtin_macros/src/autodiff.rs

+26-41
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ mod llvm_enzyme {
1717
use rustc_ast::visit::AssocCtxt::*;
1818
use rustc_ast::{
1919
self as ast, AssocItemKind, BindingMode, FnRetTy, FnSig, Generics, ItemKind, MetaItemInner,
20-
PatKind, TyKind,
20+
PatKind, TyKind, Visibility,
2121
};
2222
use rustc_expand::base::{Annotatable, ExtCtxt};
2323
use rustc_span::{Ident, Span, Symbol, kw, sym};
@@ -54,6 +54,16 @@ mod llvm_enzyme {
5454
first_ident(x).name.to_string()
5555
}
5656

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+
5767
pub(crate) fn from_ast(
5868
ecx: &mut ExtCtxt<'_>,
5969
meta_item: &ThinVec<MetaItemInner>,
@@ -147,49 +157,24 @@ mod llvm_enzyme {
147157
let dcx = ecx.sess.dcx();
148158

149159
// 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+
},
161166
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()))
167170
}
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+
}
192173
}
174+
_ => None,
175+
}) else {
176+
dcx.emit_err(errors::AutoDiffInvalidApplication { span: item.span() });
177+
return vec![item];
193178
};
194179

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

0 commit comments

Comments
 (0)