Skip to content

Commit 10eb20e

Browse files
authored
Merge pull request #4645 from youknowone/derive-trait-extend_slots
Add extend_slot support for protocol traits
2 parents 7744e95 + 2a61e1c commit 10eb20e

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

derive-impl/src/pyclass.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,19 @@ pub(crate) fn impl_pyimpl(attr: AttributeArgs, item: Item) -> Result<TokenStream
142142
}
143143
Item::Trait(mut trai) => {
144144
let mut context = ImplContext::default();
145+
let mut has_extend_slots = false;
146+
for item in &trai.items {
147+
let has = match item {
148+
syn::TraitItem::Method(method) => {
149+
&method.sig.ident.to_string() == "extend_slots"
150+
}
151+
_ => false,
152+
};
153+
if has {
154+
has_extend_slots = has;
155+
break;
156+
}
157+
}
145158
extract_items_into_context(&mut context, trai.items.iter_mut());
146159

147160
let ExtractedImplAttrs {
@@ -155,6 +168,13 @@ pub(crate) fn impl_pyimpl(attr: AttributeArgs, item: Item) -> Result<TokenStream
155168
let extend_impl = &context.impl_extend_items.validate()?;
156169
let slots_impl = &context.extend_slots_items.validate()?;
157170
let class_extensions = &context.class_extensions;
171+
let call_extend_slots = if has_extend_slots {
172+
quote! {
173+
Self::extend_slots(slots);
174+
}
175+
} else {
176+
quote! {}
177+
};
158178
let extra_methods = iter_chain![
159179
parse_quote! {
160180
fn __extend_py_class(
@@ -172,6 +192,7 @@ pub(crate) fn impl_pyimpl(attr: AttributeArgs, item: Item) -> Result<TokenStream
172192
fn __extend_slots(slots: &mut ::rustpython_vm::types::PyTypeSlots) {
173193
#with_slots
174194
#slots_impl
195+
#call_extend_slots
175196
}
176197
},
177198
];

0 commit comments

Comments
 (0)