Implement `ToTokens` for `LifetimeName`, so that formatting doesn't require an extra step.

This goes along with earlier changes, where, rather than separately representing the structured vs quoted data, we just use the structured data and quote it as necessary. Lets you keep using the structured data as long as you want, and reduces the (visual) complexity of formatting them.

Also, reduces the incidence of panic attacks from me reliving memories of trying to debug print in OCaml.

PiperOrigin-RevId: 451360750
diff --git a/rs_bindings_from_cc/BUILD b/rs_bindings_from_cc/BUILD
index 0e1be69..95cb8e4 100644
--- a/rs_bindings_from_cc/BUILD
+++ b/rs_bindings_from_cc/BUILD
@@ -270,6 +270,7 @@
         "@crate_index//:quote",
         "@crate_index//:serde",
         "@crate_index//:serde_json",
+        "@crate_index//:syn",
     ],
 )
 
diff --git a/rs_bindings_from_cc/ir.rs b/rs_bindings_from_cc/ir.rs
index 1c2ae7f..85cf296 100644
--- a/rs_bindings_from_cc/ir.rs
+++ b/rs_bindings_from_cc/ir.rs
@@ -85,6 +85,14 @@
     pub id: LifetimeId,
 }
 
+impl ToTokens for LifetimeName {
+    fn to_tokens(&self, tokens: &mut TokenStream) {
+        let lifetime =
+            syn::Lifetime::new(&format!("'{}", self.name), proc_macro2::Span::call_site());
+        lifetime.to_tokens(tokens)
+    }
+}
+
 #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)]
 pub struct RsType {
     pub name: Option<String>,
diff --git a/rs_bindings_from_cc/src_code_gen.rs b/rs_bindings_from_cc/src_code_gen.rs
index 19dfa54..556aa7d 100644
--- a/rs_bindings_from_cc/src_code_gen.rs
+++ b/rs_bindings_from_cc/src_code_gen.rs
@@ -717,7 +717,6 @@
             quote! {}
         };
 
-        let lifetimes = lifetimes.into_iter().map(|l| format_lifetime_name(&l.name));
         let fn_generic_params: TokenStream;
         if let ImplKind::Trait { declare_lifetimes: true, trait_generic_params, .. } =
             &mut impl_kind
@@ -831,7 +830,7 @@
     }
 
     let thunk_ident = thunk_ident(func);
-    let lifetimes = func.lifetime_params.iter().map(|l| format_lifetime_name(&l.name));
+    let lifetimes = func.lifetime_params.iter();
     let generic_params = format_generic_params(lifetimes);
     let param_types = self_param.into_iter().chain(param_types.map(|t| quote! {#t}));
 
@@ -1964,7 +1963,6 @@
     pub fn format_mut_ref_as_uninitialized(&self) -> Result<TokenStream> {
         match self {
             RsTypeKind::Reference { referent, lifetime, mutability: Mutability::Mut } => {
-                let lifetime = format_lifetime_name(&lifetime.name);
                 Ok(quote! { & #lifetime mut crate::rust_std::mem::MaybeUninit< #referent > })
             }
             _ => bail!("Expected reference to format as MaybeUninit, got: {:?}", self),
@@ -2009,7 +2007,7 @@
             } => {
                 referent = reference_pointee;
                 mutability = reference_mutability;
-                lifetime = format_lifetime_name(&reference_lifetime.name);
+                lifetime = quote! {#reference_lifetime};
             }
             _ => bail!("Unexpected type of `self` parameter: {:?}", self),
         }
@@ -2104,7 +2102,6 @@
             }
             RsTypeKind::Reference { referent, mutability, lifetime } => {
                 let mut_ = mutability.format_for_reference();
-                let lifetime = format_lifetime_name(&lifetime.name);
                 let reference = quote! {& #lifetime #mut_ #referent};
                 if mutability == &Mutability::Mut && !referent.is_unpin() {
                     // TODO(b/200067242): Add a `use rust_std::pin::Pin` to the crate, and use
@@ -2117,7 +2114,6 @@
                 }
             }
             RsTypeKind::RvalueReference { referent, mutability, lifetime } => {
-                let lifetime = format_lifetime_name(&lifetime.name);
                 // TODO(b/200067242): Add a `use ctor::RvalueReference` (etc.) to the crate.
                 if mutability == &Mutability::Mut {
                     quote! {ctor::RvalueReference<#lifetime, #referent>}
@@ -2216,12 +2212,6 @@
     }
 }
 
-fn format_lifetime_name(lifetime_name: &str) -> TokenStream {
-    let lifetime =
-        syn::Lifetime::new(&format!("'{}", lifetime_name), proc_macro2::Span::call_site());
-    quote! { #lifetime }
-}
-
 fn format_rs_type(ty: &ir::RsType, ir: &IR) -> Result<TokenStream> {
     RsTypeKind::new(ty, ir)
         .map(|kind| kind.to_token_stream())