@@ -196,25 +196,32 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
196
196
ParenthesizedGenericArgs :: Err => {
197
197
let mut err = struct_span_err ! ( self . sess, data. span, E0214 , "{}" , msg) ;
198
198
err. span_label ( data. span , "only `Fn` traits may use parentheses" ) ;
199
- if let Ok ( snippet) = self . sess . source_map ( ) . span_to_snippet ( data. span ) {
200
- // Do not suggest going from `Trait()` to `Trait<>`
201
- if !data. inputs . is_empty ( ) {
202
- // Suggest replacing `(` and `)` with `<` and `>`
203
- // The snippet may be missing the closing `)`, skip that case
204
- if snippet. ends_with ( ')' ) {
205
- if let Some ( split) = snippet. find ( '(' ) {
206
- let trait_name = & snippet[ 0 ..split] ;
207
- let args = & snippet[ split + 1 ..snippet. len ( ) - 1 ] ;
208
- err. span_suggestion (
209
- data. span ,
210
- "use angle brackets instead" ,
211
- format ! ( "{}<{}>" , trait_name, args) ,
212
- Applicability :: MaybeIncorrect ,
213
- ) ;
214
- }
215
- }
216
- }
217
- } ;
199
+ // Suggest replacing parentheses with angle brackets `Trait(params...)` to `Trait<params...>`
200
+ if !data. inputs . is_empty ( ) {
201
+ // Start of the span to the 1st character of 1st argument
202
+ let open_param = data. inputs_span . shrink_to_lo ( ) . to ( data
203
+ . inputs
204
+ . first ( )
205
+ . unwrap ( )
206
+ . span
207
+ . shrink_to_lo ( ) ) ;
208
+ // Last character position of last argument to the end of the span
209
+ let close_param = data
210
+ . inputs
211
+ . last ( )
212
+ . unwrap ( )
213
+ . span
214
+ . shrink_to_hi ( )
215
+ . to ( data. inputs_span . shrink_to_hi ( ) ) ;
216
+ err. multipart_suggestion (
217
+ & format ! ( "use angle brackets instead" , ) ,
218
+ vec ! [
219
+ ( open_param, String :: from( "<" ) ) ,
220
+ ( close_param, String :: from( ">" ) ) ,
221
+ ] ,
222
+ Applicability :: MaybeIncorrect ,
223
+ ) ;
224
+ }
218
225
err. emit ( ) ;
219
226
(
220
227
self . lower_angle_bracketed_parameter_data (
0 commit comments