1use super::{parse_args, parse_pyo3_attrs, ArgInfo, ArgsWithSignature, Attr, Signature};
2
3use proc_macro2::TokenStream as TokenStream2;
4use quote::{quote, ToTokens, TokenStreamExt};
5use syn::{Error, ImplItemFn, Result};
6
7#[derive(Debug)]
8pub struct NewInfo {
9 args: Vec<ArgInfo>,
10 sig: Option<Signature>,
11}
12
13impl NewInfo {
14 pub fn is_candidate(item: &ImplItemFn) -> Result<bool> {
15 let attrs: Vec = parse_pyo3_attrs(&item.attrs)?;
16 Ok(attrs.iter().any(|attr: &Attr| matches!(attr, Attr::New)))
17 }
18}
19
20impl TryFrom<ImplItemFn> for NewInfo {
21 type Error = Error;
22 fn try_from(item: ImplItemFn) -> Result<Self> {
23 assert!(Self::is_candidate(&item)?);
24 let ImplItemFn { attrs: Vec, sig: Signature, .. } = item;
25 let attrs: Vec = parse_pyo3_attrs(&attrs)?;
26 let mut new_sig: Option = None;
27 for attr: Attr in attrs {
28 if let Attr::Signature(text_sig: Signature) = attr {
29 new_sig = Some(text_sig);
30 }
31 }
32 Ok(NewInfo {
33 args: parse_args(iter:sig.inputs)?,
34 sig: new_sig,
35 })
36 }
37}
38
39impl ToTokens for NewInfo {
40 fn to_tokens(&self, tokens: &mut TokenStream2) {
41 let Self { args: &Vec, sig: &Option } = self;
42 let args_with_sig: ArgsWithSignature<'_> = ArgsWithSignature { args, sig };
43 tokens.append_all(iter:quote! {
44 ::pyo3_stub_gen::type_info::NewInfo {
45 args: #args_with_sig,
46 }
47 })
48 }
49}
50