@@ -21,6 +21,7 @@ use rustc_errors::{
21
21
} ;
22
22
use rustc_errors:: { pluralize, struct_span_err, Diagnostic , ErrorGuaranteed } ;
23
23
use rustc_macros:: { Diagnostic , Subdiagnostic } ;
24
+ use rustc_session:: errors:: ExprParenthesesNeeded ;
24
25
use rustc_span:: source_map:: Spanned ;
25
26
use rustc_span:: symbol:: { kw, sym, Ident } ;
26
27
use rustc_span:: { Span , SpanSnippetError , DUMMY_SP } ;
@@ -487,11 +488,24 @@ pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span);
487
488
488
489
#[ derive( Diagnostic ) ]
489
490
#[ diag( parser:: unexpected_token_after_label) ]
490
- pub ( crate ) struct UnexpectedTokenAfterLabel (
491
+ pub ( crate ) struct UnexpectedTokenAfterLabel {
491
492
#[ primary_span]
492
493
#[ label( parser:: unexpected_token_after_label) ]
493
- pub Span ,
494
- ) ;
494
+ pub span : Span ,
495
+ #[ suggestion_verbose( parser:: suggestion_remove_label, code = "" ) ]
496
+ pub remove_label : Option < Span > ,
497
+ #[ subdiagnostic]
498
+ pub enclose_in_block : Option < UnexpectedTokenAfterLabelSugg > ,
499
+ }
500
+
501
+ #[ derive( Subdiagnostic ) ]
502
+ #[ multipart_suggestion( parser:: suggestion_enclose_in_block, applicability = "machine-applicable" ) ]
503
+ pub ( crate ) struct UnexpectedTokenAfterLabelSugg {
504
+ #[ suggestion_part( code = "{{ " ) ]
505
+ pub left : Span ,
506
+ #[ suggestion_part( code = " }}" ) ]
507
+ pub right : Span ,
508
+ }
495
509
496
510
#[ derive( Diagnostic ) ]
497
511
#[ diag( parser:: require_colon_after_labeled_expression) ]
@@ -753,6 +767,236 @@ pub(crate) struct UseEmptyBlockNotSemi {
753
767
pub span : Span ,
754
768
}
755
769
770
+ #[ derive( Diagnostic ) ]
771
+ #[ diag( parser:: comparison_interpreted_as_generic) ]
772
+ pub ( crate ) struct ComparisonInterpretedAsGeneric {
773
+ #[ primary_span]
774
+ #[ label( parser:: label_comparison) ]
775
+ pub comparison : Span ,
776
+ pub typename : String ,
777
+ #[ label( parser:: label_args) ]
778
+ pub args : Span ,
779
+ #[ subdiagnostic]
780
+ pub suggestion : ComparisonOrShiftInterpretedAsGenericSugg ,
781
+ }
782
+
783
+ #[ derive( Diagnostic ) ]
784
+ #[ diag( parser:: shift_interpreted_as_generic) ]
785
+ pub ( crate ) struct ShiftInterpretedAsGeneric {
786
+ #[ primary_span]
787
+ #[ label( parser:: label_comparison) ]
788
+ pub shift : Span ,
789
+ pub typename : String ,
790
+ #[ label( parser:: label_args) ]
791
+ pub args : Span ,
792
+ #[ subdiagnostic]
793
+ pub suggestion : ComparisonOrShiftInterpretedAsGenericSugg ,
794
+ }
795
+
796
+ #[ derive( Subdiagnostic ) ]
797
+ #[ multipart_suggestion( parser:: suggestion, applicability = "machine-applicable" ) ]
798
+ pub ( crate ) struct ComparisonOrShiftInterpretedAsGenericSugg {
799
+ #[ suggestion_part( code = "(" ) ]
800
+ pub left : Span ,
801
+ #[ suggestion_part( code = ")" ) ]
802
+ pub right : Span ,
803
+ }
804
+
805
+ #[ derive( Diagnostic ) ]
806
+ #[ diag( parser:: found_expr_would_be_stmt) ]
807
+ pub ( crate ) struct FoundExprWouldBeStmt {
808
+ #[ primary_span]
809
+ #[ label]
810
+ pub span : Span ,
811
+ pub token : String ,
812
+ #[ subdiagnostic]
813
+ pub suggestion : ExprParenthesesNeeded ,
814
+ }
815
+
816
+ #[ derive( Diagnostic ) ]
817
+ #[ diag( parser:: leading_plus_not_supported) ]
818
+ pub ( crate ) struct LeadingPlusNotSupported {
819
+ #[ primary_span]
820
+ #[ label]
821
+ pub span : Span ,
822
+ #[ suggestion_verbose(
823
+ parser:: suggestion_remove_plus,
824
+ code = "" ,
825
+ applicability = "machine-applicable"
826
+ ) ]
827
+ pub remove_plus : Option < Span > ,
828
+ #[ subdiagnostic]
829
+ pub add_parentheses : Option < ExprParenthesesNeeded > ,
830
+ }
831
+
832
+ #[ derive( Diagnostic ) ]
833
+ #[ diag( parser:: parentheses_with_struct_fields) ]
834
+ pub ( crate ) struct ParenthesesWithStructFields {
835
+ #[ primary_span]
836
+ pub span : Span ,
837
+ pub name : String ,
838
+ #[ subdiagnostic]
839
+ pub braces_for_struct : BracesForStructLiteral ,
840
+ #[ subdiagnostic]
841
+ pub no_fields_for_fn : NoFieldsForFnCall ,
842
+ }
843
+
844
+ #[ derive( Subdiagnostic ) ]
845
+ #[ multipart_suggestion( parser:: suggestion_braces_for_struct, applicability = "maybe-incorrect" ) ]
846
+ pub ( crate ) struct BracesForStructLiteral {
847
+ #[ suggestion_part( code = " {{ " ) ]
848
+ pub first : Span ,
849
+ #[ suggestion_part( code = " }}" ) ]
850
+ pub second : Span ,
851
+ }
852
+
853
+ #[ derive( Subdiagnostic ) ]
854
+ #[ multipart_suggestion( parser:: suggestion_no_fields_for_fn, applicability = "maybe-incorrect" ) ]
855
+ pub ( crate ) struct NoFieldsForFnCall {
856
+ #[ suggestion_part( code = "" ) ]
857
+ pub fields : Vec < Span > ,
858
+ }
859
+
860
+ #[ derive( Diagnostic ) ]
861
+ #[ diag( parser:: labeled_loop_in_break) ]
862
+ pub ( crate ) struct LabeledLoopInBreak {
863
+ #[ primary_span]
864
+ pub span : Span ,
865
+ #[ subdiagnostic]
866
+ pub sub : LabeledLoopInBreakSub ,
867
+ }
868
+
869
+ #[ derive( Subdiagnostic ) ]
870
+ #[ multipart_suggestion( parser:: suggestion, applicability = "machine-applicable" ) ]
871
+ pub ( crate ) struct LabeledLoopInBreakSub {
872
+ #[ suggestion_part( code = "(" ) ]
873
+ pub first : Span ,
874
+ #[ suggestion_part( code = ")" ) ]
875
+ pub second : Span ,
876
+ }
877
+
878
+ #[ derive( Diagnostic ) ]
879
+ #[ diag( parser:: array_brackets_instead_of_braces) ]
880
+ pub ( crate ) struct ArrayBracketsInsteadOfSpaces {
881
+ #[ primary_span]
882
+ pub span : Span ,
883
+ #[ subdiagnostic]
884
+ pub sub : ArrayBracketsInsteadOfSpacesSugg ,
885
+ }
886
+
887
+ #[ derive( Subdiagnostic ) ]
888
+ #[ multipart_suggestion( parser:: suggestion, applicability = "maybe-incorrect" ) ]
889
+ pub ( crate ) struct ArrayBracketsInsteadOfSpacesSugg {
890
+ #[ suggestion_part( code = "[" ) ]
891
+ pub left : Span ,
892
+ #[ suggestion_part( code = "]" ) ]
893
+ pub right : Span ,
894
+ }
895
+
896
+ #[ derive( Diagnostic ) ]
897
+ #[ diag( parser:: match_arm_body_without_braces) ]
898
+ pub ( crate ) struct MatchArmBodyWithoutBraces {
899
+ #[ primary_span]
900
+ #[ label( parser:: label_statements) ]
901
+ pub statements : Span ,
902
+ #[ label( parser:: label_arrow) ]
903
+ pub arrow : Span ,
904
+ pub num_statements : usize ,
905
+ #[ subdiagnostic]
906
+ pub sub : MatchArmBodyWithoutBracesSugg ,
907
+ }
908
+
909
+ #[ derive( Subdiagnostic ) ]
910
+ pub ( crate ) enum MatchArmBodyWithoutBracesSugg {
911
+ #[ multipart_suggestion( parser:: suggestion_add_braces, applicability = "machine-applicable" ) ]
912
+ AddBraces {
913
+ #[ suggestion_part( code = "{{ " ) ]
914
+ left : Span ,
915
+ #[ suggestion_part( code = " }}" ) ]
916
+ right : Span ,
917
+ } ,
918
+ #[ suggestion(
919
+ parser:: suggestion_use_comma_not_semicolon,
920
+ code = "," ,
921
+ applicability = "machine-applicable"
922
+ ) ]
923
+ UseComma {
924
+ #[ primary_span]
925
+ semicolon : Span ,
926
+ } ,
927
+ }
928
+
929
+ #[ derive( Diagnostic ) ]
930
+ #[ diag( parser:: struct_literal_not_allowed_here) ]
931
+ pub ( crate ) struct StructLiteralNotAllowedHere {
932
+ #[ primary_span]
933
+ pub span : Span ,
934
+ #[ subdiagnostic]
935
+ pub sub : StructLiteralNotAllowedHereSugg ,
936
+ }
937
+
938
+ #[ derive( Subdiagnostic ) ]
939
+ #[ multipart_suggestion( parser:: suggestion, applicability = "machine-applicable" ) ]
940
+ pub ( crate ) struct StructLiteralNotAllowedHereSugg {
941
+ #[ suggestion_part( code = "(" ) ]
942
+ pub left : Span ,
943
+ #[ suggestion_part( code = ")" ) ]
944
+ pub right : Span ,
945
+ }
946
+
947
+ #[ derive( Diagnostic ) ]
948
+ #[ diag( parser:: invalid_interpolated_expression) ]
949
+ pub ( crate ) struct InvalidInterpolatedExpression {
950
+ #[ primary_span]
951
+ pub span : Span ,
952
+ }
953
+
954
+ #[ derive( Diagnostic ) ]
955
+ #[ diag( parser:: hexadecimal_float_literal_not_supported) ]
956
+ pub ( crate ) struct HexadecimalFloatLiteralNotSupported {
957
+ #[ primary_span]
958
+ #[ label( parser:: not_supported) ]
959
+ pub span : Span ,
960
+ }
961
+
962
+ #[ derive( Diagnostic ) ]
963
+ #[ diag( parser:: octal_float_literal_not_supported) ]
964
+ pub ( crate ) struct OctalFloatLiteralNotSupported {
965
+ #[ primary_span]
966
+ #[ label( parser:: not_supported) ]
967
+ pub span : Span ,
968
+ }
969
+
970
+ #[ derive( Diagnostic ) ]
971
+ #[ diag( parser:: binary_float_literal_not_supported) ]
972
+ pub ( crate ) struct BinaryFloatLiteralNotSupported {
973
+ #[ primary_span]
974
+ #[ label( parser:: not_supported) ]
975
+ pub span : Span ,
976
+ }
977
+
978
+ #[ derive( Diagnostic ) ]
979
+ #[ diag( parser:: non_string_abi_literal) ]
980
+ pub ( crate ) struct NonStringAbiLiteral {
981
+ #[ primary_span]
982
+ #[ suggestion( code = "\" C\" " , applicability = "maybe-incorrect" ) ]
983
+ pub span : Span ,
984
+ }
985
+
986
+ #[ derive( Diagnostic ) ]
987
+ #[ diag( parser:: mismatched_closing_delimiter) ]
988
+ pub ( crate ) struct MismatchedClosingDelimiter {
989
+ #[ primary_span]
990
+ pub spans : Vec < Span > ,
991
+ pub delimiter : String ,
992
+ #[ label( parser:: label_unmatched) ]
993
+ pub unmatched : Span ,
994
+ #[ label( parser:: label_opening_candidate) ]
995
+ pub opening_candidate : Option < Span > ,
996
+ #[ label( parser:: label_unclosed) ]
997
+ pub unclosed : Option < Span > ,
998
+ }
999
+
756
1000
// SnapshotParser is used to create a snapshot of the parser
757
1001
// without causing duplicate errors being emitted when the `Parser`
758
1002
// is dropped.
0 commit comments