Emit lifetimes on extern type into Rust macro output
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index e53e5b6..d71db6f 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -313,16 +313,23 @@
 fn expand_cxx_type(ety: &ExternType) -> TokenStream {
     let ident = &ety.name.rust;
     let doc = &ety.doc;
+    let generics = &ety.generics;
     let type_id = type_id(&ety.name);
 
+    let lifetime_fields = ety.generics.lifetimes.iter().map(|lifetime| {
+        let field = format_ident!("_lifetime_{}", lifetime.ident);
+        quote!(#field: ::std::marker::PhantomData<&#lifetime ()>)
+    });
+
     quote! {
         #doc
         #[repr(C)]
-        pub struct #ident {
+        pub struct #ident #generics {
             _private: ::cxx::private::Opaque,
+            #(#lifetime_fields,)*
         }
 
-        unsafe impl ::cxx::ExternType for #ident {
+        unsafe impl #generics ::cxx::ExternType for #ident #generics {
             type Id = #type_id;
             type Kind = ::cxx::kind::Opaque;
         }
@@ -959,10 +966,11 @@
 fn expand_type_alias(alias: &TypeAlias) -> TokenStream {
     let doc = &alias.doc;
     let ident = &alias.name.rust;
+    let generics = &alias.generics;
     let ty = &alias.ty;
     quote! {
         #doc
-        pub type #ident = #ty;
+        pub type #ident #generics = #ty;
     }
 }
 
diff --git a/syntax/tokens.rs b/syntax/tokens.rs
index 8348704..2e14f7a 100644
--- a/syntax/tokens.rs
+++ b/syntax/tokens.rs
@@ -1,7 +1,7 @@
 use crate::syntax::atom::Atom::*;
 use crate::syntax::{
-    Array, Atom, Derive, Enum, ExternFn, ExternType, Impl, Receiver, Ref, RustName, Signature,
-    SliceRef, Struct, Ty1, Type, TypeAlias, Var,
+    Array, Atom, Derive, Enum, ExternFn, ExternType, Impl, Lifetimes, Receiver, Ref, RustName,
+    Signature, SliceRef, Struct, Ty1, Type, TypeAlias, Var,
 };
 use proc_macro2::{Ident, Span, TokenStream};
 use quote::{quote_spanned, ToTokens};
@@ -157,6 +157,14 @@
     }
 }
 
+impl ToTokens for Lifetimes {
+    fn to_tokens(&self, tokens: &mut TokenStream) {
+        self.lt_token.to_tokens(tokens);
+        self.lifetimes.to_tokens(tokens);
+        self.gt_token.to_tokens(tokens);
+    }
+}
+
 impl ToTokens for Signature {
     fn to_tokens(&self, tokens: &mut TokenStream) {
         self.fn_token.to_tokens(tokens);