@@ -129,20 +129,23 @@ struct CollectItemTypesVisitor<'tcx> {
129
129
/// all already existing generic type parameters to avoid suggesting a name that is already in use.
130
130
crate fn placeholder_type_error (
131
131
tcx : TyCtxt < ' tcx > ,
132
- span : Span ,
132
+ span : Option < Span > ,
133
133
generics : & [ hir:: GenericParam < ' _ > ] ,
134
134
placeholder_types : Vec < Span > ,
135
135
suggest : bool ,
136
136
) {
137
137
if placeholder_types. is_empty ( ) {
138
138
return ;
139
139
}
140
- let type_name = generics. next_type_param_name ( None ) ;
141
140
141
+ let type_name = generics. next_type_param_name ( None ) ;
142
142
let mut sugg: Vec < _ > =
143
143
placeholder_types. iter ( ) . map ( |sp| ( * sp, ( * type_name) . to_string ( ) ) ) . collect ( ) ;
144
+
144
145
if generics. is_empty ( ) {
145
- sugg. push ( ( span, format ! ( "<{}>" , type_name) ) ) ;
146
+ if let Some ( span) = span {
147
+ sugg. push ( ( span, format ! ( "<{}>" , type_name) ) ) ;
148
+ }
146
149
} else if let Some ( arg) = generics. iter ( ) . find ( |arg| match arg. name {
147
150
hir:: ParamName :: Plain ( Ident { name : kw:: Underscore , .. } ) => true ,
148
151
_ => false ,
@@ -158,6 +161,7 @@ crate fn placeholder_type_error(
158
161
format ! ( ", {}" , type_name) ,
159
162
) ) ;
160
163
}
164
+
161
165
let mut err = bad_placeholder_type ( tcx, placeholder_types) ;
162
166
if suggest {
163
167
err. multipart_suggestion (
@@ -186,7 +190,7 @@ fn reject_placeholder_type_signatures_in_item(tcx: TyCtxt<'tcx>, item: &'tcx hir
186
190
let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
187
191
visitor. visit_item ( item) ;
188
192
189
- placeholder_type_error ( tcx, generics. span , & generics. params [ ..] , visitor. 0 , suggest) ;
193
+ placeholder_type_error ( tcx, Some ( generics. span ) , & generics. params [ ..] , visitor. 0 , suggest) ;
190
194
}
191
195
192
196
impl Visitor < ' tcx > for CollectItemTypesVisitor < ' tcx > {
@@ -722,7 +726,7 @@ fn convert_trait_item(tcx: TyCtxt<'_>, trait_item_id: hir::HirId) {
722
726
// Account for `const C: _;` and `type T = _;`.
723
727
let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
724
728
visitor. visit_trait_item ( trait_item) ;
725
- placeholder_type_error ( tcx, DUMMY_SP , & [ ] , visitor. 0 , false ) ;
729
+ placeholder_type_error ( tcx, None , & [ ] , visitor. 0 , false ) ;
726
730
}
727
731
728
732
hir:: TraitItemKind :: Type ( _, None ) => { }
@@ -745,7 +749,7 @@ fn convert_impl_item(tcx: TyCtxt<'_>, impl_item_id: hir::HirId) {
745
749
// Account for `type T = _;`
746
750
let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
747
751
visitor. visit_impl_item ( impl_item) ;
748
- placeholder_type_error ( tcx, DUMMY_SP , & [ ] , visitor. 0 , false ) ;
752
+ placeholder_type_error ( tcx, None , & [ ] , visitor. 0 , false ) ;
749
753
}
750
754
hir:: ImplItemKind :: Const ( ..) => { }
751
755
}
0 commit comments