Safe FFI between Rust and C++
diff --git a/syntax/tokens.rs b/syntax/tokens.rs
new file mode 100644
index 0000000..f553207
--- /dev/null
+++ b/syntax/tokens.rs
@@ -0,0 +1,67 @@
+use crate::syntax::{Derive, ExternFn, Ref, Ty1, Type, Var};
+use proc_macro2::{Ident, Span, TokenStream};
+use quote::{quote_spanned, ToTokens};
+use syn::Token;
+
+impl ToTokens for Type {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ match self {
+ Type::Ident(ident) => {
+ if ident == "CxxString" {
+ let span = ident.span();
+ tokens.extend(quote_spanned!(span=> ::cxx::));
+ }
+ ident.to_tokens(tokens);
+ }
+ Type::RustBox(ty) | Type::UniquePtr(ty) => ty.to_tokens(tokens),
+ Type::Ref(r) | Type::Str(r) => r.to_tokens(tokens),
+ }
+ }
+}
+
+impl ToTokens for Var {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ self.ident.to_tokens(tokens);
+ Token).to_tokens(tokens);
+ self.ty.to_tokens(tokens);
+ }
+}
+
+impl ToTokens for Ty1 {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ if self.name == "UniquePtr" {
+ let span = self.name.span();
+ tokens.extend(quote_spanned!(span=> ::cxx::));
+ }
+ self.name.to_tokens(tokens);
+ self.langle.to_tokens(tokens);
+ self.inner.to_tokens(tokens);
+ self.rangle.to_tokens(tokens);
+ }
+}
+
+impl ToTokens for Ref {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ self.ampersand.to_tokens(tokens);
+ self.mutability.to_tokens(tokens);
+ self.inner.to_tokens(tokens);
+ }
+}
+
+impl ToTokens for Derive {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ let name = match self {
+ Derive::Clone => "Clone",
+ Derive::Copy => "Copy",
+ };
+ Ident::new(name, Span::call_site()).to_tokens(tokens);
+ }
+}
+
+impl ToTokens for ExternFn {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ self.fn_token.to_tokens(tokens);
+ self.ident.to_tokens(tokens);
+ self.semi_token.to_tokens(tokens);
+ }
+}