Skip to content

Commit 8722102

Browse files
committed
Allow recursing to different renderers in TypRefRenderer
1 parent 504a486 commit 8722102

File tree

2 files changed

+30
-22
lines changed

2 files changed

+30
-22
lines changed

binding-generator/src/type_ref.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1375,7 +1375,7 @@ impl<'tu> TypeRef<'tu> {
13751375
}
13761376

13771377
#[inline]
1378-
pub fn render(&self, renderer: impl TypeRefRenderer) -> Cow<str> {
1378+
pub fn render<'a>(&self, renderer: impl TypeRefRenderer<'a>) -> Cow<str> {
13791379
renderer.render(self)
13801380
}
13811381

binding-generator/src/type_ref/renderer.rs

+29-21
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ use crate::{Element, StringExt};
77

88
use super::{Kind, TemplateArg, TypeRef};
99

10-
pub trait TypeRefRenderer {
10+
pub trait TypeRefRenderer<'a> {
11+
type Recursed: TypeRefRenderer<'a> + Sized;
12+
1113
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;
1315
}
1416

1517
#[derive(Clone, Copy, Debug, PartialEq)]
@@ -93,7 +95,7 @@ impl ConstnessOverride {
9395
}
9496
}
9597

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> {
9799
if type_ref.as_string().is_some() {
98100
#[allow(clippy::if_same_then_else)]
99101
return if type_ref.constness().is_const() {
@@ -176,7 +178,7 @@ fn render_rust<'t>(renderer: impl TypeRefRenderer, type_ref: &'t TypeRef, is_ful
176178
}
177179
}
178180

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 {
180182
let generic_types = type_ref.template_specialization_args();
181183
if !generic_types.is_empty() {
182184
let mut constant_suffix = String::new();
@@ -207,7 +209,7 @@ fn render_rust_tpl_decl(renderer: impl TypeRefRenderer, type_ref: &TypeRef, use_
207209
}
208210
}
209211

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> {
211213
let cnst = constness.with(type_ref.clang_constness()).cpp_qual();
212214
let (space_name, space_const_name) = if name.is_empty() {
213215
("".to_string(), "".to_string())
@@ -328,7 +330,7 @@ fn render_cpp<'t>(renderer: impl TypeRefRenderer, type_ref: &'t TypeRef, is_full
328330
}
329331
}
330332

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 {
332334
let generic_types = type_ref.template_specialization_args();
333335
if !generic_types.is_empty() {
334336
let generic_types = generic_types.into_iter()
@@ -365,7 +367,9 @@ impl RustDeclarationRenderer {
365367
}
366368
}
367369

368-
impl TypeRefRenderer for RustDeclarationRenderer {
370+
impl<'a> TypeRefRenderer<'a> for RustDeclarationRenderer {
371+
type Recursed = Self;
372+
369373
fn render<'t>(self, type_ref: &'t TypeRef) -> Cow<'t, str> {
370374
render_rust(self, type_ref, false, None, false)
371375
}
@@ -387,7 +391,9 @@ impl RustReferenceRenderer {
387391
}
388392
}
389393

390-
impl TypeRefRenderer for RustReferenceRenderer {
394+
impl<'a> TypeRefRenderer<'a> for RustReferenceRenderer {
395+
type Recursed = Self;
396+
391397
fn render<'t>(self, type_ref: &'t TypeRef) -> Cow<'t, str> {
392398
let lifetimes = self.lifetimes;
393399
let use_turbo_fish = self.use_turbo_fish;
@@ -413,7 +419,9 @@ impl CppDeclarationRenderer {
413419
}
414420
}
415421

416-
impl TypeRefRenderer for CppDeclarationRenderer {
422+
impl<'a> TypeRefRenderer<'a> for CppDeclarationRenderer {
423+
type Recursed = Self;
424+
417425
fn render<'t>(self, type_ref: &'t TypeRef) -> Cow<'t, str> {
418426
let extern_types = self.extern_types;
419427
render_cpp(self, type_ref, false, "", extern_types, ConstnessOverride::No)
@@ -437,7 +445,9 @@ impl<'s> CppReferenceRenderer<'s> {
437445
}
438446
}
439447

440-
impl TypeRefRenderer for CppReferenceRenderer<'_> {
448+
impl<'a> TypeRefRenderer<'a> for CppReferenceRenderer<'_> {
449+
type Recursed = Self;
450+
441451
fn render<'t>(self, type_ref: &'t TypeRef) -> Cow<'t, str> {
442452
let name = self.name;
443453
let extern_types = self.extern_types;
@@ -465,24 +475,22 @@ impl<'s> CppExternReturnRenderer {
465475
}
466476
}
467477

468-
impl TypeRefRenderer for CppExternReturnRenderer {
478+
impl<'a> TypeRefRenderer<'a> for CppExternReturnRenderer {
479+
type Recursed = CppReferenceRenderer<'a>;
480+
469481
fn render<'t>(self, type_ref: &'t TypeRef) -> Cow<'t, str> {
470482
if type_ref.as_string().is_some() {
471483
"void*".into()
472484
} 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()
476486
} 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)
480488
}
481489
}
482490

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
487495
}
488496
}

0 commit comments

Comments
 (0)