aboutsummaryrefslogtreecommitdiff
path: root/macro/src/generics.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macro/src/generics.rs')
-rw-r--r--macro/src/generics.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/macro/src/generics.rs b/macro/src/generics.rs
new file mode 100644
index 00000000..3de0330b
--- /dev/null
+++ b/macro/src/generics.rs
@@ -0,0 +1,63 @@
+use crate::syntax::instantiate::NamedImplKey;
+use crate::syntax::resolve::Resolution;
+use crate::syntax::Impl;
+use proc_macro2::TokenStream;
+use quote::ToTokens;
+use syn::Token;
+
+pub struct ImplGenerics<'a> {
+ explicit_impl: Option<&'a Impl>,
+ resolve: Resolution<'a>,
+}
+
+pub struct TyGenerics<'a> {
+ key: NamedImplKey<'a>,
+ explicit_impl: Option<&'a Impl>,
+ resolve: Resolution<'a>,
+}
+
+pub fn split_for_impl<'a>(
+ key: NamedImplKey<'a>,
+ explicit_impl: Option<&'a Impl>,
+ resolve: Resolution<'a>,
+) -> (ImplGenerics<'a>, TyGenerics<'a>) {
+ let impl_generics = ImplGenerics {
+ explicit_impl,
+ resolve,
+ };
+ let ty_generics = TyGenerics {
+ key,
+ explicit_impl,
+ resolve,
+ };
+ (impl_generics, ty_generics)
+}
+
+impl<'a> ToTokens for ImplGenerics<'a> {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ if let Some(imp) = self.explicit_impl {
+ imp.impl_generics.to_tokens(tokens);
+ } else {
+ self.resolve.generics.to_tokens(tokens);
+ }
+ }
+}
+
+impl<'a> ToTokens for TyGenerics<'a> {
+ fn to_tokens(&self, tokens: &mut TokenStream) {
+ if let Some(imp) = self.explicit_impl {
+ imp.ty_generics.to_tokens(tokens);
+ } else if !self.resolve.generics.lifetimes.is_empty() {
+ let span = self.key.rust.span();
+ self.key
+ .lt_token
+ .unwrap_or_else(|| Token![<](span))
+ .to_tokens(tokens);
+ self.resolve.generics.lifetimes.to_tokens(tokens);
+ self.key
+ .gt_token
+ .unwrap_or_else(|| Token![>](span))
+ .to_tokens(tokens);
+ }
+ }
+}