blob: 3d67a0a5308856dee73206f2e1c53065171353f5 [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 }
Myron Ahneba35cf2020-02-05 19:41:51 +070017 Type::RustBox(ty) | Type::UniquePtr(ty) | Type::Vector(ty) | Type::RustVec(ty) => {
18 ty.to_tokens(tokens)
19 }
Adrian Taylorf5dd5522020-04-13 16:50:14 -070020 Type::Ref(r) | Type::Str(r) | Type::SliceRefU8(r) => r.to_tokens(tokens),
21 Type::Slice(s) => s.to_tokens(tokens),
David Tolnayc071b892020-03-18 16:59:53 -070022 Type::Fn(f) => f.to_tokens(tokens),
David Tolnayd0bb3642020-03-15 23:27:11 -070023 Type::Void(span) => tokens.extend(quote_spanned!(*span=> ())),
David Tolnay7db73692019-10-20 14:51:12 -040024 }
25 }
26}
27
28impl ToTokens for Var {
29 fn to_tokens(&self, tokens: &mut TokenStream) {
30 self.ident.to_tokens(tokens);
31 Token![:](self.ident.span()).to_tokens(tokens);
32 self.ty.to_tokens(tokens);
33 }
34}
35
36impl ToTokens for Ty1 {
37 fn to_tokens(&self, tokens: &mut TokenStream) {
Myron Ahneba35cf2020-02-05 19:41:51 +070038 // Do not add cxx namespace to Vector since we're defining it in the user crate
39 if self.name == "UniquePtr" || self.name == "RustVec" {
David Tolnay7db73692019-10-20 14:51:12 -040040 let span = self.name.span();
41 tokens.extend(quote_spanned!(span=> ::cxx::));
42 }
43 self.name.to_tokens(tokens);
44 self.langle.to_tokens(tokens);
45 self.inner.to_tokens(tokens);
46 self.rangle.to_tokens(tokens);
47 }
48}
49
50impl ToTokens for Ref {
51 fn to_tokens(&self, tokens: &mut TokenStream) {
52 self.ampersand.to_tokens(tokens);
David Tolnay0bd50fa2020-04-22 15:31:33 -070053 self.lifetime.to_tokens(tokens);
David Tolnay7db73692019-10-20 14:51:12 -040054 self.mutability.to_tokens(tokens);
55 self.inner.to_tokens(tokens);
56 }
57}
58
Adrian Taylorf5dd5522020-04-13 16:50:14 -070059impl ToTokens for Slice {
60 fn to_tokens(&self, tokens: &mut TokenStream) {
61 self.bracket.surround(tokens, |tokens| {
62 self.inner.to_tokens(tokens);
63 });
64 }
65}
66
David Tolnay7db73692019-10-20 14:51:12 -040067impl ToTokens for Derive {
68 fn to_tokens(&self, tokens: &mut TokenStream) {
69 let name = match self {
70 Derive::Clone => "Clone",
71 Derive::Copy => "Copy",
72 };
73 Ident::new(name, Span::call_site()).to_tokens(tokens);
74 }
75}
76
77impl ToTokens for ExternFn {
78 fn to_tokens(&self, tokens: &mut TokenStream) {
David Tolnaye3a48152020-04-08 19:38:05 -070079 // Notional token range for error reporting purposes.
80 self.sig.fn_token.to_tokens(tokens);
81 self.semi_token.to_tokens(tokens);
David Tolnay7db73692019-10-20 14:51:12 -040082 }
83}
David Tolnayc071b892020-03-18 16:59:53 -070084
85impl ToTokens for Signature {
86 fn to_tokens(&self, tokens: &mut TokenStream) {
David Tolnaye3a48152020-04-08 19:38:05 -070087 self.fn_token.to_tokens(tokens);
88 self.paren_token.surround(tokens, |tokens| {
89 self.args.to_tokens(tokens);
90 });
91 if let Some(ret) = &self.ret {
92 Token![->](self.paren_token.span).to_tokens(tokens);
93 if let Some((result, langle, rangle)) = self.throws_tokens {
94 result.to_tokens(tokens);
95 langle.to_tokens(tokens);
96 ret.to_tokens(tokens);
97 rangle.to_tokens(tokens);
98 } else {
99 ret.to_tokens(tokens);
100 }
101 }
David Tolnayc071b892020-03-18 16:59:53 -0700102 }
103}
David Tolnayfb6e3862020-04-20 01:33:23 -0700104
David Tolnay18ba92c2020-04-22 16:17:30 -0700105pub struct ReceiverType<'a>(&'a Receiver);
106
107impl Receiver {
108 // &TheType
109 pub fn ty(&self) -> ReceiverType {
110 ReceiverType(self)
111 }
112}
113
114impl ToTokens for ReceiverType<'_> {
David Tolnayfb6e3862020-04-20 01:33:23 -0700115 fn to_tokens(&self, tokens: &mut TokenStream) {
David Tolnay18ba92c2020-04-22 16:17:30 -0700116 self.0.ampersand.to_tokens(tokens);
David Tolnay0bd50fa2020-04-22 15:31:33 -0700117 self.0.lifetime.to_tokens(tokens);
David Tolnay18ba92c2020-04-22 16:17:30 -0700118 self.0.mutability.to_tokens(tokens);
119 self.0.ty.to_tokens(tokens);
David Tolnayfb6e3862020-04-20 01:33:23 -0700120 }
121}