Skip to content

Commit 445c29e

Browse files
committed
Use inline bounds instead of where clauses
1 parent aca6d29 commit 445c29e

File tree

3 files changed

+28
-26
lines changed

3 files changed

+28
-26
lines changed

rust-toolchain.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[toolchain]
2+
channel = "nightly"

trait_transformer/src/lib.rs

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,8 @@ fn transform_trait(attrs: &Attrs, tr: &ItemTrait) -> TokenStream {
6868
.traits
6969
.iter()
7070
.map(|attr| {
71-
let mut new_trait = ItemTrait {
72-
attrs: Vec::new(),
73-
ident: attr.subtrait_name.clone(),
74-
items: Vec::new(),
75-
..tr.clone()
76-
};
77-
new_trait
78-
.supertraits
79-
.push(syn::TypeParamBound::Trait(TraitBound {
80-
paren_token: None,
81-
modifier: TraitBoundModifier::None,
82-
lifetimes: None,
83-
path: attr.subtrait.clone(),
84-
}));
85-
let where_clause = new_trait.generics.make_where_clause();
86-
8771
let subtrait = &attr.subtrait;
88-
for item in tr.items.iter() {
72+
let fn_bounds = tr.items.iter().filter_map(|item| {
8973
match item {
9074
TraitItem::Fn(item_fn) => {
9175
let is_async = item_fn.sig.asyncness.is_some();
@@ -98,20 +82,34 @@ fn transform_trait(attrs: &Attrs, tr: &ItemTrait) -> TokenStream {
9882

9983
if is_async || returns_impl_trait {
10084
let name = &item_fn.sig.ident;
101-
where_clause
102-
.predicates
103-
.push(WherePredicate::Type(PredicateType {
104-
lifetimes: None,
105-
bounded_ty: Type::Verbatim(quote!(Self::#name())),
106-
colon_token: Token![:](Span::call_site()),
107-
bounds: parse_quote!(#subtrait),
108-
}));
85+
return Some(quote! { #name(): #subtrait });
10986
}
11087
}
11188
_ => (),
11289
}
90+
None
91+
});
92+
93+
let tr_ident = &tr.ident;
94+
let supertrait = syn::TypeParamBound::Verbatim(quote! {
95+
#tr_ident<#(#fn_bounds),*>
96+
});
97+
98+
ItemTrait {
99+
attrs: Vec::new(),
100+
ident: attr.subtrait_name.clone(),
101+
items: Vec::new(),
102+
supertraits: Punctuated::from_iter(vec![
103+
supertrait,
104+
syn::TypeParamBound::Trait(TraitBound {
105+
paren_token: None,
106+
modifier: TraitBoundModifier::None,
107+
lifetimes: None,
108+
path: attr.subtrait.clone(),
109+
}),
110+
].into_iter()),
111+
..tr.clone()
113112
}
114-
new_trait
115113
})
116114
.collect::<Vec<_>>();
117115

trait_transformer_test/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
// option. This file may not be copied, modified, or distributed
77
// except according to those terms.
88

9+
#![feature(async_fn_in_trait, return_position_impl_trait_in_trait, return_type_notation)]
10+
911
use trait_transformer::trait_transformer;
1012

1113
#[trait_transformer(SendIntFactory: Send)]

0 commit comments

Comments
 (0)