blob: 3de0330bacb9dc00658f3392f8a5d6467ace869e [file] [log] [blame]
David Tolnayeb55cee2021-03-27 00:24:32 -04001use crate::syntax::instantiate::NamedImplKey;
David Tolnay795e7b42021-03-26 22:08:18 -04002use crate::syntax::resolve::Resolution;
3use crate::syntax::Impl;
4use proc_macro2::TokenStream;
5use quote::ToTokens;
David Tolnaye294a2b2021-04-02 01:22:56 -04006use syn::Token;
David Tolnay795e7b42021-03-26 22:08:18 -04007
8pub struct ImplGenerics<'a> {
9 explicit_impl: Option<&'a Impl>,
10 resolve: Resolution<'a>,
11}
12
13pub struct TyGenerics<'a> {
David Tolnayeb55cee2021-03-27 00:24:32 -040014 key: NamedImplKey<'a>,
David Tolnay795e7b42021-03-26 22:08:18 -040015 explicit_impl: Option<&'a Impl>,
16 resolve: Resolution<'a>,
17}
18
19pub fn split_for_impl<'a>(
David Tolnayeb55cee2021-03-27 00:24:32 -040020 key: NamedImplKey<'a>,
David Tolnay795e7b42021-03-26 22:08:18 -040021 explicit_impl: Option<&'a Impl>,
22 resolve: Resolution<'a>,
23) -> (ImplGenerics<'a>, TyGenerics<'a>) {
24 let impl_generics = ImplGenerics {
25 explicit_impl,
26 resolve,
27 };
28 let ty_generics = TyGenerics {
David Tolnayeb55cee2021-03-27 00:24:32 -040029 key,
David Tolnay795e7b42021-03-26 22:08:18 -040030 explicit_impl,
31 resolve,
32 };
33 (impl_generics, ty_generics)
34}
35
36impl<'a> ToTokens for ImplGenerics<'a> {
37 fn to_tokens(&self, tokens: &mut TokenStream) {
38 if let Some(imp) = self.explicit_impl {
39 imp.impl_generics.to_tokens(tokens);
40 } else {
41 self.resolve.generics.to_tokens(tokens);
42 }
43 }
44}
45
46impl<'a> ToTokens for TyGenerics<'a> {
47 fn to_tokens(&self, tokens: &mut TokenStream) {
48 if let Some(imp) = self.explicit_impl {
49 imp.ty_generics.to_tokens(tokens);
David Tolnaye294a2b2021-04-02 01:22:56 -040050 } else if !self.resolve.generics.lifetimes.is_empty() {
51 let span = self.key.rust.span();
52 self.key
53 .lt_token
54 .unwrap_or_else(|| Token![<](span))
55 .to_tokens(tokens);
David Tolnayeb55cee2021-03-27 00:24:32 -040056 self.resolve.generics.lifetimes.to_tokens(tokens);
David Tolnaye294a2b2021-04-02 01:22:56 -040057 self.key
58 .gt_token
59 .unwrap_or_else(|| Token![>](span))
60 .to_tokens(tokens);
David Tolnay795e7b42021-03-26 22:08:18 -040061 }
62 }
63}