Skip to content

Commit d3c5a61

Browse files
authored
Merge pull request #588 from kngwyu/ref-into-tweak
Enable slf: PyRef<'py, Self>
2 parents a4c9fb9 + 3d821b7 commit d3c5a61

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

pyo3-derive-backend/src/method.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::pyfunction::PyFunctionAttr;
55
use proc_macro2::TokenStream;
66
use quote::quote;
77
use quote::ToTokens;
8+
use syn::spanned::Spanned;
89

910
#[derive(Clone, PartialEq, Debug)]
1011
pub struct FnArg<'a> {
@@ -390,13 +391,23 @@ fn replace_self(path: &syn::TypePath) -> syn::TypePath {
390391
let mut res = path.to_owned();
391392
for seg in &mut res.path.segments {
392393
if let syn::PathArguments::AngleBracketed(ref mut g) = seg.arguments {
393-
for arg in &mut g.args {
394+
let mut args = syn::punctuated::Punctuated::new();
395+
for arg in &g.args {
396+
let mut add_arg = true;
397+
if let syn::GenericArgument::Lifetime(_) = arg {
398+
add_arg = false;
399+
}
394400
if let syn::GenericArgument::Type(syn::Type::Path(p)) = arg {
395401
if p.path.segments.len() == 1 && p.path.segments[0].ident == "Self" {
396-
*arg = infer(p.path.segments[0].ident.span());
402+
args.push(infer(p.span()));
403+
add_arg = false;
397404
}
398405
}
406+
if add_arg {
407+
args.push(arg.clone());
408+
}
399409
}
410+
g.args = args;
400411
}
401412
}
402413
res

tests/test_pyself.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ impl Reader {
2020
fn clone_ref(slf: PyRef<Self>) -> PyRef<Self> {
2121
slf
2222
}
23+
fn clone_ref_with_py<'py>(slf: PyRef<'py, Self>, _py: Python<'py>) -> PyRef<'py, Self> {
24+
slf
25+
}
2326
fn get_iter(slf: PyRef<Self>, keys: Py<PyBytes>) -> PyResult<Iter> {
2427
Ok(Iter {
2528
reader: slf.into(),
@@ -98,6 +101,7 @@ fn test_clone_ref() {
98101
let py = gil.python();
99102
let reader: PyObject = reader().into_py(py);
100103
py_assert!(py, reader, "reader == reader.clone_ref()");
104+
py_assert!(py, reader, "reader == reader.clone_ref_with_py()");
101105
}
102106

103107
#[test]

0 commit comments

Comments
 (0)