blob: 52c47d504ba25bd920506ca6d59c27a2228c26b4 [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};
4use quote::{quote_spanned, ToTokens};
5use 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 Tolnayd0bb3642020-03-15 23:27:11 -070019 Type::Void(span) => tokens.extend(quote_spanned!(*span=> ())),
David Tolnay7db73692019-10-20 14:51:12 -040020 }
21 }
22}
23
24impl ToTokens for Var {
25 fn to_tokens(&self, tokens: &mut TokenStream) {
26 self.ident.to_tokens(tokens);
27 Token![:](self.ident.span()).to_tokens(tokens);
28 self.ty.to_tokens(tokens);
29 }
30}
31
32impl ToTokens for Ty1 {
33 fn to_tokens(&self, tokens: &mut TokenStream) {
34 if self.name == "UniquePtr" {
35 let span = self.name.span();
36 tokens.extend(quote_spanned!(span=> ::cxx::));
37 }
38 self.name.to_tokens(tokens);
39 self.langle.to_tokens(tokens);
40 self.inner.to_tokens(tokens);
41 self.rangle.to_tokens(tokens);
42 }
43}
44
45impl ToTokens for Ref {
46 fn to_tokens(&self, tokens: &mut TokenStream) {
47 self.ampersand.to_tokens(tokens);
48 self.mutability.to_tokens(tokens);
49 self.inner.to_tokens(tokens);
50 }
51}
52
53impl ToTokens for Derive {
54 fn to_tokens(&self, tokens: &mut TokenStream) {
55 let name = match self {
56 Derive::Clone => "Clone",
57 Derive::Copy => "Copy",
58 };
59 Ident::new(name, Span::call_site()).to_tokens(tokens);
60 }
61}
62
63impl ToTokens for ExternFn {
64 fn to_tokens(&self, tokens: &mut TokenStream) {
65 self.fn_token.to_tokens(tokens);
66 self.ident.to_tokens(tokens);
67 self.semi_token.to_tokens(tokens);
68 }
69}