@@ -46,7 +46,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
46
46
use rustc_data_structures:: sorted_map:: SortedMap ;
47
47
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
48
48
use rustc_data_structures:: sync:: Lrc ;
49
- use rustc_errors:: struct_span_err;
49
+ use rustc_errors:: { struct_span_err, Applicability } ;
50
50
use rustc_hir as hir;
51
51
use rustc_hir:: def:: { DefKind , Namespace , PartialRes , PerNS , Res } ;
52
52
use rustc_hir:: def_id:: { DefId , DefPathHash , LocalDefId , CRATE_DEF_ID } ;
@@ -901,7 +901,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
901
901
mut itctx : ImplTraitContext < ' _ , ' hir > ,
902
902
) -> hir:: TypeBinding < ' hir > {
903
903
debug ! ( "lower_assoc_ty_constraint(constraint={:?}, itctx={:?})" , constraint, itctx) ;
904
-
905
904
// lower generic arguments of identifier in constraint
906
905
let gen_args = if let Some ( ref gen_args) = constraint. gen_args {
907
906
let gen_args_ctor = match gen_args {
@@ -918,7 +917,40 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
918
917
gen_args. span ( ) ,
919
918
"parenthesized generic arguments cannot be used in associated type constraints"
920
919
) ;
921
- // FIXME: try to write a suggestion here
920
+ if let Ok ( snippet) = self . sess . source_map ( ) . span_to_snippet ( data. span ) {
921
+ // Suggest replacing parentheses with angle brackets `Trait(params...)` to `Trait<params...>`
922
+ if !data. inputs . is_empty ( ) {
923
+ // Suggest replacing `(` and `)` with `<` and `>`
924
+ // The snippet may be missing the closing `)`, skip that case
925
+ if snippet. ends_with ( ')' ) {
926
+ if let Some ( split) = snippet. find ( '(' ) {
927
+ let trait_name = & snippet[ 0 ..split] ;
928
+ let args = & snippet[ split + 1 ..snippet. len ( ) - 1 ] ;
929
+ err. span_suggestion (
930
+ data. span ,
931
+ "use angle brackets instead" ,
932
+ format ! ( "{}<{}>" , trait_name, args) ,
933
+ Applicability :: MaybeIncorrect ,
934
+ ) ;
935
+ }
936
+ }
937
+ }
938
+ // Suggest removing empty parentheses: "Trait()" -> "Trait"
939
+ else {
940
+ // The snippet may be missing the closing `)`, skip that case
941
+ if snippet. ends_with ( ')' ) {
942
+ if let Some ( split) = snippet. find ( '(' ) {
943
+ let trait_name = & snippet[ 0 ..split] ;
944
+ err. span_suggestion (
945
+ data. span ,
946
+ "remove parentheses" ,
947
+ format ! ( "{}" , trait_name) ,
948
+ Applicability :: MaybeIncorrect ,
949
+ ) ;
950
+ }
951
+ }
952
+ }
953
+ } ;
922
954
err. emit ( ) ;
923
955
self . lower_angle_bracketed_parameter_data (
924
956
& data. as_angle_bracketed_args ( ) ,
0 commit comments