blob: ed5b315692ed3cead85244e40e8809e7bf898d89 [file] [log] [blame]
David Tolnaya52602b2020-03-06 10:24:34 -08001use crate::syntax::atom::Atom::*;
David Tolnay7db73692019-10-20 14:51:12 -04002use crate::syntax::{Derive, ExternFn, Ref, Ty1, Type, Var};
3use proc_macro2::{Ident, Span, TokenStream};
David Tolnay417305a2020-03-18 13:54:00 -07004use quote::{quote, quote_spanned, ToTokens};
David Tolnay7db73692019-10-20 14:51:12 -04005use syn::Token;
6
7impl ToTokens for Type {
8 fn to_tokens(&self, tokens: &mut TokenStream) {
9 match self {
10 Type::Ident(ident) => {
David Tolnaya52602b2020-03-06 10:24:34 -080011 if ident == CxxString {
David Tolnay7db73692019-10-20 14:51:12 -040012 let span = ident.span();
13 tokens.extend(quote_spanned!(span=> ::cxx::));
14 }
15 ident.to_tokens(tokens);
16 }
17 Type::RustBox(ty) | Type::UniquePtr(ty) => ty.to_tokens(tokens),
18 Type::Ref(r) | Type::Str(r) => r.to_tokens(tokens),
David Tolnay417305a2020-03-18 13:54:00 -070019 Type::Fn(f) => {
20 let fn_token = f.fn_token;
21 let args = &f.args;
22 tokens.extend(quote!(#fn_token(#(#args),*)));
23 let mut ret = match &f.ret {
24 Some(ret) => quote!(#ret),
25 None => quote!(()),
26 };
27 if f.throws {
28 ret = quote!(::std::result::Result<#ret, _>);
29 }
30 if f.ret.is_some() || f.throws {
31 tokens.extend(quote!(-> #ret));
32 }
33 }
David Tolnayd0bb3642020-03-15 23:27:11 -070034 Type::Void(span) => tokens.extend(quote_spanned!(*span=> ())),
David Tolnay7db73692019-10-20 14:51:12 -040035 }
36 }
37}
38
39impl ToTokens for Var {
40 fn to_tokens(&self, tokens: &mut TokenStream) {
41 self.ident.to_tokens(tokens);
42 Token![:](self.ident.span()).to_tokens(tokens);
43 self.ty.to_tokens(tokens);
44 }
45}
46
47impl ToTokens for Ty1 {
48 fn to_tokens(&self, tokens: &mut TokenStream) {
49 if self.name == "UniquePtr" {
50 let span = self.name.span();
51 tokens.extend(quote_spanned!(span=> ::cxx::));
52 }
53 self.name.to_tokens(tokens);
54 self.langle.to_tokens(tokens);
55 self.inner.to_tokens(tokens);
56 self.rangle.to_tokens(tokens);
57 }
58}
59
60impl ToTokens for Ref {
61 fn to_tokens(&self, tokens: &mut TokenStream) {
62 self.ampersand.to_tokens(tokens);
63 self.mutability.to_tokens(tokens);
64 self.inner.to_tokens(tokens);
65 }
66}
67
68impl ToTokens for Derive {
69 fn to_tokens(&self, tokens: &mut TokenStream) {
70 let name = match self {
71 Derive::Clone => "Clone",
72 Derive::Copy => "Copy",
73 };
74 Ident::new(name, Span::call_site()).to_tokens(tokens);
75 }
76}
77
78impl ToTokens for ExternFn {
79 fn to_tokens(&self, tokens: &mut TokenStream) {
David Tolnayd95b1192020-03-18 20:07:46 -070080 self.sig.tokens.to_tokens(tokens);
David Tolnay7db73692019-10-20 14:51:12 -040081 }
82}