@@ -196,25 +196,32 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
196196 ParenthesizedGenericArgs :: Err => {
197197 let mut err = struct_span_err ! ( self . sess, data. span, E0214 , "{}" , msg) ;
198198 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+ }
218225 err. emit ( ) ;
219226 (
220227 self . lower_angle_bracketed_parameter_data (
0 commit comments