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);