@@ -2,8 +2,8 @@ use proc_macro2::{Span, TokenStream};
22use std:: mem;
33use syn:: visit_mut:: { self , VisitMut } ;
44use 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 ,
77} ;
88
99pub struct CollectLifetimes {
@@ -81,19 +81,35 @@ impl VisitMut for AddLifetimeToImplTrait {
8181 }
8282
8383 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 ) ;
9185 visit_mut:: visit_type_reference_mut ( self , ty) ;
9286 }
9387
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+
94100 fn visit_expr_mut ( & mut self , _e : & mut Expr ) {
95101 // Do not recurse into impl Traits inside of an array length expression.
96102 //
97103 // fn outer(arg: [u8; { fn inner(_: impl Trait) {}; 0 }]);
98104 }
99105}
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