From e8ec71e5e7f95d1e705e28c64eff202aaffa99ed Mon Sep 17 00:00:00 2001 From: rzvxa Date: Wed, 7 Aug 2024 16:41:18 +0330 Subject: [PATCH] fix: generate better code. --- .../src/generators/derive_clone_in.rs | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tasks/ast_codegen/src/generators/derive_clone_in.rs b/tasks/ast_codegen/src/generators/derive_clone_in.rs index 2350652fbe937..9421e834f5082 100644 --- a/tasks/ast_codegen/src/generators/derive_clone_in.rs +++ b/tasks/ast_codegen/src/generators/derive_clone_in.rs @@ -103,18 +103,30 @@ where F: FnOnce() -> (/* allocator name */ Ident, TokenStream), { let (alloc, body) = body(); - let (old_lifetime, new_lifetime) = if has_lifetime { - (quote!(<'old_alloc>), quote!(<'new_alloc>)) + let (impl_lifetimes, trait_lifetime, old_lifetime, new_lifetime, alloc_ref) = if has_lifetime { + ( + quote!(<'old_alloc, 'new_alloc>), + quote!(<'new_alloc>), + quote!(<'old_alloc>), + quote!(<'new_alloc>), + quote!(&'new_alloc), + ) } else { - Default::default() + ( + quote!(<'alloc>), + quote!(<'alloc>), + TokenStream::default(), + TokenStream::default(), + quote!(&'alloc), + ) }; quote! { endl!(); - impl<'old_alloc, 'new_alloc> CloneIn<'new_alloc> for #ty_ident #old_lifetime { + impl #impl_lifetimes CloneIn #trait_lifetime for #ty_ident #old_lifetime { type Cloned = #ty_ident #new_lifetime; - fn clone_in(&self, #alloc: &'new_alloc Allocator) -> Self::Cloned { + fn clone_in(&self, #alloc: #alloc_ref Allocator) -> Self::Cloned { #body } }