@@ -7,9 +7,11 @@ use crate::{Element, StringExt};
7
7
8
8
use super :: { Kind , TemplateArg , TypeRef } ;
9
9
10
- pub trait TypeRefRenderer {
10
+ pub trait TypeRefRenderer < ' a > {
11
+ type Recursed : TypeRefRenderer < ' a > + Sized ;
12
+
11
13
fn render < ' t > ( self , type_ref : & ' t TypeRef ) -> Cow < ' t , str > ;
12
- fn recurse ( & self ) -> Self where Self : Sized ;
14
+ fn recurse ( & self ) -> Self :: Recursed ;
13
15
}
14
16
15
17
#[ derive( Clone , Copy , Debug , PartialEq ) ]
@@ -93,7 +95,7 @@ impl ConstnessOverride {
93
95
}
94
96
}
95
97
96
- fn render_rust < ' t > ( renderer : impl TypeRefRenderer , type_ref : & ' t TypeRef , is_full : bool , lifetimes : Option < Lifetime > , use_turbo_fish : bool ) -> Cow < ' t , str > {
98
+ fn render_rust < ' a , ' t > ( renderer : impl TypeRefRenderer < ' a > , type_ref : & ' t TypeRef , is_full : bool , lifetimes : Option < Lifetime > , use_turbo_fish : bool ) -> Cow < ' t , str > {
97
99
if type_ref. as_string ( ) . is_some ( ) {
98
100
#[ allow( clippy:: if_same_then_else) ]
99
101
return if type_ref. constness ( ) . is_const ( ) {
@@ -176,7 +178,7 @@ fn render_rust<'t>(renderer: impl TypeRefRenderer, type_ref: &'t TypeRef, is_ful
176
178
}
177
179
}
178
180
179
- fn render_rust_tpl_decl ( renderer : impl TypeRefRenderer , type_ref : & TypeRef , use_turbo_fish : bool ) -> String {
181
+ fn render_rust_tpl_decl < ' a > ( renderer : impl TypeRefRenderer < ' a > , type_ref : & TypeRef , use_turbo_fish : bool ) -> String {
180
182
let generic_types = type_ref. template_specialization_args ( ) ;
181
183
if !generic_types. is_empty ( ) {
182
184
let mut constant_suffix = String :: new ( ) ;
@@ -207,7 +209,7 @@ fn render_rust_tpl_decl(renderer: impl TypeRefRenderer, type_ref: &TypeRef, use_
207
209
}
208
210
}
209
211
210
- fn render_cpp < ' t > ( renderer : impl TypeRefRenderer , type_ref : & ' t TypeRef , is_full : bool , name : & str , extern_types : bool , constness : ConstnessOverride ) -> Cow < ' t , str > {
212
+ fn render_cpp < ' a , ' t > ( renderer : impl TypeRefRenderer < ' a > , type_ref : & ' t TypeRef , is_full : bool , name : & str , extern_types : bool , constness : ConstnessOverride ) -> Cow < ' t , str > {
211
213
let cnst = constness. with ( type_ref. clang_constness ( ) ) . cpp_qual ( ) ;
212
214
let ( space_name, space_const_name) = if name. is_empty ( ) {
213
215
( "" . to_string ( ) , "" . to_string ( ) )
@@ -328,7 +330,7 @@ fn render_cpp<'t>(renderer: impl TypeRefRenderer, type_ref: &'t TypeRef, is_full
328
330
}
329
331
}
330
332
331
- fn render_cpp_tpl_decl ( renderer : impl TypeRefRenderer , type_ref : & TypeRef ) -> String {
333
+ fn render_cpp_tpl_decl < ' a > ( renderer : impl TypeRefRenderer < ' a > , type_ref : & TypeRef ) -> String {
332
334
let generic_types = type_ref. template_specialization_args ( ) ;
333
335
if !generic_types. is_empty ( ) {
334
336
let generic_types = generic_types. into_iter ( )
@@ -365,7 +367,9 @@ impl RustDeclarationRenderer {
365
367
}
366
368
}
367
369
368
- impl TypeRefRenderer for RustDeclarationRenderer {
370
+ impl < ' a > TypeRefRenderer < ' a > for RustDeclarationRenderer {
371
+ type Recursed = Self ;
372
+
369
373
fn render < ' t > ( self , type_ref : & ' t TypeRef ) -> Cow < ' t , str > {
370
374
render_rust ( self , type_ref, false , None , false )
371
375
}
@@ -387,7 +391,9 @@ impl RustReferenceRenderer {
387
391
}
388
392
}
389
393
390
- impl TypeRefRenderer for RustReferenceRenderer {
394
+ impl < ' a > TypeRefRenderer < ' a > for RustReferenceRenderer {
395
+ type Recursed = Self ;
396
+
391
397
fn render < ' t > ( self , type_ref : & ' t TypeRef ) -> Cow < ' t , str > {
392
398
let lifetimes = self . lifetimes ;
393
399
let use_turbo_fish = self . use_turbo_fish ;
@@ -413,7 +419,9 @@ impl CppDeclarationRenderer {
413
419
}
414
420
}
415
421
416
- impl TypeRefRenderer for CppDeclarationRenderer {
422
+ impl < ' a > TypeRefRenderer < ' a > for CppDeclarationRenderer {
423
+ type Recursed = Self ;
424
+
417
425
fn render < ' t > ( self , type_ref : & ' t TypeRef ) -> Cow < ' t , str > {
418
426
let extern_types = self . extern_types ;
419
427
render_cpp ( self , type_ref, false , "" , extern_types, ConstnessOverride :: No )
@@ -437,7 +445,9 @@ impl<'s> CppReferenceRenderer<'s> {
437
445
}
438
446
}
439
447
440
- impl TypeRefRenderer for CppReferenceRenderer < ' _ > {
448
+ impl < ' a > TypeRefRenderer < ' a > for CppReferenceRenderer < ' _ > {
449
+ type Recursed = Self ;
450
+
441
451
fn render < ' t > ( self , type_ref : & ' t TypeRef ) -> Cow < ' t , str > {
442
452
let name = self . name ;
443
453
let extern_types = self . extern_types ;
@@ -465,24 +475,22 @@ impl<'s> CppExternReturnRenderer {
465
475
}
466
476
}
467
477
468
- impl TypeRefRenderer for CppExternReturnRenderer {
478
+ impl < ' a > TypeRefRenderer < ' a > for CppExternReturnRenderer {
479
+ type Recursed = CppReferenceRenderer < ' a > ;
480
+
469
481
fn render < ' t > ( self , type_ref : & ' t TypeRef ) -> Cow < ' t , str > {
470
482
if type_ref. as_string ( ) . is_some ( ) {
471
483
"void*" . into ( )
472
484
} else if type_ref. is_by_ptr ( ) && !type_ref. as_abstract_class_ptr ( ) . is_some ( ) {
473
- let mut subrenderer = CppReferenceRenderer :: new ( "" , true ) ;
474
- subrenderer. constness_override = self . constness_override ;
475
- format ! ( "{typ}*" , typ=subrenderer. render( type_ref) ) . into ( )
485
+ format ! ( "{typ}*" , typ=self . recurse( ) . render( type_ref) ) . into ( )
476
486
} else {
477
- let mut subrenderer = CppReferenceRenderer :: new ( "" , true ) ;
478
- subrenderer. constness_override = self . constness_override ;
479
- subrenderer. render ( type_ref)
487
+ self . recurse ( ) . render ( type_ref)
480
488
}
481
489
}
482
490
483
- fn recurse ( & self ) -> Self {
484
- Self {
485
- constness_override : ConstnessOverride :: No ,
486
- }
491
+ fn recurse ( & self ) -> Self :: Recursed {
492
+ let mut out = CppReferenceRenderer :: new ( "" , true ) ;
493
+ out . constness_override = self . constness_override ;
494
+ out
487
495
}
488
496
}
0 commit comments