@@ -2,8 +2,8 @@ use proc_macro2::{Span, TokenStream};
2
2
use std:: mem;
3
3
use syn:: visit_mut:: { self , VisitMut } ;
4
4
use syn:: {
5
- parse_quote_spanned, token, Expr , GenericArgument , Lifetime , Receiver , Type , TypeImplTrait ,
6
- TypeParen , TypeReference ,
5
+ parse_quote_spanned, token, Expr , GenericArgument , Lifetime , Receiver , ReturnType , Type ,
6
+ TypeBareFn , TypeImplTrait , TypeParen , TypePtr , TypeReference ,
7
7
} ;
8
8
9
9
pub struct CollectLifetimes {
@@ -81,19 +81,35 @@ impl VisitMut for AddLifetimeToImplTrait {
81
81
}
82
82
83
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
- }
84
+ parenthesize_impl_trait ( & mut ty. elem , ty. and_token . span ) ;
91
85
visit_mut:: visit_type_reference_mut ( self , ty) ;
92
86
}
93
87
88
+ fn visit_type_ptr_mut ( & mut self , ty : & mut TypePtr ) {
89
+ parenthesize_impl_trait ( & mut ty. elem , ty. star_token . span ) ;
90
+ visit_mut:: visit_type_ptr_mut ( self , ty) ;
91
+ }
92
+
93
+ fn visit_type_bare_fn_mut ( & mut self , ty : & mut TypeBareFn ) {
94
+ if let ReturnType :: Type ( arrow, return_type) = & mut ty. output {
95
+ parenthesize_impl_trait ( return_type, arrow. spans [ 0 ] ) ;
96
+ }
97
+ visit_mut:: visit_type_bare_fn_mut ( self , ty) ;
98
+ }
99
+
94
100
fn visit_expr_mut ( & mut self , _e : & mut Expr ) {
95
101
// Do not recurse into impl Traits inside of an array length expression.
96
102
//
97
103
// fn outer(arg: [u8; { fn inner(_: impl Trait) {}; 0 }]);
98
104
}
99
105
}
106
+
107
+ fn parenthesize_impl_trait ( elem : & mut Type , paren_span : Span ) {
108
+ if let Type :: ImplTrait ( _) = * elem {
109
+ let placeholder = Type :: Verbatim ( TokenStream :: new ( ) ) ;
110
+ * elem = Type :: Paren ( TypeParen {
111
+ paren_token : token:: Paren ( paren_span) ,
112
+ elem : Box :: new ( mem:: replace ( elem, placeholder) ) ,
113
+ } ) ;
114
+ }
115
+ }
0 commit comments