1 use rustc_ast::token::Token;
3 use rustc_errors::{fluent, AddToDiagnostic, Applicability, EmissionGuarantee, IntoDiagnostic};
4 use rustc_macros::{Diagnostic, Subdiagnostic};
5 use rustc_session::errors::ExprParenthesesNeeded;
6 use rustc_span::symbol::Ident;
7 use rustc_span::{Span, Symbol};
9 use crate::parser::TokenDescription;
12 #[diag(parser_maybe_report_ambiguous_plus)]
13 pub(crate) struct AmbiguousPlus {
16 #[suggestion(code = "({sum_ty})")]
21 #[diag(parser_maybe_recover_from_bad_type_plus, code = "E0178")]
22 pub(crate) struct BadTypePlus {
27 pub sub: BadTypePlusSub,
30 #[derive(Subdiagnostic)]
31 pub(crate) enum BadTypePlusSub {
34 code = "{sum_with_parens}",
35 applicability = "machine-applicable"
38 sum_with_parens: String,
42 #[label(parser_forgot_paren)]
47 #[label(parser_expect_path)]
55 #[diag(parser_maybe_recover_from_bad_qpath_stage_2)]
56 pub(crate) struct BadQPathStage2 {
58 #[suggestion(code = "", applicability = "maybe-incorrect")]
64 #[diag(parser_incorrect_semicolon)]
65 pub(crate) struct IncorrectSemicolon<'a> {
67 #[suggestion_short(code = "", applicability = "machine-applicable")]
70 pub opt_help: Option<()>,
75 #[diag(parser_incorrect_use_of_await)]
76 pub(crate) struct IncorrectUseOfAwait {
78 #[suggestion(parentheses_suggestion, code = "", applicability = "machine-applicable")]
83 #[diag(parser_incorrect_use_of_await)]
84 pub(crate) struct IncorrectAwait {
87 #[suggestion(postfix_suggestion, code = "{expr}.await{question_mark}")]
88 pub sugg_span: (Span, Applicability),
90 pub question_mark: &'static str,
94 #[diag(parser_in_in_typo)]
95 pub(crate) struct InInTypo {
98 #[suggestion(code = "", applicability = "machine-applicable")]
102 #[derive(Diagnostic)]
103 #[diag(parser_invalid_variable_declaration)]
104 pub(crate) struct InvalidVariableDeclaration {
108 pub sub: InvalidVariableDeclarationSub,
111 #[derive(Subdiagnostic)]
112 pub(crate) enum InvalidVariableDeclarationSub {
113 #[suggestion(parser_switch_mut_let_order, applicability = "maybe-incorrect", code = "let mut")]
114 SwitchMutLetOrder(#[primary_span] Span),
116 parser_missing_let_before_mut,
117 applicability = "machine-applicable",
120 MissingLet(#[primary_span] Span),
121 #[suggestion(parser_use_let_not_auto, applicability = "machine-applicable", code = "let")]
122 UseLetNotAuto(#[primary_span] Span),
123 #[suggestion(parser_use_let_not_var, applicability = "machine-applicable", code = "let")]
124 UseLetNotVar(#[primary_span] Span),
127 #[derive(Diagnostic)]
128 #[diag(parser_invalid_comparison_operator)]
129 pub(crate) struct InvalidComparisonOperator {
134 pub sub: InvalidComparisonOperatorSub,
137 #[derive(Subdiagnostic)]
138 pub(crate) enum InvalidComparisonOperatorSub {
139 #[suggestion_short(use_instead, applicability = "machine-applicable", code = "{correct}")]
146 #[label(spaceship_operator_invalid)]
147 Spaceship(#[primary_span] Span),
150 #[derive(Diagnostic)]
151 #[diag(parser_invalid_logical_operator)]
153 pub(crate) struct InvalidLogicalOperator {
156 pub incorrect: String,
158 pub sub: InvalidLogicalOperatorSub,
161 #[derive(Subdiagnostic)]
162 pub(crate) enum InvalidLogicalOperatorSub {
164 use_amp_amp_for_conjunction,
165 applicability = "machine-applicable",
168 Conjunction(#[primary_span] Span),
170 use_pipe_pipe_for_disjunction,
171 applicability = "machine-applicable",
174 Disjunction(#[primary_span] Span),
177 #[derive(Diagnostic)]
178 #[diag(parser_tilde_is_not_unary_operator)]
179 pub(crate) struct TildeAsUnaryOperator(
181 #[suggestion_short(applicability = "machine-applicable", code = "!")]
185 #[derive(Diagnostic)]
186 #[diag(parser_unexpected_token_after_not)]
187 pub(crate) struct NotAsNegationOperator {
190 pub negated_desc: String,
192 pub sub: NotAsNegationOperatorSub,
195 #[derive(Subdiagnostic)]
196 pub enum NotAsNegationOperatorSub {
198 parser_unexpected_token_after_not_default,
199 applicability = "machine-applicable",
202 SuggestNotDefault(#[primary_span] Span),
205 parser_unexpected_token_after_not_bitwise,
206 applicability = "machine-applicable",
209 SuggestNotBitwise(#[primary_span] Span),
212 parser_unexpected_token_after_not_logical,
213 applicability = "machine-applicable",
216 SuggestNotLogical(#[primary_span] Span),
219 #[derive(Diagnostic)]
220 #[diag(parser_malformed_loop_label)]
221 pub(crate) struct MalformedLoopLabel {
223 #[suggestion(applicability = "machine-applicable", code = "{correct_label}")]
225 pub correct_label: Ident,
228 #[derive(Diagnostic)]
229 #[diag(parser_lifetime_in_borrow_expression)]
230 pub(crate) struct LifetimeInBorrowExpression {
233 #[suggestion(applicability = "machine-applicable", code = "")]
235 pub lifetime_span: Span,
238 #[derive(Diagnostic)]
239 #[diag(parser_field_expression_with_generic)]
240 pub(crate) struct FieldExpressionWithGeneric(#[primary_span] pub Span);
242 #[derive(Diagnostic)]
243 #[diag(parser_macro_invocation_with_qualified_path)]
244 pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span);
246 #[derive(Diagnostic)]
247 #[diag(parser_unexpected_token_after_label)]
248 pub(crate) struct UnexpectedTokenAfterLabel {
250 #[label(parser_unexpected_token_after_label)]
252 #[suggestion_verbose(suggestion_remove_label, code = "")]
253 pub remove_label: Option<Span>,
255 pub enclose_in_block: Option<UnexpectedTokenAfterLabelSugg>,
258 #[derive(Subdiagnostic)]
259 #[multipart_suggestion(suggestion_enclose_in_block, applicability = "machine-applicable")]
260 pub(crate) struct UnexpectedTokenAfterLabelSugg {
261 #[suggestion_part(code = "{{ ")]
263 #[suggestion_part(code = " }}")]
267 #[derive(Diagnostic)]
268 #[diag(parser_require_colon_after_labeled_expression)]
270 pub(crate) struct RequireColonAfterLabeledExpression {
275 #[suggestion_short(applicability = "machine-applicable", code = ": ")]
279 #[derive(Diagnostic)]
280 #[diag(parser_do_catch_syntax_removed)]
282 pub(crate) struct DoCatchSyntaxRemoved {
284 #[suggestion(applicability = "machine-applicable", code = "try")]
288 #[derive(Diagnostic)]
289 #[diag(parser_float_literal_requires_integer_part)]
290 pub(crate) struct FloatLiteralRequiresIntegerPart {
292 #[suggestion(applicability = "machine-applicable", code = "{correct}")]
297 #[derive(Diagnostic)]
298 #[diag(parser_invalid_int_literal_width)]
300 pub(crate) struct InvalidIntLiteralWidth {
306 #[derive(Diagnostic)]
307 #[diag(parser_invalid_num_literal_base_prefix)]
309 pub(crate) struct InvalidNumLiteralBasePrefix {
311 #[suggestion(applicability = "maybe-incorrect", code = "{fixed}")]
316 #[derive(Diagnostic)]
317 #[diag(parser_invalid_num_literal_suffix)]
319 pub(crate) struct InvalidNumLiteralSuffix {
326 #[derive(Diagnostic)]
327 #[diag(parser_invalid_float_literal_width)]
329 pub(crate) struct InvalidFloatLiteralWidth {
335 #[derive(Diagnostic)]
336 #[diag(parser_invalid_float_literal_suffix)]
338 pub(crate) struct InvalidFloatLiteralSuffix {
345 #[derive(Diagnostic)]
346 #[diag(parser_int_literal_too_large)]
347 pub(crate) struct IntLiteralTooLarge {
352 #[derive(Diagnostic)]
353 #[diag(parser_missing_semicolon_before_array)]
354 pub(crate) struct MissingSemicolonBeforeArray {
356 pub open_delim: Span,
357 #[suggestion_verbose(applicability = "maybe-incorrect", code = ";")]
361 #[derive(Diagnostic)]
362 #[diag(parser_invalid_block_macro_segment)]
363 pub(crate) struct InvalidBlockMacroSegment {
370 #[derive(Diagnostic)]
371 #[diag(parser_if_expression_missing_then_block)]
372 pub(crate) struct IfExpressionMissingThenBlock {
376 pub sub: IfExpressionMissingThenBlockSub,
379 #[derive(Subdiagnostic)]
380 pub(crate) enum IfExpressionMissingThenBlockSub {
381 #[help(condition_possibly_unfinished)]
382 UnfinishedCondition(#[primary_span] Span),
383 #[help(add_then_block)]
384 AddThenBlock(#[primary_span] Span),
387 #[derive(Diagnostic)]
388 #[diag(parser_if_expression_missing_condition)]
389 pub(crate) struct IfExpressionMissingCondition {
391 #[label(condition_label)]
393 #[label(block_label)]
394 pub block_span: Span,
397 #[derive(Diagnostic)]
398 #[diag(parser_expected_expression_found_let)]
399 pub(crate) struct ExpectedExpressionFoundLet {
404 #[derive(Diagnostic)]
405 #[diag(parser_expected_else_block)]
406 pub(crate) struct ExpectedElseBlock {
408 pub first_tok_span: Span,
409 pub first_tok: String,
412 #[suggestion(applicability = "maybe-incorrect", code = "if ")]
413 pub condition_start: Span,
416 #[derive(Diagnostic)]
417 #[diag(parser_outer_attribute_not_allowed_on_if_else)]
418 pub(crate) struct OuterAttributeNotAllowedOnIfElse {
422 #[label(branch_label)]
423 pub branch_span: Span,
429 #[suggestion(applicability = "machine-applicable", code = "")]
430 pub attributes: Span,
433 #[derive(Diagnostic)]
434 #[diag(parser_missing_in_in_for_loop)]
435 pub(crate) struct MissingInInForLoop {
439 pub sub: MissingInInForLoopSub,
442 #[derive(Subdiagnostic)]
443 pub(crate) enum MissingInInForLoopSub {
444 // Has been misleading, at least in the past (closed Issue #48492), thus maybe-incorrect
445 #[suggestion_short(use_in_not_of, applicability = "maybe-incorrect", code = "in")]
446 InNotOf(#[primary_span] Span),
447 #[suggestion_short(add_in, applicability = "maybe-incorrect", code = " in ")]
448 AddIn(#[primary_span] Span),
451 #[derive(Diagnostic)]
452 #[diag(parser_missing_comma_after_match_arm)]
453 pub(crate) struct MissingCommaAfterMatchArm {
455 #[suggestion(applicability = "machine-applicable", code = ",")]
459 #[derive(Diagnostic)]
460 #[diag(parser_catch_after_try)]
462 pub(crate) struct CatchAfterTry {
467 #[derive(Diagnostic)]
468 #[diag(parser_comma_after_base_struct)]
470 pub(crate) struct CommaAfterBaseStruct {
473 #[suggestion_short(applicability = "machine-applicable", code = "")]
477 #[derive(Diagnostic)]
478 #[diag(parser_eq_field_init)]
479 pub(crate) struct EqFieldInit {
482 #[suggestion(applicability = "machine-applicable", code = ":")]
486 #[derive(Diagnostic)]
487 #[diag(parser_dotdotdot)]
488 pub(crate) struct DotDotDot {
490 #[suggestion(suggest_exclusive_range, applicability = "maybe-incorrect", code = "..")]
491 #[suggestion(suggest_inclusive_range, applicability = "maybe-incorrect", code = "..=")]
495 #[derive(Diagnostic)]
496 #[diag(parser_left_arrow_operator)]
497 pub(crate) struct LeftArrowOperator {
499 #[suggestion(applicability = "maybe-incorrect", code = "< -")]
503 #[derive(Diagnostic)]
504 #[diag(parser_remove_let)]
505 pub(crate) struct RemoveLet {
507 #[suggestion(applicability = "machine-applicable", code = "")]
511 #[derive(Diagnostic)]
512 #[diag(parser_use_eq_instead)]
513 pub(crate) struct UseEqInstead {
515 #[suggestion_short(applicability = "machine-applicable", code = "=")]
519 #[derive(Diagnostic)]
520 #[diag(parser_use_empty_block_not_semi)]
521 pub(crate) struct UseEmptyBlockNotSemi {
523 #[suggestion_hidden(applicability = "machine-applicable", code = "{{}}")]
527 #[derive(Diagnostic)]
528 #[diag(parser_comparison_interpreted_as_generic)]
529 pub(crate) struct ComparisonInterpretedAsGeneric {
531 #[label(label_comparison)]
532 pub comparison: Span,
537 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
540 #[derive(Diagnostic)]
541 #[diag(parser_shift_interpreted_as_generic)]
542 pub(crate) struct ShiftInterpretedAsGeneric {
544 #[label(label_comparison)]
550 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
553 #[derive(Subdiagnostic)]
554 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
555 pub(crate) struct ComparisonOrShiftInterpretedAsGenericSugg {
556 #[suggestion_part(code = "(")]
558 #[suggestion_part(code = ")")]
562 #[derive(Diagnostic)]
563 #[diag(parser_found_expr_would_be_stmt)]
564 pub(crate) struct FoundExprWouldBeStmt {
570 pub suggestion: ExprParenthesesNeeded,
573 #[derive(Diagnostic)]
574 #[diag(parser_leading_plus_not_supported)]
575 pub(crate) struct LeadingPlusNotSupported {
579 #[suggestion_verbose(suggestion_remove_plus, code = "", applicability = "machine-applicable")]
580 pub remove_plus: Option<Span>,
582 pub add_parentheses: Option<ExprParenthesesNeeded>,
585 #[derive(Diagnostic)]
586 #[diag(parser_parentheses_with_struct_fields)]
587 pub(crate) struct ParenthesesWithStructFields {
592 pub braces_for_struct: BracesForStructLiteral,
594 pub no_fields_for_fn: NoFieldsForFnCall,
597 #[derive(Subdiagnostic)]
598 #[multipart_suggestion(suggestion_braces_for_struct, applicability = "maybe-incorrect")]
599 pub(crate) struct BracesForStructLiteral {
600 #[suggestion_part(code = " {{ ")]
602 #[suggestion_part(code = " }}")]
606 #[derive(Subdiagnostic)]
607 #[multipart_suggestion(suggestion_no_fields_for_fn, applicability = "maybe-incorrect")]
608 pub(crate) struct NoFieldsForFnCall {
609 #[suggestion_part(code = "")]
610 pub fields: Vec<Span>,
613 #[derive(Diagnostic)]
614 #[diag(parser_labeled_loop_in_break)]
615 pub(crate) struct LabeledLoopInBreak {
619 pub sub: WrapExpressionInParentheses,
622 #[derive(Subdiagnostic)]
623 #[multipart_suggestion(
624 parser_sugg_wrap_expression_in_parentheses,
625 applicability = "machine-applicable"
627 pub(crate) struct WrapExpressionInParentheses {
628 #[suggestion_part(code = "(")]
630 #[suggestion_part(code = ")")]
634 #[derive(Diagnostic)]
635 #[diag(parser_array_brackets_instead_of_braces)]
636 pub(crate) struct ArrayBracketsInsteadOfSpaces {
640 pub sub: ArrayBracketsInsteadOfSpacesSugg,
643 #[derive(Subdiagnostic)]
644 #[multipart_suggestion(suggestion, applicability = "maybe-incorrect")]
645 pub(crate) struct ArrayBracketsInsteadOfSpacesSugg {
646 #[suggestion_part(code = "[")]
648 #[suggestion_part(code = "]")]
652 #[derive(Diagnostic)]
653 #[diag(parser_match_arm_body_without_braces)]
654 pub(crate) struct MatchArmBodyWithoutBraces {
656 #[label(label_statements)]
657 pub statements: Span,
658 #[label(label_arrow)]
660 pub num_statements: usize,
662 pub sub: MatchArmBodyWithoutBracesSugg,
665 #[derive(Subdiagnostic)]
666 pub(crate) enum MatchArmBodyWithoutBracesSugg {
667 #[multipart_suggestion(suggestion_add_braces, applicability = "machine-applicable")]
669 #[suggestion_part(code = "{{ ")]
671 #[suggestion_part(code = " }}")]
675 suggestion_use_comma_not_semicolon,
677 applicability = "machine-applicable"
685 #[derive(Diagnostic)]
686 #[diag(parser_struct_literal_not_allowed_here)]
687 pub(crate) struct StructLiteralNotAllowedHere {
691 pub sub: StructLiteralNotAllowedHereSugg,
694 #[derive(Subdiagnostic)]
695 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
696 pub(crate) struct StructLiteralNotAllowedHereSugg {
697 #[suggestion_part(code = "(")]
699 #[suggestion_part(code = ")")]
703 #[derive(Diagnostic)]
704 #[diag(parser_invalid_interpolated_expression)]
705 pub(crate) struct InvalidInterpolatedExpression {
710 #[derive(Diagnostic)]
711 #[diag(parser_hexadecimal_float_literal_not_supported)]
712 pub(crate) struct HexadecimalFloatLiteralNotSupported {
714 #[label(parser_not_supported)]
718 #[derive(Diagnostic)]
719 #[diag(parser_octal_float_literal_not_supported)]
720 pub(crate) struct OctalFloatLiteralNotSupported {
722 #[label(parser_not_supported)]
726 #[derive(Diagnostic)]
727 #[diag(parser_binary_float_literal_not_supported)]
728 pub(crate) struct BinaryFloatLiteralNotSupported {
730 #[label(parser_not_supported)]
734 #[derive(Diagnostic)]
735 #[diag(parser_invalid_literal_suffix)]
736 pub(crate) struct InvalidLiteralSuffix {
745 #[derive(Diagnostic)]
746 #[diag(parser_invalid_literal_suffix_on_tuple_index)]
747 pub(crate) struct InvalidLiteralSuffixOnTupleIndex {
752 #[help(tuple_exception_line_1)]
753 #[help(tuple_exception_line_2)]
754 #[help(tuple_exception_line_3)]
755 pub exception: Option<()>,
758 #[derive(Diagnostic)]
759 #[diag(parser_non_string_abi_literal)]
760 pub(crate) struct NonStringAbiLiteral {
762 #[suggestion(code = "\"C\"", applicability = "maybe-incorrect")]
766 #[derive(Diagnostic)]
767 #[diag(parser_mismatched_closing_delimiter)]
768 pub(crate) struct MismatchedClosingDelimiter {
770 pub spans: Vec<Span>,
771 pub delimiter: String,
772 #[label(label_unmatched)]
774 #[label(label_opening_candidate)]
775 pub opening_candidate: Option<Span>,
776 #[label(label_unclosed)]
777 pub unclosed: Option<Span>,
780 #[derive(Diagnostic)]
781 #[diag(parser_incorrect_visibility_restriction, code = "E0704")]
783 pub(crate) struct IncorrectVisibilityRestriction {
785 #[suggestion(code = "in {inner_str}", applicability = "machine-applicable")]
787 pub inner_str: String,
790 #[derive(Diagnostic)]
791 #[diag(parser_assignment_else_not_allowed)]
792 pub(crate) struct AssignmentElseNotAllowed {
797 #[derive(Diagnostic)]
798 #[diag(parser_expected_statement_after_outer_attr)]
799 pub(crate) struct ExpectedStatementAfterOuterAttr {
804 #[derive(Diagnostic)]
805 #[diag(parser_doc_comment_does_not_document_anything, code = "E0585")]
807 pub(crate) struct DocCommentDoesNotDocumentAnything {
810 #[suggestion(code = ",", applicability = "machine-applicable")]
811 pub missing_comma: Option<Span>,
814 #[derive(Diagnostic)]
815 #[diag(parser_const_let_mutually_exclusive)]
816 pub(crate) struct ConstLetMutuallyExclusive {
818 #[suggestion(code = "const", applicability = "maybe-incorrect")]
822 #[derive(Diagnostic)]
823 #[diag(parser_invalid_expression_in_let_else)]
824 pub(crate) struct InvalidExpressionInLetElse {
827 pub operator: &'static str,
829 pub sugg: WrapExpressionInParentheses,
832 #[derive(Diagnostic)]
833 #[diag(parser_invalid_curly_in_let_else)]
834 pub(crate) struct InvalidCurlyInLetElse {
838 pub sugg: WrapExpressionInParentheses,
841 #[derive(Diagnostic)]
842 #[diag(parser_compound_assignment_expression_in_let)]
844 pub(crate) struct CompoundAssignmentExpressionInLet {
846 #[suggestion_short(code = "=", applicability = "maybe-incorrect")]
850 #[derive(Diagnostic)]
851 #[diag(parser_suffixed_literal_in_attribute)]
853 pub(crate) struct SuffixedLiteralInAttribute {
858 #[derive(Diagnostic)]
859 #[diag(parser_invalid_meta_item)]
860 pub(crate) struct InvalidMetaItem {
866 #[derive(Subdiagnostic)]
867 #[suggestion_verbose(
868 parser_sugg_escape_to_use_as_identifier,
869 applicability = "maybe-incorrect",
872 pub(crate) struct SuggEscapeToUseAsIdentifier {
875 pub ident_name: String,
878 #[derive(Subdiagnostic)]
879 #[suggestion(parser_sugg_remove_comma, applicability = "machine-applicable", code = "")]
880 pub(crate) struct SuggRemoveComma {
885 #[derive(Subdiagnostic)]
886 pub(crate) enum ExpectedIdentifierFound {
887 #[label(parser_expected_identifier_found_reserved_identifier)]
888 ReservedIdentifier(#[primary_span] Span),
889 #[label(parser_expected_identifier_found_keyword)]
890 Keyword(#[primary_span] Span),
891 #[label(parser_expected_identifier_found_reserved_keyword)]
892 ReservedKeyword(#[primary_span] Span),
893 #[label(parser_expected_identifier_found_doc_comment)]
894 DocComment(#[primary_span] Span),
895 #[label(parser_expected_identifier)]
896 Other(#[primary_span] Span),
899 impl ExpectedIdentifierFound {
900 pub fn new(token_descr: Option<TokenDescription>, span: Span) -> Self {
902 Some(TokenDescription::ReservedIdentifier) => {
903 ExpectedIdentifierFound::ReservedIdentifier
905 Some(TokenDescription::Keyword) => ExpectedIdentifierFound::Keyword,
906 Some(TokenDescription::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword,
907 Some(TokenDescription::DocComment) => ExpectedIdentifierFound::DocComment,
908 None => ExpectedIdentifierFound::Other,
913 pub(crate) struct ExpectedIdentifier {
916 pub suggest_raw: Option<SuggEscapeToUseAsIdentifier>,
917 pub suggest_remove_comma: Option<SuggRemoveComma>,
920 impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedIdentifier {
924 handler: &'a rustc_errors::Handler,
925 ) -> rustc_errors::DiagnosticBuilder<'a, G> {
926 let token_descr = super::parser::TokenDescription::from_token(&self.token);
928 let mut diag = handler.struct_diagnostic(match token_descr {
929 Some(TokenDescription::ReservedIdentifier) => {
930 fluent::parser_expected_identifier_found_reserved_identifier_str
932 Some(TokenDescription::Keyword) => fluent::parser_expected_identifier_found_keyword_str,
933 Some(TokenDescription::ReservedKeyword) => {
934 fluent::parser_expected_identifier_found_reserved_keyword_str
936 Some(TokenDescription::DocComment) => {
937 fluent::parser_expected_identifier_found_doc_comment_str
939 None => fluent::parser_expected_identifier_found_str,
941 diag.set_span(self.span);
942 diag.set_arg("token", self.token);
944 if let Some(sugg) = self.suggest_raw {
945 sugg.add_to_diagnostic(&mut diag);
948 ExpectedIdentifierFound::new(token_descr, self.span).add_to_diagnostic(&mut diag);
950 if let Some(sugg) = self.suggest_remove_comma {
951 sugg.add_to_diagnostic(&mut diag);
958 pub(crate) struct ExpectedSemi {
962 pub unexpected_token_label: Option<Span>,
963 pub sugg: ExpectedSemiSugg,
966 impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedSemi {
970 handler: &'a rustc_errors::Handler,
971 ) -> rustc_errors::DiagnosticBuilder<'a, G> {
972 let token_descr = super::parser::TokenDescription::from_token(&self.token);
974 let mut diag = handler.struct_diagnostic(match token_descr {
975 Some(TokenDescription::ReservedIdentifier) => {
976 fluent::parser_expected_semi_found_reserved_identifier_str
978 Some(TokenDescription::Keyword) => fluent::parser_expected_semi_found_keyword_str,
979 Some(TokenDescription::ReservedKeyword) => {
980 fluent::parser_expected_semi_found_reserved_keyword_str
982 Some(TokenDescription::DocComment) => {
983 fluent::parser_expected_semi_found_doc_comment_str
985 None => fluent::parser_expected_semi_found_str,
987 diag.set_span(self.span);
988 diag.set_arg("token", self.token);
990 if let Some(unexpected_token_label) = self.unexpected_token_label {
991 diag.span_label(unexpected_token_label, fluent::parser_label_unexpected_token);
994 self.sugg.add_to_diagnostic(&mut diag);
1000 #[derive(Subdiagnostic)]
1001 pub(crate) enum ExpectedSemiSugg {
1003 parser_sugg_change_this_to_semi,
1005 applicability = "machine-applicable"
1007 ChangeToSemi(#[primary_span] Span),
1008 #[suggestion_short(parser_sugg_add_semi, code = ";", applicability = "machine-applicable")]
1009 AddSemi(#[primary_span] Span),
1012 #[derive(Diagnostic)]
1013 #[diag(parser_struct_literal_body_without_path)]
1014 pub(crate) struct StructLiteralBodyWithoutPath {
1018 pub sugg: StructLiteralBodyWithoutPathSugg,
1021 #[derive(Subdiagnostic)]
1022 #[multipart_suggestion(suggestion, applicability = "has-placeholders")]
1023 pub(crate) struct StructLiteralBodyWithoutPathSugg {
1024 #[suggestion_part(code = "{{ SomeStruct ")]
1026 #[suggestion_part(code = " }}")]
1030 #[derive(Diagnostic)]
1031 #[diag(parser_unmatched_angle_brackets)]
1032 pub(crate) struct UnmatchedAngleBrackets {
1034 #[suggestion(code = "", applicability = "machine-applicable")]
1036 pub num_extra_brackets: usize,
1039 #[derive(Diagnostic)]
1040 #[diag(parser_generic_parameters_without_angle_brackets)]
1041 pub(crate) struct GenericParamsWithoutAngleBrackets {
1045 pub sugg: GenericParamsWithoutAngleBracketsSugg,
1048 #[derive(Subdiagnostic)]
1049 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1050 pub(crate) struct GenericParamsWithoutAngleBracketsSugg {
1051 #[suggestion_part(code = "<")]
1053 #[suggestion_part(code = ">")]
1057 #[derive(Diagnostic)]
1058 #[diag(parser_comparison_operators_cannot_be_chained)]
1059 pub(crate) struct ComparisonOperatorsCannotBeChained {
1061 pub span: Vec<Span>,
1062 #[suggestion_verbose(
1063 parser_sugg_turbofish_syntax,
1065 applicability = "maybe-incorrect"
1067 pub suggest_turbofish: Option<Span>,
1068 #[help(parser_sugg_turbofish_syntax)]
1069 #[help(sugg_parentheses_for_function_args)]
1070 pub help_turbofish: Option<()>,
1072 pub chaining_sugg: Option<ComparisonOperatorsCannotBeChainedSugg>,
1075 #[derive(Subdiagnostic)]
1076 pub(crate) enum ComparisonOperatorsCannotBeChainedSugg {
1077 #[suggestion_verbose(
1078 sugg_split_comparison,
1079 code = " && {middle_term}",
1080 applicability = "maybe-incorrect"
1085 middle_term: String,
1087 #[multipart_suggestion(sugg_parenthesize, applicability = "maybe-incorrect")]
1089 #[suggestion_part(code = "(")]
1091 #[suggestion_part(code = ")")]
1096 #[derive(Diagnostic)]
1097 #[diag(parser_question_mark_in_type)]
1098 pub(crate) struct QuestionMarkInType {
1103 pub sugg: QuestionMarkInTypeSugg,
1106 #[derive(Subdiagnostic)]
1107 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1108 pub(crate) struct QuestionMarkInTypeSugg {
1109 #[suggestion_part(code = "Option<")]
1111 #[suggestion_part(code = ">")]
1115 #[derive(Diagnostic)]
1116 #[diag(parser_unexpected_parentheses_in_for_head)]
1117 pub(crate) struct ParenthesesInForHead {
1119 pub span: Vec<Span>,
1121 pub sugg: ParenthesesInForHeadSugg,
1124 #[derive(Subdiagnostic)]
1125 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1126 pub(crate) struct ParenthesesInForHeadSugg {
1127 #[suggestion_part(code = "")]
1129 #[suggestion_part(code = "")]
1133 #[derive(Diagnostic)]
1134 #[diag(parser_doc_comment_on_param_type)]
1135 pub(crate) struct DocCommentOnParamType {
1141 #[derive(Diagnostic)]
1142 #[diag(parser_attribute_on_param_type)]
1143 pub(crate) struct AttributeOnParamType {
1149 #[derive(Diagnostic)]
1150 #[diag(parser_pattern_method_param_without_body, code = "E0642")]
1151 pub(crate) struct PatternMethodParamWithoutBody {
1153 #[suggestion(code = "_", applicability = "machine-applicable")]
1157 #[derive(Diagnostic)]
1158 #[diag(parser_self_param_not_first)]
1159 pub(crate) struct SelfParamNotFirst {
1165 #[derive(Diagnostic)]
1166 #[diag(parser_const_generic_without_braces)]
1167 pub(crate) struct ConstGenericWithoutBraces {
1171 pub sugg: ConstGenericWithoutBracesSugg,
1174 #[derive(Subdiagnostic)]
1175 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1176 pub(crate) struct ConstGenericWithoutBracesSugg {
1177 #[suggestion_part(code = "{{ ")]
1179 #[suggestion_part(code = " }}")]
1183 #[derive(Diagnostic)]
1184 #[diag(parser_unexpected_const_param_declaration)]
1185 pub(crate) struct UnexpectedConstParamDeclaration {
1190 pub sugg: Option<UnexpectedConstParamDeclarationSugg>,
1193 #[derive(Subdiagnostic)]
1194 pub(crate) enum UnexpectedConstParamDeclarationSugg {
1195 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1197 #[suggestion_part(code = "<{snippet}>")]
1198 impl_generics: Span,
1199 #[suggestion_part(code = "{ident}")]
1200 incorrect_decl: Span,
1204 #[multipart_suggestion(suggestion, applicability = "machine-applicable")]
1206 #[suggestion_part(code = ", {snippet}")]
1207 impl_generics_end: Span,
1208 #[suggestion_part(code = "{ident}")]
1209 incorrect_decl: Span,
1215 #[derive(Diagnostic)]
1216 #[diag(parser_unexpected_const_in_generic_param)]
1217 pub(crate) struct UnexpectedConstInGenericParam {
1220 #[suggestion_verbose(code = "", applicability = "maybe-incorrect")]
1221 pub to_remove: Option<Span>,
1224 #[derive(Diagnostic)]
1225 #[diag(parser_async_move_order_incorrect)]
1226 pub(crate) struct AsyncMoveOrderIncorrect {
1228 #[suggestion_verbose(code = "async move", applicability = "maybe-incorrect")]
1232 #[derive(Diagnostic)]
1233 #[diag(parser_double_colon_in_bound)]
1234 pub(crate) struct DoubleColonInBound {
1237 #[suggestion(code = ": ", applicability = "machine-applicable")]