11use crate :: ImplTraitPosition ;
22
3+ use super :: errors:: { GenericTypeWithParentheses , UseAngleBrackets } ;
34use super :: ResolverAstLoweringExt ;
45use super :: { GenericArgsCtor , LifetimeRes , ParenthesizedGenericArgs } ;
56use super :: { ImplTraitContext , LoweringContext , ParamMode } ;
67
78use rustc_ast:: { self as ast, * } ;
8- use rustc_errors:: { struct_span_err, Applicability } ;
99use rustc_hir as hir;
1010use rustc_hir:: def:: { DefKind , PartialRes , Res } ;
1111use rustc_hir:: GenericArg ;
@@ -185,18 +185,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
185185 ) -> hir:: PathSegment < ' hir > {
186186 debug ! ( "path_span: {:?}, lower_path_segment(segment: {:?})" , path_span, segment, ) ;
187187 let ( mut generic_args, infer_args) = if let Some ( ref generic_args) = segment. args {
188- let msg = "parenthesized type parameters may only be used with a `Fn` trait" ;
189188 match * * generic_args {
190189 GenericArgs :: AngleBracketed ( ref data) => {
191190 self . lower_angle_bracketed_parameter_data ( data, param_mode, itctx)
192191 }
193192 GenericArgs :: Parenthesized ( ref data) => match parenthesized_generic_args {
194193 ParenthesizedGenericArgs :: Ok => self . lower_parenthesized_parameter_data ( data) ,
195194 ParenthesizedGenericArgs :: Err => {
196- let mut err = struct_span_err ! ( self . tcx. sess, data. span, E0214 , "{}" , msg) ;
197- err. span_label ( data. span , "only `Fn` traits may use parentheses" ) ;
198195 // Suggest replacing parentheses with angle brackets `Trait(params...)` to `Trait<params...>`
199- if !data. inputs . is_empty ( ) {
196+ let sub = if !data. inputs . is_empty ( ) {
200197 // Start of the span to the 1st character of 1st argument
201198 let open_param = data. inputs_span . shrink_to_lo ( ) . to ( data
202199 . inputs
@@ -212,16 +209,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
212209 . span
213210 . shrink_to_hi ( )
214211 . to ( data. inputs_span . shrink_to_hi ( ) ) ;
215- err. multipart_suggestion (
216- & format ! ( "use angle brackets instead" , ) ,
217- vec ! [
218- ( open_param, String :: from( "<" ) ) ,
219- ( close_param, String :: from( ">" ) ) ,
220- ] ,
221- Applicability :: MaybeIncorrect ,
222- ) ;
223- }
224- err. emit ( ) ;
212+
213+ Some ( UseAngleBrackets { open_param, close_param } )
214+ } else {
215+ None
216+ } ;
217+ self . tcx . sess . emit_err ( GenericTypeWithParentheses { span : data. span , sub } ) ;
225218 (
226219 self . lower_angle_bracketed_parameter_data (
227220 & data. as_angle_bracketed_args ( ) ,
0 commit comments