Skip to content

Commit e26dad7

Browse files
authored
Merge pull request #205 from dtolnay/paren
Use parentheses to disambiguate impl Trait
2 parents a4c76a6 + 91401c8 commit e26dad7

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/lifetime.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
use proc_macro2::Span;
1+
use proc_macro2::{Span, TokenStream};
2+
use std::mem;
23
use syn::visit_mut::{self, VisitMut};
34
use syn::{
4-
parse_quote_spanned, Expr, GenericArgument, Lifetime, Receiver, TypeImplTrait, TypeReference,
5+
parse_quote_spanned, token, Expr, GenericArgument, Lifetime, Receiver, Type, TypeImplTrait,
6+
TypeParen, TypeReference,
57
};
68

79
pub struct CollectLifetimes {
@@ -78,6 +80,17 @@ impl VisitMut for AddLifetimeToImplTrait {
7880
visit_mut::visit_type_impl_trait_mut(self, ty);
7981
}
8082

83+
fn visit_type_reference_mut(&mut self, ty: &mut TypeReference) {
84+
if let Type::ImplTrait(_) = *ty.elem {
85+
let elem = mem::replace(&mut *ty.elem, Type::Verbatim(TokenStream::new()));
86+
*ty.elem = Type::Paren(TypeParen {
87+
paren_token: token::Paren(ty.and_token.span),
88+
elem: Box::new(elem),
89+
});
90+
}
91+
visit_mut::visit_type_reference_mut(self, ty);
92+
}
93+
8194
fn visit_expr_mut(&mut self, _e: &mut Expr) {
8295
// Do not recurse into impl Traits inside of an array length expression.
8396
//

tests/test.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,3 +1439,13 @@ pub mod issue199 {
14391439
assert_eq!(counter.get(), 1);
14401440
}
14411441
}
1442+
1443+
// https://github.com/dtolnay/async-trait/issues/204
1444+
pub mod issue204 {
1445+
use async_trait::async_trait;
1446+
1447+
#[async_trait]
1448+
pub trait Trait {
1449+
async fn f(arg: &impl Trait);
1450+
}
1451+
}

0 commit comments

Comments
 (0)