@@ -108,76 +108,80 @@ fn collect_used_generics<'gp>(
108108 }
109109
110110 let mut generics = Vec :: new ( ) ;
111- walk_ty ( ty, & mut |ty| match ty {
112- ast:: Type :: PathType ( ty) => {
113- if let Some ( path) = ty. path ( ) {
114- if let Some ( name_ref) = path. as_single_name_ref ( ) {
115- if let Some ( param) = known_generics. iter ( ) . find ( |gp| {
116- match gp {
117- ast:: GenericParam :: ConstParam ( cp) => cp. name ( ) ,
118- ast:: GenericParam :: TypeParam ( tp) => tp. name ( ) ,
119- _ => None ,
111+ walk_ty ( ty, & mut |ty| {
112+ match ty {
113+ ast:: Type :: PathType ( ty) => {
114+ if let Some ( path) = ty. path ( ) {
115+ if let Some ( name_ref) = path. as_single_name_ref ( ) {
116+ if let Some ( param) = known_generics. iter ( ) . find ( |gp| {
117+ match gp {
118+ ast:: GenericParam :: ConstParam ( cp) => cp. name ( ) ,
119+ ast:: GenericParam :: TypeParam ( tp) => tp. name ( ) ,
120+ _ => None ,
121+ }
122+ . map_or ( false , |n| n. text ( ) == name_ref. text ( ) )
123+ } ) {
124+ generics. push ( param) ;
120125 }
121- . map_or ( false , |n| n. text ( ) == name_ref. text ( ) )
122- } ) {
123- generics. push ( param) ;
124126 }
127+ generics. extend (
128+ path. segments ( )
129+ . filter_map ( |seg| seg. generic_arg_list ( ) )
130+ . flat_map ( |it| it. generic_args ( ) )
131+ . filter_map ( |it| match it {
132+ ast:: GenericArg :: LifetimeArg ( lt) => {
133+ let lt = lt. lifetime ( ) ?;
134+ known_generics. iter ( ) . find ( find_lifetime ( & lt. text ( ) ) )
135+ }
136+ _ => None ,
137+ } ) ,
138+ ) ;
125139 }
126- generics. extend (
127- path. segments ( )
128- . filter_map ( |seg| seg. generic_arg_list ( ) )
129- . flat_map ( |it| it. generic_args ( ) )
130- . filter_map ( |it| match it {
131- ast:: GenericArg :: LifetimeArg ( lt) => {
132- let lt = lt. lifetime ( ) ?;
133- known_generics. iter ( ) . find ( find_lifetime ( & lt. text ( ) ) )
134- }
135- _ => None ,
136- } ) ,
137- ) ;
138140 }
139- }
140- ast :: Type :: ImplTraitType ( impl_ty ) => {
141- if let Some ( it ) = impl_ty . type_bound_list ( ) {
142- generics . extend (
143- it . bounds ( )
144- . filter_map ( |it| it . lifetime ( ) )
145- . filter_map ( |lt| known_generics . iter ( ) . find ( find_lifetime ( & lt . text ( ) ) ) ) ,
146- ) ;
141+ ast :: Type :: ImplTraitType ( impl_ty ) => {
142+ if let Some ( it ) = impl_ty . type_bound_list ( ) {
143+ generics . extend (
144+ it . bounds ( )
145+ . filter_map ( |it| it . lifetime ( ) )
146+ . filter_map ( |lt| known_generics . iter ( ) . find ( find_lifetime ( & lt . text ( ) ) ) ) ,
147+ ) ;
148+ }
147149 }
148- }
149- ast :: Type :: DynTraitType ( dyn_ty ) => {
150- if let Some ( it ) = dyn_ty . type_bound_list ( ) {
151- generics . extend (
152- it . bounds ( )
153- . filter_map ( |it| it . lifetime ( ) )
154- . filter_map ( |lt| known_generics . iter ( ) . find ( find_lifetime ( & lt . text ( ) ) ) ) ,
155- ) ;
150+ ast :: Type :: DynTraitType ( dyn_ty ) => {
151+ if let Some ( it ) = dyn_ty . type_bound_list ( ) {
152+ generics . extend (
153+ it . bounds ( )
154+ . filter_map ( |it| it . lifetime ( ) )
155+ . filter_map ( |lt| known_generics . iter ( ) . find ( find_lifetime ( & lt . text ( ) ) ) ) ,
156+ ) ;
157+ }
156158 }
157- }
158- ast:: Type :: RefType ( ref_) => generics. extend (
159- ref_. lifetime ( ) . and_then ( |lt| known_generics. iter ( ) . find ( find_lifetime ( & lt. text ( ) ) ) ) ,
160- ) ,
161- ast:: Type :: ArrayType ( ar) => {
162- if let Some ( expr) = ar. expr ( ) {
163- if let ast:: Expr :: PathExpr ( p) = expr {
164- if let Some ( path) = p. path ( ) {
165- if let Some ( name_ref) = path. as_single_name_ref ( ) {
166- if let Some ( param) = known_generics. iter ( ) . find ( |gp| {
167- if let ast:: GenericParam :: ConstParam ( cp) = gp {
168- cp. name ( ) . map_or ( false , |n| n. text ( ) == name_ref. text ( ) )
169- } else {
170- false
159+ ast:: Type :: RefType ( ref_) => generics. extend (
160+ ref_. lifetime ( )
161+ . and_then ( |lt| known_generics. iter ( ) . find ( find_lifetime ( & lt. text ( ) ) ) ) ,
162+ ) ,
163+ ast:: Type :: ArrayType ( ar) => {
164+ if let Some ( expr) = ar. expr ( ) {
165+ if let ast:: Expr :: PathExpr ( p) = expr {
166+ if let Some ( path) = p. path ( ) {
167+ if let Some ( name_ref) = path. as_single_name_ref ( ) {
168+ if let Some ( param) = known_generics. iter ( ) . find ( |gp| {
169+ if let ast:: GenericParam :: ConstParam ( cp) = gp {
170+ cp. name ( ) . map_or ( false , |n| n. text ( ) == name_ref. text ( ) )
171+ } else {
172+ false
173+ }
174+ } ) {
175+ generics. push ( param) ;
171176 }
172- } ) {
173- generics. push ( param) ;
174177 }
175178 }
176179 }
177180 }
178181 }
179- }
180- _ => ( ) ,
182+ _ => ( ) ,
183+ } ;
184+ false
181185 } ) ;
182186 // stable resort to lifetime, type, const
183187 generics. sort_by_key ( |gp| match gp {
0 commit comments