blob: 6e3db9b599051bdf059db0d85fe944d003feacb3 [file] [log] [blame]
David Tolnaya52602b2020-03-06 10:24:34 -08001use crate::syntax::atom::Atom::*;
David Tolnayfb6e3862020-04-20 01:33:23 -07002use crate::syntax::{Derive, ExternFn, Receiver, Ref, Signature, Slice, Ty1, Type, Var};
David Tolnay7db73692019-10-20 14:51:12 -04003use proc_macro2::{Ident, Span, TokenStream};
David Tolnayc071b892020-03-18 16:59:53 -07004use 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),
Adrian Taylorf5dd5522020-04-13 16:50:14 -070018 Type::Ref(r) | Type::Str(r) | Type::SliceRefU8(r) => r.to_tokens(tokens),
19 Type::Slice(s) => s.to_tokens(tokens),
David Tolnayc071b892020-03-18 16:59:53 -070020 Type::Fn(f) => f.to_tokens(tokens),
David Tolnayd0bb3642020-03-15 23:27:11 -070021 Type::Void(span) => tokens.extend(quote_spanned!(*span=> ())),
David Tolnay7db73692019-10-20 14:51:12 -040022 }
23 }
24}
25
26impl ToTokens for Var {
27 fn to_tokens(&self, tokens: &mut TokenStream) {
28 self.ident.to_tokens(tokens);
29 Token![:](self.ident.span()).to_tokens(tokens);
30 self.ty.to_tokens(tokens);
31 }
32}
33
34impl ToTokens for Ty1 {
35 fn to_tokens(&self, tokens: &mut TokenStream) {
36 if self.name == "UniquePtr" {
37 let span = self.name.span();
38 tokens.extend(quote_spanned!(span=> ::cxx::));
39 }
40 self.name.to_tokens(tokens);
41 self.langle.to_tokens(tokens);
42 self.inner.to_tokens(tokens);
43 self.rangle.to_tokens(tokens);
44 }
45}
46
47impl ToTokens for Ref {
48 fn to_tokens(&self, tokens: &mut TokenStream) {
49 self.ampersand.to_tokens(tokens);
50 self.mutability.to_tokens(tokens);
51 self.inner.to_tokens(tokens);
52 }
53}
54
Adrian Taylorf5dd5522020-04-13 16:50:14 -070055impl ToTokens for Slice {
56 fn to_tokens(&self, tokens: &mut TokenStream) {
57 self.bracket.surround(tokens, |tokens| {
58 self.inner.to_tokens(tokens);
59 });
60 }
61}
62
David Tolnay7db73692019-10-20 14:51:12 -040063impl ToTokens for Derive {
64 fn to_tokens(&self, tokens: &mut TokenStream) {
65 let name = match self {
66 Derive::Clone => "Clone",
67 Derive::Copy => "Copy",
68 };
69 Ident::new(name, Span::call_site()).to_tokens(tokens);
70 }
71}
72
73impl ToTokens for ExternFn {
74 fn to_tokens(&self, tokens: &mut TokenStream) {
David Tolnaye3a48152020-04-08 19:38:05 -070075 // Notional token range for error reporting purposes.
76 self.sig.fn_token.to_tokens(tokens);
77 self.semi_token.to_tokens(tokens);
David Tolnay7db73692019-10-20 14:51:12 -040078 }
79}
David Tolnayc071b892020-03-18 16:59:53 -070080
81impl ToTokens for Signature {
82 fn to_tokens(&self, tokens: &mut TokenStream) {
David Tolnaye3a48152020-04-08 19:38:05 -070083 self.fn_token.to_tokens(tokens);
84 self.paren_token.surround(tokens, |tokens| {
85 self.args.to_tokens(tokens);
86 });
87 if let Some(ret) = &self.ret {
88 Token![->](self.paren_token.span).to_tokens(tokens);
89 if let Some((result, langle, rangle)) = self.throws_tokens {
90 result.to_tokens(tokens);
91 langle.to_tokens(tokens);
92 ret.to_tokens(tokens);
93 rangle.to_tokens(tokens);
94 } else {
95 ret.to_tokens(tokens);
96 }
97 }
David Tolnayc071b892020-03-18 16:59:53 -070098 }
99}
David Tolnayfb6e3862020-04-20 01:33:23 -0700100
101impl ToTokens for Receiver {
102 fn to_tokens(&self, tokens: &mut TokenStream) {
103 self.ampersand.to_tokens(tokens);
104 self.mutability.to_tokens(tokens);
David Tolnay05e11cc2020-04-20 02:13:56 -0700105 self.ty.to_tokens(tokens);
David Tolnayfb6e3862020-04-20 01:33:23 -0700106 }
107}