Refactor impl_method_proto
This commit is contained in:
parent
c234476693
commit
77b4b9e67d
|
@ -7,6 +7,21 @@ pub struct Proto {
|
|||
pub py_methods: &'static [PyMethod],
|
||||
}
|
||||
|
||||
impl Proto {
|
||||
pub(crate) fn get_proto<Q>(&self, query: Q) -> Option<&'static MethodProto>
|
||||
where
|
||||
Q: PartialEq<&'static str>,
|
||||
{
|
||||
self.methods.iter().find(|m| query == m.name())
|
||||
}
|
||||
pub(crate) fn get_method<Q>(&self, query: Q) -> Option<&'static PyMethod>
|
||||
where
|
||||
Q: PartialEq<&'static str>,
|
||||
{
|
||||
self.py_methods.iter().find(|m| query == m.name)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct PyMethod {
|
||||
pub name: &'static str,
|
||||
pub proto: &'static str,
|
||||
|
|
|
@ -69,7 +69,7 @@ impl MethodProto {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn impl_method_proto(
|
||||
pub(crate) fn impl_method_proto(
|
||||
cls: &syn::Type,
|
||||
sig: &mut syn::Signature,
|
||||
meth: &MethodProto,
|
||||
|
|
|
@ -459,7 +459,6 @@ fn impl_descriptors(
|
|||
.collect::<syn::Result<_>>()?;
|
||||
|
||||
Ok(quote! {
|
||||
|
||||
pyo3::inventory::submit! {
|
||||
#![crate = pyo3] {
|
||||
type ClsInventory = <#cls as pyo3::class::methods::PyMethodsInventoryDispatch>::InventoryType;
|
||||
|
|
|
@ -63,39 +63,35 @@ fn impl_proto_impl(
|
|||
|
||||
for iimpl in impls.iter_mut() {
|
||||
if let syn::ImplItem::Method(ref mut met) = iimpl {
|
||||
for m in proto.methods {
|
||||
if met.sig.ident == m.name() {
|
||||
impl_method_proto(ty, &mut met.sig, m).to_tokens(&mut tokens);
|
||||
}
|
||||
if let Some(m) = proto.get_proto(&met.sig.ident) {
|
||||
impl_method_proto(ty, &mut met.sig, m).to_tokens(&mut tokens);
|
||||
}
|
||||
for m in proto.py_methods {
|
||||
if met.sig.ident == m.name {
|
||||
let name = &met.sig.ident;
|
||||
let proto: syn::Path = syn::parse_str(m.proto).unwrap();
|
||||
if let Some(m) = proto.get_method(&met.sig.ident) {
|
||||
let name = &met.sig.ident;
|
||||
let proto: syn::Path = syn::parse_str(m.proto).unwrap();
|
||||
|
||||
let fn_spec = match FnSpec::parse(&met.sig, &mut met.attrs, false) {
|
||||
Ok(fn_spec) => fn_spec,
|
||||
Err(err) => return err.to_compile_error(),
|
||||
};
|
||||
let meth = pymethod::impl_proto_wrap(ty, &fn_spec);
|
||||
let fn_spec = match FnSpec::parse(&met.sig, &mut met.attrs, false) {
|
||||
Ok(fn_spec) => fn_spec,
|
||||
Err(err) => return err.to_compile_error(),
|
||||
};
|
||||
let meth = pymethod::impl_proto_wrap(ty, &fn_spec);
|
||||
|
||||
py_methods.push(quote! {
|
||||
impl #proto for #ty
|
||||
{
|
||||
#[inline]
|
||||
fn #name() -> Option<pyo3::class::methods::PyMethodDef> {
|
||||
#meth
|
||||
py_methods.push(quote! {
|
||||
impl #proto for #ty
|
||||
{
|
||||
#[inline]
|
||||
fn #name() -> Option<pyo3::class::methods::PyMethodDef> {
|
||||
#meth
|
||||
|
||||
Some(pyo3::class::PyMethodDef {
|
||||
ml_name: stringify!(#name),
|
||||
ml_meth: pyo3::class::PyMethodType::PyCFunctionWithKeywords(__wrap),
|
||||
ml_flags: pyo3::ffi::METH_VARARGS | pyo3::ffi::METH_KEYWORDS,
|
||||
ml_doc: ""
|
||||
})
|
||||
}
|
||||
Some(pyo3::class::PyMethodDef {
|
||||
ml_name: stringify!(#name),
|
||||
ml_meth: pyo3::class::PyMethodType::PyCFunctionWithKeywords(__wrap),
|
||||
ml_flags: pyo3::ffi::METH_VARARGS | pyo3::ffi::METH_KEYWORDS,
|
||||
ml_doc: ""
|
||||
})
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue