1 use std::borrow::Cow; 2 3 use rustc_ast::token::Token; 4 use rustc_ast::{Path, Visibility}; 5 use rustc_errors::{AddToDiagnostic, Applicability, EmissionGuarantee, IntoDiagnostic}; 6 use rustc_macros::{Diagnostic, Subdiagnostic}; 7 use rustc_session::errors::ExprParenthesesNeeded; 8 use rustc_span::edition::{Edition, LATEST_STABLE_EDITION}; 9 use rustc_span::symbol::Ident; 10 use rustc_span::{Span, Symbol}; 11 12 use crate::fluent_generated as fluent; 13 use crate::parser::TokenDescription; 14 15 #[derive(Diagnostic)] 16 #[diag(parse_maybe_report_ambiguous_plus)] 17 pub(crate) struct AmbiguousPlus { 18 pub sum_ty: String, 19 #[primary_span] 20 #[suggestion(code = "({sum_ty})")] 21 pub span: Span, 22 } 23 24 #[derive(Diagnostic)] 25 #[diag(parse_maybe_recover_from_bad_type_plus, code = "E0178")] 26 pub(crate) struct BadTypePlus { 27 pub ty: String, 28 #[primary_span] 29 pub span: Span, 30 #[subdiagnostic] 31 pub sub: BadTypePlusSub, 32 } 33 34 #[derive(Subdiagnostic)] 35 pub(crate) enum BadTypePlusSub { 36 #[suggestion( 37 parse_add_paren, 38 code = "{sum_with_parens}", 39 applicability = "machine-applicable" 40 )] 41 AddParen { 42 sum_with_parens: String, 43 #[primary_span] 44 span: Span, 45 }, 46 #[label(parse_forgot_paren)] 47 ForgotParen { 48 #[primary_span] 49 span: Span, 50 }, 51 #[label(parse_expect_path)] 52 ExpectPath { 53 #[primary_span] 54 span: Span, 55 }, 56 } 57 58 #[derive(Diagnostic)] 59 #[diag(parse_maybe_recover_from_bad_qpath_stage_2)] 60 pub(crate) struct BadQPathStage2 { 61 #[primary_span] 62 #[suggestion(code = "", applicability = "maybe-incorrect")] 63 pub span: Span, 64 pub ty: String, 65 } 66 67 #[derive(Diagnostic)] 68 #[diag(parse_incorrect_semicolon)] 69 pub(crate) struct IncorrectSemicolon<'a> { 70 #[primary_span] 71 #[suggestion(style = "short", code = "", applicability = "machine-applicable")] 72 pub span: Span, 73 #[help] 74 pub opt_help: Option<()>, 75 pub name: &'a str, 76 } 77 78 #[derive(Diagnostic)] 79 #[diag(parse_incorrect_use_of_await)] 80 pub(crate) struct IncorrectUseOfAwait { 81 #[primary_span] 82 #[suggestion(parse_parentheses_suggestion, code = "", applicability = "machine-applicable")] 83 pub span: Span, 84 } 85 86 #[derive(Diagnostic)] 87 #[diag(parse_incorrect_use_of_await)] 88 pub(crate) struct IncorrectAwait { 89 #[primary_span] 90 pub span: Span, 91 #[suggestion(parse_postfix_suggestion, code = "{expr}.await{question_mark}")] 92 pub sugg_span: (Span, Applicability), 93 pub expr: String, 94 pub question_mark: &'static str, 95 } 96 97 #[derive(Diagnostic)] 98 #[diag(parse_in_in_typo)] 99 pub(crate) struct InInTypo { 100 #[primary_span] 101 pub span: Span, 102 #[suggestion(code = "", applicability = "machine-applicable")] 103 pub sugg_span: Span, 104 } 105 106 #[derive(Diagnostic)] 107 #[diag(parse_invalid_variable_declaration)] 108 pub(crate) struct InvalidVariableDeclaration { 109 #[primary_span] 110 pub span: Span, 111 #[subdiagnostic] 112 pub sub: InvalidVariableDeclarationSub, 113 } 114 115 #[derive(Subdiagnostic)] 116 pub(crate) enum InvalidVariableDeclarationSub { 117 #[suggestion(parse_switch_mut_let_order, applicability = "maybe-incorrect", code = "let mut")] 118 SwitchMutLetOrder(#[primary_span] Span), 119 #[suggestion( 120 parse_missing_let_before_mut, 121 applicability = "machine-applicable", 122 code = "let mut" 123 )] 124 MissingLet(#[primary_span] Span), 125 #[suggestion(parse_use_let_not_auto, applicability = "machine-applicable", code = "let")] 126 UseLetNotAuto(#[primary_span] Span), 127 #[suggestion(parse_use_let_not_var, applicability = "machine-applicable", code = "let")] 128 UseLetNotVar(#[primary_span] Span), 129 } 130 131 #[derive(Diagnostic)] 132 #[diag(parse_invalid_comparison_operator)] 133 pub(crate) struct InvalidComparisonOperator { 134 #[primary_span] 135 pub span: Span, 136 pub invalid: String, 137 #[subdiagnostic] 138 pub sub: InvalidComparisonOperatorSub, 139 } 140 141 #[derive(Subdiagnostic)] 142 pub(crate) enum InvalidComparisonOperatorSub { 143 #[suggestion( 144 parse_use_instead, 145 style = "short", 146 applicability = "machine-applicable", 147 code = "{correct}" 148 )] 149 Correctable { 150 #[primary_span] 151 span: Span, 152 invalid: String, 153 correct: String, 154 }, 155 #[label(parse_spaceship_operator_invalid)] 156 Spaceship(#[primary_span] Span), 157 } 158 159 #[derive(Diagnostic)] 160 #[diag(parse_invalid_logical_operator)] 161 #[note] 162 pub(crate) struct InvalidLogicalOperator { 163 #[primary_span] 164 pub span: Span, 165 pub incorrect: String, 166 #[subdiagnostic] 167 pub sub: InvalidLogicalOperatorSub, 168 } 169 170 #[derive(Subdiagnostic)] 171 pub(crate) enum InvalidLogicalOperatorSub { 172 #[suggestion( 173 parse_use_amp_amp_for_conjunction, 174 style = "short", 175 applicability = "machine-applicable", 176 code = "&&" 177 )] 178 Conjunction(#[primary_span] Span), 179 #[suggestion( 180 parse_use_pipe_pipe_for_disjunction, 181 style = "short", 182 applicability = "machine-applicable", 183 code = "||" 184 )] 185 Disjunction(#[primary_span] Span), 186 } 187 188 #[derive(Diagnostic)] 189 #[diag(parse_tilde_is_not_unary_operator)] 190 pub(crate) struct TildeAsUnaryOperator( 191 #[primary_span] 192 #[suggestion(style = "short", applicability = "machine-applicable", code = "!")] 193 pub Span, 194 ); 195 196 #[derive(Diagnostic)] 197 #[diag(parse_unexpected_token_after_not)] 198 pub(crate) struct NotAsNegationOperator { 199 #[primary_span] 200 pub negated: Span, 201 pub negated_desc: String, 202 #[subdiagnostic] 203 pub sub: NotAsNegationOperatorSub, 204 } 205 206 #[derive(Subdiagnostic)] 207 pub enum NotAsNegationOperatorSub { 208 #[suggestion( 209 parse_unexpected_token_after_not_default, 210 style = "short", 211 applicability = "machine-applicable", 212 code = "!" 213 )] 214 SuggestNotDefault(#[primary_span] Span), 215 216 #[suggestion( 217 parse_unexpected_token_after_not_bitwise, 218 style = "short", 219 applicability = "machine-applicable", 220 code = "!" 221 )] 222 SuggestNotBitwise(#[primary_span] Span), 223 224 #[suggestion( 225 parse_unexpected_token_after_not_logical, 226 style = "short", 227 applicability = "machine-applicable", 228 code = "!" 229 )] 230 SuggestNotLogical(#[primary_span] Span), 231 } 232 233 #[derive(Diagnostic)] 234 #[diag(parse_malformed_loop_label)] 235 pub(crate) struct MalformedLoopLabel { 236 #[primary_span] 237 #[suggestion(applicability = "machine-applicable", code = "{correct_label}")] 238 pub span: Span, 239 pub correct_label: Ident, 240 } 241 242 #[derive(Diagnostic)] 243 #[diag(parse_lifetime_in_borrow_expression)] 244 pub(crate) struct LifetimeInBorrowExpression { 245 #[primary_span] 246 pub span: Span, 247 #[suggestion(applicability = "machine-applicable", code = "")] 248 #[label] 249 pub lifetime_span: Span, 250 } 251 252 #[derive(Diagnostic)] 253 #[diag(parse_field_expression_with_generic)] 254 pub(crate) struct FieldExpressionWithGeneric(#[primary_span] pub Span); 255 256 #[derive(Diagnostic)] 257 #[diag(parse_macro_invocation_with_qualified_path)] 258 pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span); 259 260 #[derive(Diagnostic)] 261 #[diag(parse_unexpected_token_after_label)] 262 pub(crate) struct UnexpectedTokenAfterLabel { 263 #[primary_span] 264 #[label(parse_unexpected_token_after_label)] 265 pub span: Span, 266 #[suggestion(parse_suggestion_remove_label, style = "verbose", code = "")] 267 pub remove_label: Option<Span>, 268 #[subdiagnostic] 269 pub enclose_in_block: Option<UnexpectedTokenAfterLabelSugg>, 270 } 271 272 #[derive(Subdiagnostic)] 273 #[multipart_suggestion(parse_suggestion_enclose_in_block, applicability = "machine-applicable")] 274 pub(crate) struct UnexpectedTokenAfterLabelSugg { 275 #[suggestion_part(code = "{{ ")] 276 pub left: Span, 277 #[suggestion_part(code = " }}")] 278 pub right: Span, 279 } 280 281 #[derive(Diagnostic)] 282 #[diag(parse_require_colon_after_labeled_expression)] 283 #[note] 284 pub(crate) struct RequireColonAfterLabeledExpression { 285 #[primary_span] 286 pub span: Span, 287 #[label] 288 pub label: Span, 289 #[suggestion(style = "short", applicability = "machine-applicable", code = ": ")] 290 pub label_end: Span, 291 } 292 293 #[derive(Diagnostic)] 294 #[diag(parse_do_catch_syntax_removed)] 295 #[note] 296 pub(crate) struct DoCatchSyntaxRemoved { 297 #[primary_span] 298 #[suggestion(applicability = "machine-applicable", code = "try")] 299 pub span: Span, 300 } 301 302 #[derive(Diagnostic)] 303 #[diag(parse_float_literal_requires_integer_part)] 304 pub(crate) struct FloatLiteralRequiresIntegerPart { 305 #[primary_span] 306 #[suggestion(applicability = "machine-applicable", code = "{correct}")] 307 pub span: Span, 308 pub correct: String, 309 } 310 311 #[derive(Diagnostic)] 312 #[diag(parse_missing_semicolon_before_array)] 313 pub(crate) struct MissingSemicolonBeforeArray { 314 #[primary_span] 315 pub open_delim: Span, 316 #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = ";")] 317 pub semicolon: Span, 318 } 319 320 #[derive(Diagnostic)] 321 #[diag(parse_expect_dotdot_not_dotdotdot)] 322 pub(crate) struct MissingDotDot { 323 #[primary_span] 324 pub token_span: Span, 325 #[suggestion(applicability = "maybe-incorrect", code = "..", style = "verbose")] 326 pub sugg_span: Span, 327 } 328 329 #[derive(Diagnostic)] 330 #[diag(parse_invalid_block_macro_segment)] 331 pub(crate) struct InvalidBlockMacroSegment { 332 #[primary_span] 333 pub span: Span, 334 #[label] 335 pub context: Span, 336 #[subdiagnostic] 337 pub wrap: WrapInExplicitBlock, 338 } 339 340 #[derive(Subdiagnostic)] 341 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 342 pub(crate) struct WrapInExplicitBlock { 343 #[suggestion_part(code = "{{ ")] 344 pub lo: Span, 345 #[suggestion_part(code = " }}")] 346 pub hi: Span, 347 } 348 349 #[derive(Diagnostic)] 350 #[diag(parse_if_expression_missing_then_block)] 351 pub(crate) struct IfExpressionMissingThenBlock { 352 #[primary_span] 353 pub if_span: Span, 354 #[subdiagnostic] 355 pub missing_then_block_sub: IfExpressionMissingThenBlockSub, 356 #[subdiagnostic] 357 pub let_else_sub: Option<IfExpressionLetSomeSub>, 358 } 359 360 #[derive(Subdiagnostic)] 361 pub(crate) enum IfExpressionMissingThenBlockSub { 362 #[help(parse_condition_possibly_unfinished)] 363 UnfinishedCondition(#[primary_span] Span), 364 #[help(parse_add_then_block)] 365 AddThenBlock(#[primary_span] Span), 366 } 367 368 #[derive(Subdiagnostic)] 369 #[suggestion(parse_extra_if_in_let_else, applicability = "maybe-incorrect", code = "")] 370 pub(crate) struct IfExpressionLetSomeSub { 371 #[primary_span] 372 pub if_span: Span, 373 } 374 375 #[derive(Diagnostic)] 376 #[diag(parse_if_expression_missing_condition)] 377 pub(crate) struct IfExpressionMissingCondition { 378 #[primary_span] 379 #[label(parse_condition_label)] 380 pub if_span: Span, 381 #[label(parse_block_label)] 382 pub block_span: Span, 383 } 384 385 #[derive(Diagnostic)] 386 #[diag(parse_expected_expression_found_let)] 387 pub(crate) struct ExpectedExpressionFoundLet { 388 #[primary_span] 389 pub span: Span, 390 } 391 392 #[derive(Diagnostic)] 393 #[diag(parse_expect_eq_instead_of_eqeq)] 394 pub(crate) struct ExpectedEqForLetExpr { 395 #[primary_span] 396 pub span: Span, 397 #[suggestion(applicability = "maybe-incorrect", code = "=", style = "verbose")] 398 pub sugg_span: Span, 399 } 400 401 #[derive(Diagnostic)] 402 #[diag(parse_expected_else_block)] 403 pub(crate) struct ExpectedElseBlock { 404 #[primary_span] 405 pub first_tok_span: Span, 406 pub first_tok: String, 407 #[label] 408 pub else_span: Span, 409 #[suggestion(applicability = "maybe-incorrect", code = "if ")] 410 pub condition_start: Span, 411 } 412 413 #[derive(Diagnostic)] 414 #[diag(parse_outer_attribute_not_allowed_on_if_else)] 415 pub(crate) struct OuterAttributeNotAllowedOnIfElse { 416 #[primary_span] 417 pub last: Span, 418 419 #[label(parse_branch_label)] 420 pub branch_span: Span, 421 422 #[label(parse_ctx_label)] 423 pub ctx_span: Span, 424 pub ctx: String, 425 426 #[suggestion(applicability = "machine-applicable", code = "")] 427 pub attributes: Span, 428 } 429 430 #[derive(Diagnostic)] 431 #[diag(parse_missing_in_in_for_loop)] 432 pub(crate) struct MissingInInForLoop { 433 #[primary_span] 434 pub span: Span, 435 #[subdiagnostic] 436 pub sub: MissingInInForLoopSub, 437 } 438 439 #[derive(Subdiagnostic)] 440 pub(crate) enum MissingInInForLoopSub { 441 // Has been misleading, at least in the past (closed Issue #48492), thus maybe-incorrect 442 #[suggestion( 443 parse_use_in_not_of, 444 style = "short", 445 applicability = "maybe-incorrect", 446 code = "in" 447 )] 448 InNotOf(#[primary_span] Span), 449 #[suggestion(parse_add_in, style = "short", applicability = "maybe-incorrect", code = " in ")] 450 AddIn(#[primary_span] Span), 451 } 452 453 #[derive(Diagnostic)] 454 #[diag(parse_missing_expression_in_for_loop)] 455 pub(crate) struct MissingExpressionInForLoop { 456 #[primary_span] 457 #[suggestion( 458 code = "/* expression */ ", 459 applicability = "has-placeholders", 460 style = "verbose" 461 )] 462 pub span: Span, 463 } 464 465 #[derive(Diagnostic)] 466 #[diag(parse_loop_else)] 467 #[note] 468 pub(crate) struct LoopElseNotSupported { 469 #[primary_span] 470 pub span: Span, 471 pub loop_kind: &'static str, 472 #[label(parse_loop_keyword)] 473 pub loop_kw: Span, 474 } 475 476 #[derive(Diagnostic)] 477 #[diag(parse_missing_comma_after_match_arm)] 478 pub(crate) struct MissingCommaAfterMatchArm { 479 #[primary_span] 480 #[suggestion(applicability = "machine-applicable", code = ",")] 481 pub span: Span, 482 } 483 484 #[derive(Diagnostic)] 485 #[diag(parse_catch_after_try)] 486 #[help] 487 pub(crate) struct CatchAfterTry { 488 #[primary_span] 489 pub span: Span, 490 } 491 492 #[derive(Diagnostic)] 493 #[diag(parse_comma_after_base_struct)] 494 #[note] 495 pub(crate) struct CommaAfterBaseStruct { 496 #[primary_span] 497 pub span: Span, 498 #[suggestion(style = "short", applicability = "machine-applicable", code = "")] 499 pub comma: Span, 500 } 501 502 #[derive(Diagnostic)] 503 #[diag(parse_eq_field_init)] 504 pub(crate) struct EqFieldInit { 505 #[primary_span] 506 pub span: Span, 507 #[suggestion(applicability = "machine-applicable", code = ":")] 508 pub eq: Span, 509 } 510 511 #[derive(Diagnostic)] 512 #[diag(parse_dotdotdot)] 513 pub(crate) struct DotDotDot { 514 #[primary_span] 515 #[suggestion(parse_suggest_exclusive_range, applicability = "maybe-incorrect", code = "..")] 516 #[suggestion(parse_suggest_inclusive_range, applicability = "maybe-incorrect", code = "..=")] 517 pub span: Span, 518 } 519 520 #[derive(Diagnostic)] 521 #[diag(parse_left_arrow_operator)] 522 pub(crate) struct LeftArrowOperator { 523 #[primary_span] 524 #[suggestion(applicability = "maybe-incorrect", code = "< -")] 525 pub span: Span, 526 } 527 528 #[derive(Diagnostic)] 529 #[diag(parse_remove_let)] 530 pub(crate) struct RemoveLet { 531 #[primary_span] 532 #[suggestion(applicability = "machine-applicable", code = "")] 533 pub span: Span, 534 } 535 536 #[derive(Diagnostic)] 537 #[diag(parse_use_eq_instead)] 538 pub(crate) struct UseEqInstead { 539 #[primary_span] 540 #[suggestion(style = "short", applicability = "machine-applicable", code = "=")] 541 pub span: Span, 542 } 543 544 #[derive(Diagnostic)] 545 #[diag(parse_use_empty_block_not_semi)] 546 pub(crate) struct UseEmptyBlockNotSemi { 547 #[primary_span] 548 #[suggestion(style = "hidden", applicability = "machine-applicable", code = "{{}}")] 549 pub span: Span, 550 } 551 552 #[derive(Diagnostic)] 553 #[diag(parse_comparison_interpreted_as_generic)] 554 pub(crate) struct ComparisonInterpretedAsGeneric { 555 #[primary_span] 556 #[label(parse_label_comparison)] 557 pub comparison: Span, 558 pub r#type: Path, 559 #[label(parse_label_args)] 560 pub args: Span, 561 #[subdiagnostic] 562 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg, 563 } 564 565 #[derive(Diagnostic)] 566 #[diag(parse_shift_interpreted_as_generic)] 567 pub(crate) struct ShiftInterpretedAsGeneric { 568 #[primary_span] 569 #[label(parse_label_comparison)] 570 pub shift: Span, 571 pub r#type: Path, 572 #[label(parse_label_args)] 573 pub args: Span, 574 #[subdiagnostic] 575 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg, 576 } 577 578 #[derive(Subdiagnostic)] 579 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 580 pub(crate) struct ComparisonOrShiftInterpretedAsGenericSugg { 581 #[suggestion_part(code = "(")] 582 pub left: Span, 583 #[suggestion_part(code = ")")] 584 pub right: Span, 585 } 586 587 #[derive(Diagnostic)] 588 #[diag(parse_found_expr_would_be_stmt)] 589 pub(crate) struct FoundExprWouldBeStmt { 590 #[primary_span] 591 #[label] 592 pub span: Span, 593 pub token: Token, 594 #[subdiagnostic] 595 pub suggestion: ExprParenthesesNeeded, 596 } 597 598 #[derive(Diagnostic)] 599 #[diag(parse_leading_plus_not_supported)] 600 pub(crate) struct LeadingPlusNotSupported { 601 #[primary_span] 602 #[label] 603 pub span: Span, 604 #[suggestion( 605 parse_suggestion_remove_plus, 606 style = "verbose", 607 code = "", 608 applicability = "machine-applicable" 609 )] 610 pub remove_plus: Option<Span>, 611 #[subdiagnostic] 612 pub add_parentheses: Option<ExprParenthesesNeeded>, 613 } 614 615 #[derive(Diagnostic)] 616 #[diag(parse_parentheses_with_struct_fields)] 617 pub(crate) struct ParenthesesWithStructFields { 618 #[primary_span] 619 pub span: Span, 620 pub r#type: Path, 621 #[subdiagnostic] 622 pub braces_for_struct: BracesForStructLiteral, 623 #[subdiagnostic] 624 pub no_fields_for_fn: NoFieldsForFnCall, 625 } 626 627 #[derive(Subdiagnostic)] 628 #[multipart_suggestion(parse_suggestion_braces_for_struct, applicability = "maybe-incorrect")] 629 pub(crate) struct BracesForStructLiteral { 630 #[suggestion_part(code = " {{ ")] 631 pub first: Span, 632 #[suggestion_part(code = " }}")] 633 pub second: Span, 634 } 635 636 #[derive(Subdiagnostic)] 637 #[multipart_suggestion(parse_suggestion_no_fields_for_fn, applicability = "maybe-incorrect")] 638 pub(crate) struct NoFieldsForFnCall { 639 #[suggestion_part(code = "")] 640 pub fields: Vec<Span>, 641 } 642 643 #[derive(Diagnostic)] 644 #[diag(parse_labeled_loop_in_break)] 645 pub(crate) struct LabeledLoopInBreak { 646 #[primary_span] 647 pub span: Span, 648 #[subdiagnostic] 649 pub sub: WrapExpressionInParentheses, 650 } 651 652 #[derive(Subdiagnostic)] 653 #[multipart_suggestion( 654 parse_sugg_wrap_expression_in_parentheses, 655 applicability = "machine-applicable" 656 )] 657 pub(crate) struct WrapExpressionInParentheses { 658 #[suggestion_part(code = "(")] 659 pub left: Span, 660 #[suggestion_part(code = ")")] 661 pub right: Span, 662 } 663 664 #[derive(Diagnostic)] 665 #[diag(parse_array_brackets_instead_of_braces)] 666 pub(crate) struct ArrayBracketsInsteadOfSpaces { 667 #[primary_span] 668 pub span: Span, 669 #[subdiagnostic] 670 pub sub: ArrayBracketsInsteadOfSpacesSugg, 671 } 672 673 #[derive(Subdiagnostic)] 674 #[multipart_suggestion(parse_suggestion, applicability = "maybe-incorrect")] 675 pub(crate) struct ArrayBracketsInsteadOfSpacesSugg { 676 #[suggestion_part(code = "[")] 677 pub left: Span, 678 #[suggestion_part(code = "]")] 679 pub right: Span, 680 } 681 682 #[derive(Diagnostic)] 683 #[diag(parse_match_arm_body_without_braces)] 684 pub(crate) struct MatchArmBodyWithoutBraces { 685 #[primary_span] 686 #[label(parse_label_statements)] 687 pub statements: Span, 688 #[label(parse_label_arrow)] 689 pub arrow: Span, 690 pub num_statements: usize, 691 #[subdiagnostic] 692 pub sub: MatchArmBodyWithoutBracesSugg, 693 } 694 695 #[derive(Diagnostic)] 696 #[diag(parse_inclusive_range_extra_equals)] 697 #[note] 698 pub(crate) struct InclusiveRangeExtraEquals { 699 #[primary_span] 700 #[suggestion( 701 parse_suggestion_remove_eq, 702 style = "short", 703 code = "..=", 704 applicability = "maybe-incorrect" 705 )] 706 pub span: Span, 707 } 708 709 #[derive(Diagnostic)] 710 #[diag(parse_inclusive_range_match_arrow)] 711 pub(crate) struct InclusiveRangeMatchArrow { 712 #[primary_span] 713 pub arrow: Span, 714 #[label] 715 pub span: Span, 716 #[suggestion(style = "verbose", code = " ", applicability = "machine-applicable")] 717 pub after_pat: Span, 718 } 719 720 #[derive(Diagnostic)] 721 #[diag(parse_inclusive_range_no_end, code = "E0586")] 722 #[note] 723 pub(crate) struct InclusiveRangeNoEnd { 724 #[primary_span] 725 #[suggestion( 726 parse_suggestion_open_range, 727 code = "..", 728 applicability = "machine-applicable", 729 style = "short" 730 )] 731 pub span: Span, 732 } 733 734 #[derive(Subdiagnostic)] 735 pub(crate) enum MatchArmBodyWithoutBracesSugg { 736 #[multipart_suggestion(parse_suggestion_add_braces, applicability = "machine-applicable")] 737 AddBraces { 738 #[suggestion_part(code = "{{ ")] 739 left: Span, 740 #[suggestion_part(code = " }}")] 741 right: Span, 742 }, 743 #[suggestion( 744 parse_suggestion_use_comma_not_semicolon, 745 code = ",", 746 applicability = "machine-applicable" 747 )] 748 UseComma { 749 #[primary_span] 750 semicolon: Span, 751 }, 752 } 753 754 #[derive(Diagnostic)] 755 #[diag(parse_struct_literal_not_allowed_here)] 756 pub(crate) struct StructLiteralNotAllowedHere { 757 #[primary_span] 758 pub span: Span, 759 #[subdiagnostic] 760 pub sub: StructLiteralNotAllowedHereSugg, 761 } 762 763 #[derive(Subdiagnostic)] 764 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 765 pub(crate) struct StructLiteralNotAllowedHereSugg { 766 #[suggestion_part(code = "(")] 767 pub left: Span, 768 #[suggestion_part(code = ")")] 769 pub right: Span, 770 } 771 772 #[derive(Diagnostic)] 773 #[diag(parse_invalid_interpolated_expression)] 774 pub(crate) struct InvalidInterpolatedExpression { 775 #[primary_span] 776 pub span: Span, 777 } 778 779 #[derive(Diagnostic)] 780 #[diag(parse_invalid_literal_suffix_on_tuple_index)] 781 pub(crate) struct InvalidLiteralSuffixOnTupleIndex { 782 #[primary_span] 783 #[label] 784 pub span: Span, 785 pub suffix: Symbol, 786 #[help(parse_tuple_exception_line_1)] 787 #[help(parse_tuple_exception_line_2)] 788 #[help(parse_tuple_exception_line_3)] 789 pub exception: Option<()>, 790 } 791 792 #[derive(Diagnostic)] 793 #[diag(parse_non_string_abi_literal)] 794 pub(crate) struct NonStringAbiLiteral { 795 #[primary_span] 796 #[suggestion(code = "\"C\"", applicability = "maybe-incorrect")] 797 pub span: Span, 798 } 799 800 #[derive(Diagnostic)] 801 #[diag(parse_mismatched_closing_delimiter)] 802 pub(crate) struct MismatchedClosingDelimiter { 803 #[primary_span] 804 pub spans: Vec<Span>, 805 pub delimiter: String, 806 #[label(parse_label_unmatched)] 807 pub unmatched: Span, 808 #[label(parse_label_opening_candidate)] 809 pub opening_candidate: Option<Span>, 810 #[label(parse_label_unclosed)] 811 pub unclosed: Option<Span>, 812 } 813 814 #[derive(Diagnostic)] 815 #[diag(parse_incorrect_visibility_restriction, code = "E0704")] 816 #[help] 817 pub(crate) struct IncorrectVisibilityRestriction { 818 #[primary_span] 819 #[suggestion(code = "in {inner_str}", applicability = "machine-applicable")] 820 pub span: Span, 821 pub inner_str: String, 822 } 823 824 #[derive(Diagnostic)] 825 #[diag(parse_assignment_else_not_allowed)] 826 pub(crate) struct AssignmentElseNotAllowed { 827 #[primary_span] 828 pub span: Span, 829 } 830 831 #[derive(Diagnostic)] 832 #[diag(parse_expected_statement_after_outer_attr)] 833 pub(crate) struct ExpectedStatementAfterOuterAttr { 834 #[primary_span] 835 pub span: Span, 836 } 837 838 #[derive(Diagnostic)] 839 #[diag(parse_doc_comment_does_not_document_anything, code = "E0585")] 840 #[help] 841 pub(crate) struct DocCommentDoesNotDocumentAnything { 842 #[primary_span] 843 pub span: Span, 844 #[suggestion(code = ",", applicability = "machine-applicable")] 845 pub missing_comma: Option<Span>, 846 } 847 848 #[derive(Diagnostic)] 849 #[diag(parse_const_let_mutually_exclusive)] 850 pub(crate) struct ConstLetMutuallyExclusive { 851 #[primary_span] 852 #[suggestion(code = "const", applicability = "maybe-incorrect")] 853 pub span: Span, 854 } 855 856 #[derive(Diagnostic)] 857 #[diag(parse_invalid_expression_in_let_else)] 858 pub(crate) struct InvalidExpressionInLetElse { 859 #[primary_span] 860 pub span: Span, 861 pub operator: &'static str, 862 #[subdiagnostic] 863 pub sugg: WrapExpressionInParentheses, 864 } 865 866 #[derive(Diagnostic)] 867 #[diag(parse_invalid_curly_in_let_else)] 868 pub(crate) struct InvalidCurlyInLetElse { 869 #[primary_span] 870 pub span: Span, 871 #[subdiagnostic] 872 pub sugg: WrapExpressionInParentheses, 873 } 874 875 #[derive(Diagnostic)] 876 #[diag(parse_compound_assignment_expression_in_let)] 877 #[help] 878 pub(crate) struct CompoundAssignmentExpressionInLet { 879 #[primary_span] 880 #[suggestion(style = "short", code = "=", applicability = "maybe-incorrect")] 881 pub span: Span, 882 } 883 884 #[derive(Diagnostic)] 885 #[diag(parse_suffixed_literal_in_attribute)] 886 #[help] 887 pub(crate) struct SuffixedLiteralInAttribute { 888 #[primary_span] 889 pub span: Span, 890 } 891 892 #[derive(Diagnostic)] 893 #[diag(parse_invalid_meta_item)] 894 pub(crate) struct InvalidMetaItem { 895 #[primary_span] 896 pub span: Span, 897 pub token: Token, 898 } 899 900 #[derive(Subdiagnostic)] 901 #[suggestion( 902 parse_sugg_escape_identifier, 903 style = "verbose", 904 applicability = "maybe-incorrect", 905 code = "r#" 906 )] 907 pub(crate) struct SuggEscapeIdentifier { 908 #[primary_span] 909 pub span: Span, 910 pub ident_name: String, 911 } 912 913 #[derive(Subdiagnostic)] 914 #[suggestion(parse_sugg_remove_comma, applicability = "machine-applicable", code = "")] 915 pub(crate) struct SuggRemoveComma { 916 #[primary_span] 917 pub span: Span, 918 } 919 920 #[derive(Subdiagnostic)] 921 #[suggestion( 922 parse_sugg_add_let_for_stmt, 923 style = "verbose", 924 applicability = "maybe-incorrect", 925 code = "let " 926 )] 927 pub(crate) struct SuggAddMissingLetStmt { 928 #[primary_span] 929 pub span: Span, 930 } 931 932 #[derive(Subdiagnostic)] 933 pub(crate) enum ExpectedIdentifierFound { 934 #[label(parse_expected_identifier_found_reserved_identifier)] 935 ReservedIdentifier(#[primary_span] Span), 936 #[label(parse_expected_identifier_found_keyword)] 937 Keyword(#[primary_span] Span), 938 #[label(parse_expected_identifier_found_reserved_keyword)] 939 ReservedKeyword(#[primary_span] Span), 940 #[label(parse_expected_identifier_found_doc_comment)] 941 DocComment(#[primary_span] Span), 942 #[label(parse_expected_identifier)] 943 Other(#[primary_span] Span), 944 } 945 946 impl ExpectedIdentifierFound { new(token_descr: Option<TokenDescription>, span: Span) -> Self947 pub fn new(token_descr: Option<TokenDescription>, span: Span) -> Self { 948 (match token_descr { 949 Some(TokenDescription::ReservedIdentifier) => { 950 ExpectedIdentifierFound::ReservedIdentifier 951 } 952 Some(TokenDescription::Keyword) => ExpectedIdentifierFound::Keyword, 953 Some(TokenDescription::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword, 954 Some(TokenDescription::DocComment) => ExpectedIdentifierFound::DocComment, 955 None => ExpectedIdentifierFound::Other, 956 })(span) 957 } 958 } 959 960 pub(crate) struct ExpectedIdentifier { 961 pub span: Span, 962 pub token: Token, 963 pub suggest_raw: Option<SuggEscapeIdentifier>, 964 pub suggest_remove_comma: Option<SuggRemoveComma>, 965 pub help_cannot_start_number: Option<HelpIdentifierStartsWithNumber>, 966 } 967 968 impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedIdentifier { 969 #[track_caller] into_diagnostic( self, handler: &'a rustc_errors::Handler, ) -> rustc_errors::DiagnosticBuilder<'a, G>970 fn into_diagnostic( 971 self, 972 handler: &'a rustc_errors::Handler, 973 ) -> rustc_errors::DiagnosticBuilder<'a, G> { 974 let token_descr = TokenDescription::from_token(&self.token); 975 976 let mut diag = handler.struct_diagnostic(match token_descr { 977 Some(TokenDescription::ReservedIdentifier) => { 978 fluent::parse_expected_identifier_found_reserved_identifier_str 979 } 980 Some(TokenDescription::Keyword) => fluent::parse_expected_identifier_found_keyword_str, 981 Some(TokenDescription::ReservedKeyword) => { 982 fluent::parse_expected_identifier_found_reserved_keyword_str 983 } 984 Some(TokenDescription::DocComment) => { 985 fluent::parse_expected_identifier_found_doc_comment_str 986 } 987 None => fluent::parse_expected_identifier_found_str, 988 }); 989 diag.set_span(self.span); 990 diag.set_arg("token", self.token); 991 992 if let Some(sugg) = self.suggest_raw { 993 sugg.add_to_diagnostic(&mut diag); 994 } 995 996 ExpectedIdentifierFound::new(token_descr, self.span).add_to_diagnostic(&mut diag); 997 998 if let Some(sugg) = self.suggest_remove_comma { 999 sugg.add_to_diagnostic(&mut diag); 1000 } 1001 1002 if let Some(help) = self.help_cannot_start_number { 1003 help.add_to_diagnostic(&mut diag); 1004 } 1005 1006 diag 1007 } 1008 } 1009 1010 #[derive(Subdiagnostic)] 1011 #[help(parse_invalid_identifier_with_leading_number)] 1012 pub(crate) struct HelpIdentifierStartsWithNumber { 1013 #[primary_span] 1014 pub num_span: Span, 1015 } 1016 1017 pub(crate) struct ExpectedSemi { 1018 pub span: Span, 1019 pub token: Token, 1020 1021 pub unexpected_token_label: Option<Span>, 1022 pub sugg: ExpectedSemiSugg, 1023 } 1024 1025 impl<'a, G: EmissionGuarantee> IntoDiagnostic<'a, G> for ExpectedSemi { 1026 #[track_caller] into_diagnostic( self, handler: &'a rustc_errors::Handler, ) -> rustc_errors::DiagnosticBuilder<'a, G>1027 fn into_diagnostic( 1028 self, 1029 handler: &'a rustc_errors::Handler, 1030 ) -> rustc_errors::DiagnosticBuilder<'a, G> { 1031 let token_descr = TokenDescription::from_token(&self.token); 1032 1033 let mut diag = handler.struct_diagnostic(match token_descr { 1034 Some(TokenDescription::ReservedIdentifier) => { 1035 fluent::parse_expected_semi_found_reserved_identifier_str 1036 } 1037 Some(TokenDescription::Keyword) => fluent::parse_expected_semi_found_keyword_str, 1038 Some(TokenDescription::ReservedKeyword) => { 1039 fluent::parse_expected_semi_found_reserved_keyword_str 1040 } 1041 Some(TokenDescription::DocComment) => fluent::parse_expected_semi_found_doc_comment_str, 1042 None => fluent::parse_expected_semi_found_str, 1043 }); 1044 diag.set_span(self.span); 1045 diag.set_arg("token", self.token); 1046 1047 if let Some(unexpected_token_label) = self.unexpected_token_label { 1048 diag.span_label(unexpected_token_label, fluent::parse_label_unexpected_token); 1049 } 1050 1051 self.sugg.add_to_diagnostic(&mut diag); 1052 1053 diag 1054 } 1055 } 1056 1057 #[derive(Subdiagnostic)] 1058 pub(crate) enum ExpectedSemiSugg { 1059 #[suggestion(parse_sugg_change_this_to_semi, code = ";", applicability = "machine-applicable")] 1060 ChangeToSemi(#[primary_span] Span), 1061 #[suggestion( 1062 parse_sugg_add_semi, 1063 style = "short", 1064 code = ";", 1065 applicability = "machine-applicable" 1066 )] 1067 AddSemi(#[primary_span] Span), 1068 } 1069 1070 #[derive(Diagnostic)] 1071 #[diag(parse_struct_literal_body_without_path)] 1072 pub(crate) struct StructLiteralBodyWithoutPath { 1073 #[primary_span] 1074 pub span: Span, 1075 #[subdiagnostic] 1076 pub sugg: StructLiteralBodyWithoutPathSugg, 1077 } 1078 1079 #[derive(Subdiagnostic)] 1080 #[multipart_suggestion(parse_suggestion, applicability = "has-placeholders")] 1081 pub(crate) struct StructLiteralBodyWithoutPathSugg { 1082 #[suggestion_part(code = "{{ SomeStruct ")] 1083 pub before: Span, 1084 #[suggestion_part(code = " }}")] 1085 pub after: Span, 1086 } 1087 1088 #[derive(Diagnostic)] 1089 #[diag(parse_struct_literal_needing_parens)] 1090 pub(crate) struct StructLiteralNeedingParens { 1091 #[primary_span] 1092 pub span: Span, 1093 #[subdiagnostic] 1094 pub sugg: StructLiteralNeedingParensSugg, 1095 } 1096 1097 #[derive(Subdiagnostic)] 1098 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1099 pub(crate) struct StructLiteralNeedingParensSugg { 1100 #[suggestion_part(code = "(")] 1101 pub before: Span, 1102 #[suggestion_part(code = ")")] 1103 pub after: Span, 1104 } 1105 1106 #[derive(Diagnostic)] 1107 #[diag(parse_unmatched_angle_brackets)] 1108 pub(crate) struct UnmatchedAngleBrackets { 1109 #[primary_span] 1110 #[suggestion(code = "", applicability = "machine-applicable")] 1111 pub span: Span, 1112 pub num_extra_brackets: usize, 1113 } 1114 1115 #[derive(Diagnostic)] 1116 #[diag(parse_generic_parameters_without_angle_brackets)] 1117 pub(crate) struct GenericParamsWithoutAngleBrackets { 1118 #[primary_span] 1119 pub span: Span, 1120 #[subdiagnostic] 1121 pub sugg: GenericParamsWithoutAngleBracketsSugg, 1122 } 1123 1124 #[derive(Subdiagnostic)] 1125 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1126 pub(crate) struct GenericParamsWithoutAngleBracketsSugg { 1127 #[suggestion_part(code = "<")] 1128 pub left: Span, 1129 #[suggestion_part(code = ">")] 1130 pub right: Span, 1131 } 1132 1133 #[derive(Diagnostic)] 1134 #[diag(parse_comparison_operators_cannot_be_chained)] 1135 pub(crate) struct ComparisonOperatorsCannotBeChained { 1136 #[primary_span] 1137 pub span: Vec<Span>, 1138 #[suggestion( 1139 parse_sugg_turbofish_syntax, 1140 style = "verbose", 1141 code = "::", 1142 applicability = "maybe-incorrect" 1143 )] 1144 pub suggest_turbofish: Option<Span>, 1145 #[help(parse_sugg_turbofish_syntax)] 1146 #[help(parse_sugg_parentheses_for_function_args)] 1147 pub help_turbofish: Option<()>, 1148 #[subdiagnostic] 1149 pub chaining_sugg: Option<ComparisonOperatorsCannotBeChainedSugg>, 1150 } 1151 1152 #[derive(Subdiagnostic)] 1153 pub(crate) enum ComparisonOperatorsCannotBeChainedSugg { 1154 #[suggestion( 1155 parse_sugg_split_comparison, 1156 style = "verbose", 1157 code = " && {middle_term}", 1158 applicability = "maybe-incorrect" 1159 )] 1160 SplitComparison { 1161 #[primary_span] 1162 span: Span, 1163 middle_term: String, 1164 }, 1165 #[multipart_suggestion(parse_sugg_parenthesize, applicability = "maybe-incorrect")] 1166 Parenthesize { 1167 #[suggestion_part(code = "(")] 1168 left: Span, 1169 #[suggestion_part(code = ")")] 1170 right: Span, 1171 }, 1172 } 1173 1174 #[derive(Diagnostic)] 1175 #[diag(parse_question_mark_in_type)] 1176 pub(crate) struct QuestionMarkInType { 1177 #[primary_span] 1178 #[label] 1179 pub span: Span, 1180 #[subdiagnostic] 1181 pub sugg: QuestionMarkInTypeSugg, 1182 } 1183 1184 #[derive(Subdiagnostic)] 1185 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1186 pub(crate) struct QuestionMarkInTypeSugg { 1187 #[suggestion_part(code = "Option<")] 1188 pub left: Span, 1189 #[suggestion_part(code = ">")] 1190 pub right: Span, 1191 } 1192 1193 #[derive(Diagnostic)] 1194 #[diag(parse_unexpected_parentheses_in_for_head)] 1195 pub(crate) struct ParenthesesInForHead { 1196 #[primary_span] 1197 pub span: Vec<Span>, 1198 #[subdiagnostic] 1199 pub sugg: ParenthesesInForHeadSugg, 1200 } 1201 1202 #[derive(Subdiagnostic)] 1203 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1204 pub(crate) struct ParenthesesInForHeadSugg { 1205 #[suggestion_part(code = "{left_snippet}")] 1206 pub left: Span, 1207 pub left_snippet: String, 1208 #[suggestion_part(code = "{right_snippet}")] 1209 pub right: Span, 1210 pub right_snippet: String, 1211 } 1212 1213 #[derive(Diagnostic)] 1214 #[diag(parse_doc_comment_on_param_type)] 1215 pub(crate) struct DocCommentOnParamType { 1216 #[primary_span] 1217 #[label] 1218 pub span: Span, 1219 } 1220 1221 #[derive(Diagnostic)] 1222 #[diag(parse_attribute_on_param_type)] 1223 pub(crate) struct AttributeOnParamType { 1224 #[primary_span] 1225 #[label] 1226 pub span: Span, 1227 } 1228 1229 #[derive(Diagnostic)] 1230 #[diag(parse_pattern_method_param_without_body, code = "E0642")] 1231 pub(crate) struct PatternMethodParamWithoutBody { 1232 #[primary_span] 1233 #[suggestion(code = "_", applicability = "machine-applicable")] 1234 pub span: Span, 1235 } 1236 1237 #[derive(Diagnostic)] 1238 #[diag(parse_self_param_not_first)] 1239 pub(crate) struct SelfParamNotFirst { 1240 #[primary_span] 1241 #[label] 1242 pub span: Span, 1243 } 1244 1245 #[derive(Diagnostic)] 1246 #[diag(parse_const_generic_without_braces)] 1247 pub(crate) struct ConstGenericWithoutBraces { 1248 #[primary_span] 1249 pub span: Span, 1250 #[subdiagnostic] 1251 pub sugg: ConstGenericWithoutBracesSugg, 1252 } 1253 1254 #[derive(Subdiagnostic)] 1255 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1256 pub(crate) struct ConstGenericWithoutBracesSugg { 1257 #[suggestion_part(code = "{{ ")] 1258 pub left: Span, 1259 #[suggestion_part(code = " }}")] 1260 pub right: Span, 1261 } 1262 1263 #[derive(Diagnostic)] 1264 #[diag(parse_unexpected_const_param_declaration)] 1265 pub(crate) struct UnexpectedConstParamDeclaration { 1266 #[primary_span] 1267 #[label] 1268 pub span: Span, 1269 #[subdiagnostic] 1270 pub sugg: Option<UnexpectedConstParamDeclarationSugg>, 1271 } 1272 1273 #[derive(Subdiagnostic)] 1274 pub(crate) enum UnexpectedConstParamDeclarationSugg { 1275 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1276 AddParam { 1277 #[suggestion_part(code = "<{snippet}>")] 1278 impl_generics: Span, 1279 #[suggestion_part(code = "{ident}")] 1280 incorrect_decl: Span, 1281 snippet: String, 1282 ident: String, 1283 }, 1284 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1285 AppendParam { 1286 #[suggestion_part(code = ", {snippet}")] 1287 impl_generics_end: Span, 1288 #[suggestion_part(code = "{ident}")] 1289 incorrect_decl: Span, 1290 snippet: String, 1291 ident: String, 1292 }, 1293 } 1294 1295 #[derive(Diagnostic)] 1296 #[diag(parse_unexpected_const_in_generic_param)] 1297 pub(crate) struct UnexpectedConstInGenericParam { 1298 #[primary_span] 1299 pub span: Span, 1300 #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")] 1301 pub to_remove: Option<Span>, 1302 } 1303 1304 #[derive(Diagnostic)] 1305 #[diag(parse_async_move_order_incorrect)] 1306 pub(crate) struct AsyncMoveOrderIncorrect { 1307 #[primary_span] 1308 #[suggestion(style = "verbose", code = "async move", applicability = "maybe-incorrect")] 1309 pub span: Span, 1310 } 1311 1312 #[derive(Diagnostic)] 1313 #[diag(parse_double_colon_in_bound)] 1314 pub(crate) struct DoubleColonInBound { 1315 #[primary_span] 1316 pub span: Span, 1317 #[suggestion(code = ": ", applicability = "machine-applicable")] 1318 pub between: Span, 1319 } 1320 1321 #[derive(Diagnostic)] 1322 #[diag(parse_fn_ptr_with_generics)] 1323 pub(crate) struct FnPtrWithGenerics { 1324 #[primary_span] 1325 pub span: Span, 1326 #[subdiagnostic] 1327 pub sugg: Option<FnPtrWithGenericsSugg>, 1328 } 1329 1330 #[derive(Subdiagnostic)] 1331 #[multipart_suggestion(parse_suggestion, applicability = "maybe-incorrect")] 1332 pub(crate) struct FnPtrWithGenericsSugg { 1333 #[suggestion_part(code = "{snippet}")] 1334 pub left: Span, 1335 pub snippet: String, 1336 #[suggestion_part(code = "")] 1337 pub right: Span, 1338 pub arity: usize, 1339 pub for_param_list_exists: bool, 1340 } 1341 1342 #[derive(Diagnostic)] 1343 #[diag(parse_unexpected_if_with_if)] 1344 pub(crate) struct UnexpectedIfWithIf( 1345 #[primary_span] 1346 #[suggestion(applicability = "machine-applicable", code = " ", style = "verbose")] 1347 pub Span, 1348 ); 1349 1350 #[derive(Diagnostic)] 1351 #[diag(parse_maybe_fn_typo_with_impl)] 1352 pub(crate) struct FnTypoWithImpl { 1353 #[primary_span] 1354 #[suggestion(applicability = "maybe-incorrect", code = "impl", style = "verbose")] 1355 pub fn_span: Span, 1356 } 1357 1358 #[derive(Diagnostic)] 1359 #[diag(parse_expected_fn_path_found_fn_keyword)] 1360 pub(crate) struct ExpectedFnPathFoundFnKeyword { 1361 #[primary_span] 1362 #[suggestion(applicability = "machine-applicable", code = "Fn", style = "verbose")] 1363 pub fn_token_span: Span, 1364 } 1365 1366 #[derive(Diagnostic)] 1367 #[diag(parse_path_single_colon)] 1368 pub(crate) struct PathSingleColon { 1369 #[primary_span] 1370 #[suggestion(applicability = "machine-applicable", code = "::")] 1371 pub span: Span, 1372 1373 #[note(parse_type_ascription_removed)] 1374 pub type_ascription: Option<()>, 1375 } 1376 1377 #[derive(Diagnostic)] 1378 #[diag(parse_colon_as_semi)] 1379 pub(crate) struct ColonAsSemi { 1380 #[primary_span] 1381 #[suggestion(applicability = "machine-applicable", code = ";")] 1382 pub span: Span, 1383 1384 #[note(parse_type_ascription_removed)] 1385 pub type_ascription: Option<()>, 1386 } 1387 1388 #[derive(Diagnostic)] 1389 #[diag(parse_where_clause_before_tuple_struct_body)] 1390 pub(crate) struct WhereClauseBeforeTupleStructBody { 1391 #[primary_span] 1392 #[label] 1393 pub span: Span, 1394 #[label(parse_name_label)] 1395 pub name: Span, 1396 #[label(parse_body_label)] 1397 pub body: Span, 1398 #[subdiagnostic] 1399 pub sugg: Option<WhereClauseBeforeTupleStructBodySugg>, 1400 } 1401 1402 #[derive(Subdiagnostic)] 1403 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1404 pub(crate) struct WhereClauseBeforeTupleStructBodySugg { 1405 #[suggestion_part(code = "{snippet}")] 1406 pub left: Span, 1407 pub snippet: String, 1408 #[suggestion_part(code = "")] 1409 pub right: Span, 1410 } 1411 1412 #[derive(Diagnostic)] 1413 #[diag(parse_async_fn_in_2015, code = "E0670")] 1414 pub(crate) struct AsyncFnIn2015 { 1415 #[primary_span] 1416 #[label] 1417 pub span: Span, 1418 #[subdiagnostic] 1419 pub help: HelpUseLatestEdition, 1420 } 1421 1422 #[derive(Subdiagnostic)] 1423 #[label(parse_async_block_in_2015)] 1424 pub(crate) struct AsyncBlockIn2015 { 1425 #[primary_span] 1426 pub span: Span, 1427 } 1428 1429 #[derive(Diagnostic)] 1430 #[diag(parse_self_argument_pointer)] 1431 pub(crate) struct SelfArgumentPointer { 1432 #[primary_span] 1433 #[label] 1434 pub span: Span, 1435 } 1436 1437 #[derive(Diagnostic)] 1438 #[diag(parse_unexpected_token_after_dot)] 1439 pub struct UnexpectedTokenAfterDot<'a> { 1440 #[primary_span] 1441 pub span: Span, 1442 pub actual: Cow<'a, str>, 1443 } 1444 1445 #[derive(Diagnostic)] 1446 #[diag(parse_visibility_not_followed_by_item)] 1447 #[help] 1448 pub(crate) struct VisibilityNotFollowedByItem { 1449 #[primary_span] 1450 #[label] 1451 pub span: Span, 1452 pub vis: Visibility, 1453 } 1454 1455 #[derive(Diagnostic)] 1456 #[diag(parse_default_not_followed_by_item)] 1457 #[note] 1458 pub(crate) struct DefaultNotFollowedByItem { 1459 #[primary_span] 1460 #[label] 1461 pub span: Span, 1462 } 1463 1464 #[derive(Diagnostic)] 1465 pub(crate) enum MissingKeywordForItemDefinition { 1466 #[diag(parse_missing_struct_for_struct_definition)] 1467 Struct { 1468 #[primary_span] 1469 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " struct ")] 1470 span: Span, 1471 ident: Ident, 1472 }, 1473 #[diag(parse_missing_fn_for_function_definition)] 1474 Function { 1475 #[primary_span] 1476 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " fn ")] 1477 span: Span, 1478 ident: Ident, 1479 }, 1480 #[diag(parse_missing_fn_for_method_definition)] 1481 Method { 1482 #[primary_span] 1483 #[suggestion(style = "short", applicability = "maybe-incorrect", code = " fn ")] 1484 span: Span, 1485 ident: Ident, 1486 }, 1487 #[diag(parse_ambiguous_missing_keyword_for_item_definition)] 1488 Ambiguous { 1489 #[primary_span] 1490 span: Span, 1491 #[subdiagnostic] 1492 subdiag: Option<AmbiguousMissingKwForItemSub>, 1493 }, 1494 } 1495 1496 #[derive(Subdiagnostic)] 1497 pub(crate) enum AmbiguousMissingKwForItemSub { 1498 #[suggestion(parse_suggestion, applicability = "maybe-incorrect", code = "{snippet}!")] 1499 SuggestMacro { 1500 #[primary_span] 1501 span: Span, 1502 snippet: String, 1503 }, 1504 #[help(parse_help)] 1505 HelpMacro, 1506 } 1507 1508 #[derive(Diagnostic)] 1509 #[diag(parse_missing_trait_in_trait_impl)] 1510 pub(crate) struct MissingTraitInTraitImpl { 1511 #[primary_span] 1512 #[suggestion(parse_suggestion_add_trait, code = " Trait ", applicability = "has-placeholders")] 1513 pub span: Span, 1514 #[suggestion(parse_suggestion_remove_for, code = "", applicability = "maybe-incorrect")] 1515 pub for_span: Span, 1516 } 1517 1518 #[derive(Diagnostic)] 1519 #[diag(parse_missing_for_in_trait_impl)] 1520 pub(crate) struct MissingForInTraitImpl { 1521 #[primary_span] 1522 #[suggestion(style = "short", code = " for ", applicability = "machine-applicable")] 1523 pub span: Span, 1524 } 1525 1526 #[derive(Diagnostic)] 1527 #[diag(parse_expected_trait_in_trait_impl_found_type)] 1528 pub(crate) struct ExpectedTraitInTraitImplFoundType { 1529 #[primary_span] 1530 pub span: Span, 1531 } 1532 1533 #[derive(Diagnostic)] 1534 #[diag(parse_extra_impl_keyword_in_trait_impl)] 1535 pub(crate) struct ExtraImplKeywordInTraitImpl { 1536 #[primary_span] 1537 #[suggestion(code = "", applicability = "maybe-incorrect")] 1538 pub extra_impl_kw: Span, 1539 #[note] 1540 pub impl_trait_span: Span, 1541 } 1542 1543 #[derive(Diagnostic)] 1544 #[diag(parse_bounds_not_allowed_on_trait_aliases)] 1545 pub(crate) struct BoundsNotAllowedOnTraitAliases { 1546 #[primary_span] 1547 pub span: Span, 1548 } 1549 1550 #[derive(Diagnostic)] 1551 #[diag(parse_trait_alias_cannot_be_auto)] 1552 pub(crate) struct TraitAliasCannotBeAuto { 1553 #[primary_span] 1554 #[label(parse_trait_alias_cannot_be_auto)] 1555 pub span: Span, 1556 } 1557 1558 #[derive(Diagnostic)] 1559 #[diag(parse_trait_alias_cannot_be_unsafe)] 1560 pub(crate) struct TraitAliasCannotBeUnsafe { 1561 #[primary_span] 1562 #[label(parse_trait_alias_cannot_be_unsafe)] 1563 pub span: Span, 1564 } 1565 1566 #[derive(Diagnostic)] 1567 #[diag(parse_associated_static_item_not_allowed)] 1568 pub(crate) struct AssociatedStaticItemNotAllowed { 1569 #[primary_span] 1570 pub span: Span, 1571 } 1572 1573 #[derive(Diagnostic)] 1574 #[diag(parse_extern_crate_name_with_dashes)] 1575 pub(crate) struct ExternCrateNameWithDashes { 1576 #[primary_span] 1577 #[label] 1578 pub span: Span, 1579 #[subdiagnostic] 1580 pub sugg: ExternCrateNameWithDashesSugg, 1581 } 1582 1583 #[derive(Subdiagnostic)] 1584 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 1585 pub(crate) struct ExternCrateNameWithDashesSugg { 1586 #[suggestion_part(code = "_")] 1587 pub dashes: Vec<Span>, 1588 } 1589 1590 #[derive(Diagnostic)] 1591 #[diag(parse_extern_item_cannot_be_const)] 1592 #[note] 1593 pub(crate) struct ExternItemCannotBeConst { 1594 #[primary_span] 1595 pub ident_span: Span, 1596 #[suggestion(code = "static ", applicability = "machine-applicable")] 1597 pub const_span: Span, 1598 } 1599 1600 #[derive(Diagnostic)] 1601 #[diag(parse_const_global_cannot_be_mutable)] 1602 pub(crate) struct ConstGlobalCannotBeMutable { 1603 #[primary_span] 1604 #[label] 1605 pub ident_span: Span, 1606 #[suggestion(code = "static", applicability = "maybe-incorrect")] 1607 pub const_span: Span, 1608 } 1609 1610 #[derive(Diagnostic)] 1611 #[diag(parse_missing_const_type)] 1612 pub(crate) struct MissingConstType { 1613 #[primary_span] 1614 #[suggestion(code = "{colon} <type>", applicability = "has-placeholders")] 1615 pub span: Span, 1616 1617 pub kind: &'static str, 1618 pub colon: &'static str, 1619 } 1620 1621 #[derive(Diagnostic)] 1622 #[diag(parse_enum_struct_mutually_exclusive)] 1623 pub(crate) struct EnumStructMutuallyExclusive { 1624 #[primary_span] 1625 #[suggestion(code = "enum", applicability = "machine-applicable")] 1626 pub span: Span, 1627 } 1628 1629 #[derive(Diagnostic)] 1630 pub(crate) enum UnexpectedTokenAfterStructName { 1631 #[diag(parse_unexpected_token_after_struct_name_found_reserved_identifier)] 1632 ReservedIdentifier { 1633 #[primary_span] 1634 #[label(parse_unexpected_token_after_struct_name)] 1635 span: Span, 1636 token: Token, 1637 }, 1638 #[diag(parse_unexpected_token_after_struct_name_found_keyword)] 1639 Keyword { 1640 #[primary_span] 1641 #[label(parse_unexpected_token_after_struct_name)] 1642 span: Span, 1643 token: Token, 1644 }, 1645 #[diag(parse_unexpected_token_after_struct_name_found_reserved_keyword)] 1646 ReservedKeyword { 1647 #[primary_span] 1648 #[label(parse_unexpected_token_after_struct_name)] 1649 span: Span, 1650 token: Token, 1651 }, 1652 #[diag(parse_unexpected_token_after_struct_name_found_doc_comment)] 1653 DocComment { 1654 #[primary_span] 1655 #[label(parse_unexpected_token_after_struct_name)] 1656 span: Span, 1657 token: Token, 1658 }, 1659 #[diag(parse_unexpected_token_after_struct_name_found_other)] 1660 Other { 1661 #[primary_span] 1662 #[label(parse_unexpected_token_after_struct_name)] 1663 span: Span, 1664 token: Token, 1665 }, 1666 } 1667 1668 impl UnexpectedTokenAfterStructName { new(span: Span, token: Token) -> Self1669 pub fn new(span: Span, token: Token) -> Self { 1670 match TokenDescription::from_token(&token) { 1671 Some(TokenDescription::ReservedIdentifier) => Self::ReservedIdentifier { span, token }, 1672 Some(TokenDescription::Keyword) => Self::Keyword { span, token }, 1673 Some(TokenDescription::ReservedKeyword) => Self::ReservedKeyword { span, token }, 1674 Some(TokenDescription::DocComment) => Self::DocComment { span, token }, 1675 None => Self::Other { span, token }, 1676 } 1677 } 1678 } 1679 1680 #[derive(Diagnostic)] 1681 #[diag(parse_unexpected_self_in_generic_parameters)] 1682 #[note] 1683 pub(crate) struct UnexpectedSelfInGenericParameters { 1684 #[primary_span] 1685 pub span: Span, 1686 } 1687 1688 #[derive(Diagnostic)] 1689 #[diag(parse_unexpected_default_value_for_lifetime_in_generic_parameters)] 1690 pub(crate) struct UnexpectedDefaultValueForLifetimeInGenericParameters { 1691 #[primary_span] 1692 #[label] 1693 pub span: Span, 1694 } 1695 1696 #[derive(Diagnostic)] 1697 #[diag(parse_multiple_where_clauses)] 1698 pub(crate) struct MultipleWhereClauses { 1699 #[primary_span] 1700 pub span: Span, 1701 #[label] 1702 pub previous: Span, 1703 #[suggestion(style = "verbose", code = ",", applicability = "maybe-incorrect")] 1704 pub between: Span, 1705 } 1706 1707 #[derive(Diagnostic)] 1708 pub(crate) enum UnexpectedNonterminal { 1709 #[diag(parse_nonterminal_expected_item_keyword)] 1710 Item(#[primary_span] Span), 1711 #[diag(parse_nonterminal_expected_statement)] 1712 Statement(#[primary_span] Span), 1713 #[diag(parse_nonterminal_expected_ident)] 1714 Ident { 1715 #[primary_span] 1716 span: Span, 1717 token: Token, 1718 }, 1719 #[diag(parse_nonterminal_expected_lifetime)] 1720 Lifetime { 1721 #[primary_span] 1722 span: Span, 1723 token: Token, 1724 }, 1725 } 1726 1727 #[derive(Diagnostic)] 1728 pub(crate) enum TopLevelOrPatternNotAllowed { 1729 #[diag(parse_or_pattern_not_allowed_in_let_binding)] 1730 LetBinding { 1731 #[primary_span] 1732 span: Span, 1733 #[subdiagnostic] 1734 sub: Option<TopLevelOrPatternNotAllowedSugg>, 1735 }, 1736 #[diag(parse_or_pattern_not_allowed_in_fn_parameters)] 1737 FunctionParameter { 1738 #[primary_span] 1739 span: Span, 1740 #[subdiagnostic] 1741 sub: Option<TopLevelOrPatternNotAllowedSugg>, 1742 }, 1743 } 1744 1745 #[derive(Diagnostic)] 1746 #[diag(parse_cannot_be_raw_ident)] 1747 pub struct CannotBeRawIdent { 1748 #[primary_span] 1749 pub span: Span, 1750 pub ident: Symbol, 1751 } 1752 1753 #[derive(Diagnostic)] 1754 #[diag(parse_cr_doc_comment)] 1755 pub struct CrDocComment { 1756 #[primary_span] 1757 pub span: Span, 1758 pub block: bool, 1759 } 1760 1761 #[derive(Diagnostic)] 1762 #[diag(parse_no_digits_literal, code = "E0768")] 1763 pub struct NoDigitsLiteral { 1764 #[primary_span] 1765 pub span: Span, 1766 } 1767 1768 #[derive(Diagnostic)] 1769 #[diag(parse_invalid_digit_literal)] 1770 pub struct InvalidDigitLiteral { 1771 #[primary_span] 1772 pub span: Span, 1773 pub base: u32, 1774 } 1775 1776 #[derive(Diagnostic)] 1777 #[diag(parse_empty_exponent_float)] 1778 pub struct EmptyExponentFloat { 1779 #[primary_span] 1780 pub span: Span, 1781 } 1782 1783 #[derive(Diagnostic)] 1784 #[diag(parse_float_literal_unsupported_base)] 1785 pub struct FloatLiteralUnsupportedBase { 1786 #[primary_span] 1787 pub span: Span, 1788 pub base: &'static str, 1789 } 1790 1791 #[derive(Diagnostic)] 1792 #[diag(parse_unknown_prefix)] 1793 #[note] 1794 pub struct UnknownPrefix<'a> { 1795 #[primary_span] 1796 #[label] 1797 pub span: Span, 1798 pub prefix: &'a str, 1799 #[subdiagnostic] 1800 pub sugg: Option<UnknownPrefixSugg>, 1801 } 1802 1803 #[derive(Subdiagnostic)] 1804 pub enum UnknownPrefixSugg { 1805 #[suggestion( 1806 parse_suggestion_br, 1807 code = "br", 1808 applicability = "maybe-incorrect", 1809 style = "verbose" 1810 )] 1811 UseBr(#[primary_span] Span), 1812 #[suggestion( 1813 parse_suggestion_whitespace, 1814 code = " ", 1815 applicability = "maybe-incorrect", 1816 style = "verbose" 1817 )] 1818 Whitespace(#[primary_span] Span), 1819 } 1820 1821 #[derive(Diagnostic)] 1822 #[diag(parse_too_many_hashes)] 1823 pub struct TooManyHashes { 1824 #[primary_span] 1825 pub span: Span, 1826 pub num: u32, 1827 } 1828 1829 #[derive(Diagnostic)] 1830 #[diag(parse_unknown_start_of_token)] 1831 pub struct UnknownTokenStart { 1832 #[primary_span] 1833 pub span: Span, 1834 pub escaped: String, 1835 #[subdiagnostic] 1836 pub sugg: Option<TokenSubstitution>, 1837 #[subdiagnostic] 1838 pub null: Option<UnknownTokenNull>, 1839 #[subdiagnostic] 1840 pub repeat: Option<UnknownTokenRepeat>, 1841 } 1842 1843 #[derive(Subdiagnostic)] 1844 pub enum TokenSubstitution { 1845 #[suggestion(parse_sugg_quotes, code = "{suggestion}", applicability = "maybe-incorrect")] 1846 DirectedQuotes { 1847 #[primary_span] 1848 span: Span, 1849 suggestion: String, 1850 ascii_str: &'static str, 1851 ascii_name: &'static str, 1852 }, 1853 #[suggestion(parse_sugg_other, code = "{suggestion}", applicability = "maybe-incorrect")] 1854 Other { 1855 #[primary_span] 1856 span: Span, 1857 suggestion: String, 1858 ch: String, 1859 u_name: &'static str, 1860 ascii_str: &'static str, 1861 ascii_name: &'static str, 1862 }, 1863 } 1864 1865 #[derive(Subdiagnostic)] 1866 #[note(parse_note_repeats)] 1867 pub struct UnknownTokenRepeat { 1868 pub repeats: usize, 1869 } 1870 1871 #[derive(Subdiagnostic)] 1872 #[help(parse_help_null)] 1873 pub struct UnknownTokenNull; 1874 1875 #[derive(Diagnostic)] 1876 pub enum UnescapeError { 1877 #[diag(parse_invalid_unicode_escape)] 1878 #[help] 1879 InvalidUnicodeEscape { 1880 #[primary_span] 1881 #[label] 1882 span: Span, 1883 surrogate: bool, 1884 }, 1885 #[diag(parse_escape_only_char)] 1886 EscapeOnlyChar { 1887 #[primary_span] 1888 span: Span, 1889 #[suggestion(parse_escape, applicability = "machine-applicable", code = "{escaped_sugg}")] 1890 char_span: Span, 1891 escaped_sugg: String, 1892 escaped_msg: String, 1893 byte: bool, 1894 }, 1895 #[diag(parse_bare_cr)] 1896 BareCr { 1897 #[primary_span] 1898 #[suggestion(parse_escape, applicability = "machine-applicable", code = "\\r")] 1899 span: Span, 1900 double_quotes: bool, 1901 }, 1902 #[diag(parse_bare_cr_in_raw_string)] 1903 BareCrRawString(#[primary_span] Span), 1904 #[diag(parse_too_short_hex_escape)] 1905 TooShortHexEscape(#[primary_span] Span), 1906 #[diag(parse_invalid_char_in_escape)] 1907 InvalidCharInEscape { 1908 #[primary_span] 1909 #[label] 1910 span: Span, 1911 is_hex: bool, 1912 ch: String, 1913 }, 1914 #[diag(parse_out_of_range_hex_escape)] 1915 OutOfRangeHexEscape( 1916 #[primary_span] 1917 #[label] 1918 Span, 1919 ), 1920 #[diag(parse_leading_underscore_unicode_escape)] 1921 LeadingUnderscoreUnicodeEscape { 1922 #[primary_span] 1923 #[label(parse_leading_underscore_unicode_escape_label)] 1924 span: Span, 1925 ch: String, 1926 }, 1927 #[diag(parse_overlong_unicode_escape)] 1928 OverlongUnicodeEscape( 1929 #[primary_span] 1930 #[label] 1931 Span, 1932 ), 1933 #[diag(parse_unclosed_unicode_escape)] 1934 UnclosedUnicodeEscape( 1935 #[primary_span] 1936 #[label] 1937 Span, 1938 #[suggestion( 1939 parse_terminate, 1940 code = "}}", 1941 applicability = "maybe-incorrect", 1942 style = "verbose" 1943 )] 1944 Span, 1945 ), 1946 #[diag(parse_no_brace_unicode_escape)] 1947 NoBraceInUnicodeEscape { 1948 #[primary_span] 1949 span: Span, 1950 #[label] 1951 label: Option<Span>, 1952 #[subdiagnostic] 1953 sub: NoBraceUnicodeSub, 1954 }, 1955 #[diag(parse_unicode_escape_in_byte)] 1956 #[help] 1957 UnicodeEscapeInByte( 1958 #[primary_span] 1959 #[label] 1960 Span, 1961 ), 1962 #[diag(parse_empty_unicode_escape)] 1963 EmptyUnicodeEscape( 1964 #[primary_span] 1965 #[label] 1966 Span, 1967 ), 1968 #[diag(parse_zero_chars)] 1969 ZeroChars( 1970 #[primary_span] 1971 #[label] 1972 Span, 1973 ), 1974 #[diag(parse_lone_slash)] 1975 LoneSlash( 1976 #[primary_span] 1977 #[label] 1978 Span, 1979 ), 1980 #[diag(parse_unskipped_whitespace)] 1981 UnskippedWhitespace { 1982 #[primary_span] 1983 span: Span, 1984 #[label] 1985 char_span: Span, 1986 ch: String, 1987 }, 1988 #[diag(parse_multiple_skipped_lines)] 1989 MultipleSkippedLinesWarning( 1990 #[primary_span] 1991 #[label] 1992 Span, 1993 ), 1994 #[diag(parse_more_than_one_char)] 1995 MoreThanOneChar { 1996 #[primary_span] 1997 span: Span, 1998 #[subdiagnostic] 1999 note: Option<MoreThanOneCharNote>, 2000 #[subdiagnostic] 2001 suggestion: MoreThanOneCharSugg, 2002 }, 2003 } 2004 2005 #[derive(Subdiagnostic)] 2006 pub enum MoreThanOneCharSugg { 2007 #[suggestion( 2008 parse_consider_normalized, 2009 code = "{normalized}", 2010 applicability = "machine-applicable" 2011 )] 2012 NormalizedForm { 2013 #[primary_span] 2014 span: Span, 2015 ch: String, 2016 normalized: String, 2017 }, 2018 #[suggestion(parse_remove_non, code = "{ch}", applicability = "maybe-incorrect")] 2019 RemoveNonPrinting { 2020 #[primary_span] 2021 span: Span, 2022 ch: String, 2023 }, 2024 #[suggestion(parse_use_double_quotes, code = "{sugg}", applicability = "machine-applicable")] 2025 Quotes { 2026 #[primary_span] 2027 span: Span, 2028 is_byte: bool, 2029 sugg: String, 2030 }, 2031 } 2032 2033 #[derive(Subdiagnostic)] 2034 pub enum MoreThanOneCharNote { 2035 #[note(parse_followed_by)] 2036 AllCombining { 2037 #[primary_span] 2038 span: Span, 2039 chr: String, 2040 len: usize, 2041 escaped_marks: String, 2042 }, 2043 #[note(parse_non_printing)] 2044 NonPrinting { 2045 #[primary_span] 2046 span: Span, 2047 escaped: String, 2048 }, 2049 } 2050 2051 #[derive(Subdiagnostic)] 2052 pub enum NoBraceUnicodeSub { 2053 #[suggestion(parse_use_braces, code = "{suggestion}", applicability = "maybe-incorrect")] 2054 Suggestion { 2055 #[primary_span] 2056 span: Span, 2057 suggestion: String, 2058 }, 2059 #[help(parse_format_of_unicode)] 2060 Help, 2061 } 2062 2063 #[derive(Subdiagnostic)] 2064 pub(crate) enum TopLevelOrPatternNotAllowedSugg { 2065 #[suggestion( 2066 parse_sugg_remove_leading_vert_in_pattern, 2067 code = "{pat}", 2068 applicability = "machine-applicable" 2069 )] 2070 RemoveLeadingVert { 2071 #[primary_span] 2072 span: Span, 2073 pat: String, 2074 }, 2075 #[suggestion( 2076 parse_sugg_wrap_pattern_in_parens, 2077 code = "({pat})", 2078 applicability = "machine-applicable" 2079 )] 2080 WrapInParens { 2081 #[primary_span] 2082 span: Span, 2083 pat: String, 2084 }, 2085 } 2086 2087 #[derive(Diagnostic)] 2088 #[diag(parse_unexpected_vert_vert_before_function_parameter)] 2089 #[note(parse_note_pattern_alternatives_use_single_vert)] 2090 pub(crate) struct UnexpectedVertVertBeforeFunctionParam { 2091 #[primary_span] 2092 #[suggestion(code = "", applicability = "machine-applicable")] 2093 pub span: Span, 2094 } 2095 2096 #[derive(Diagnostic)] 2097 #[diag(parse_unexpected_vert_vert_in_pattern)] 2098 pub(crate) struct UnexpectedVertVertInPattern { 2099 #[primary_span] 2100 #[suggestion(code = "|", applicability = "machine-applicable")] 2101 pub span: Span, 2102 #[label(parse_label_while_parsing_or_pattern_here)] 2103 pub start: Option<Span>, 2104 } 2105 2106 #[derive(Diagnostic)] 2107 #[diag(parse_trailing_vert_not_allowed)] 2108 pub(crate) struct TrailingVertNotAllowed { 2109 #[primary_span] 2110 #[suggestion(code = "", applicability = "machine-applicable")] 2111 pub span: Span, 2112 #[label(parse_label_while_parsing_or_pattern_here)] 2113 pub start: Option<Span>, 2114 pub token: Token, 2115 #[note(parse_note_pattern_alternatives_use_single_vert)] 2116 pub note_double_vert: Option<()>, 2117 } 2118 2119 #[derive(Diagnostic)] 2120 #[diag(parse_dotdotdot_rest_pattern)] 2121 pub(crate) struct DotDotDotRestPattern { 2122 #[primary_span] 2123 #[suggestion(style = "short", code = "..", applicability = "machine-applicable")] 2124 #[label] 2125 pub span: Span, 2126 } 2127 2128 #[derive(Diagnostic)] 2129 #[diag(parse_pattern_on_wrong_side_of_at)] 2130 pub(crate) struct PatternOnWrongSideOfAt { 2131 #[primary_span] 2132 #[suggestion(code = "{whole_pat}", applicability = "machine-applicable")] 2133 pub whole_span: Span, 2134 pub whole_pat: String, 2135 #[label(parse_label_pattern)] 2136 pub pattern: Span, 2137 #[label(parse_label_binding)] 2138 pub binding: Span, 2139 } 2140 2141 #[derive(Diagnostic)] 2142 #[diag(parse_expected_binding_left_of_at)] 2143 #[note] 2144 pub(crate) struct ExpectedBindingLeftOfAt { 2145 #[primary_span] 2146 pub whole_span: Span, 2147 #[label(parse_label_lhs)] 2148 pub lhs: Span, 2149 #[label(parse_label_rhs)] 2150 pub rhs: Span, 2151 } 2152 2153 #[derive(Diagnostic)] 2154 #[diag(parse_ambiguous_range_pattern)] 2155 pub(crate) struct AmbiguousRangePattern { 2156 #[primary_span] 2157 #[suggestion(code = "({pat})", applicability = "maybe-incorrect")] 2158 pub span: Span, 2159 pub pat: String, 2160 } 2161 2162 #[derive(Diagnostic)] 2163 #[diag(parse_unexpected_lifetime_in_pattern)] 2164 pub(crate) struct UnexpectedLifetimeInPattern { 2165 #[primary_span] 2166 #[suggestion(code = "", applicability = "machine-applicable")] 2167 pub span: Span, 2168 pub symbol: Symbol, 2169 } 2170 2171 #[derive(Diagnostic)] 2172 #[diag(parse_ref_mut_order_incorrect)] 2173 pub(crate) struct RefMutOrderIncorrect { 2174 #[primary_span] 2175 #[suggestion(code = "ref mut", applicability = "machine-applicable")] 2176 pub span: Span, 2177 } 2178 2179 #[derive(Diagnostic)] 2180 pub(crate) enum InvalidMutInPattern { 2181 #[diag(parse_mut_on_nested_ident_pattern)] 2182 #[note(parse_note_mut_pattern_usage)] 2183 NestedIdent { 2184 #[primary_span] 2185 #[suggestion(code = "{pat}", applicability = "machine-applicable")] 2186 span: Span, 2187 pat: String, 2188 }, 2189 #[diag(parse_mut_on_non_ident_pattern)] 2190 #[note(parse_note_mut_pattern_usage)] 2191 NonIdent { 2192 #[primary_span] 2193 #[suggestion(code = "{pat}", applicability = "machine-applicable")] 2194 span: Span, 2195 pat: String, 2196 }, 2197 } 2198 2199 #[derive(Diagnostic)] 2200 #[diag(parse_repeated_mut_in_pattern)] 2201 pub(crate) struct RepeatedMutInPattern { 2202 #[primary_span] 2203 #[suggestion(code = "", applicability = "machine-applicable")] 2204 pub span: Span, 2205 } 2206 2207 #[derive(Diagnostic)] 2208 #[diag(parse_dot_dot_dot_range_to_pattern_not_allowed)] 2209 pub(crate) struct DotDotDotRangeToPatternNotAllowed { 2210 #[primary_span] 2211 #[suggestion(style = "short", code = "..=", applicability = "machine-applicable")] 2212 pub span: Span, 2213 } 2214 2215 #[derive(Diagnostic)] 2216 #[diag(parse_enum_pattern_instead_of_identifier)] 2217 pub(crate) struct EnumPatternInsteadOfIdentifier { 2218 #[primary_span] 2219 pub span: Span, 2220 } 2221 2222 #[derive(Diagnostic)] 2223 #[diag(parse_dot_dot_dot_for_remaining_fields)] 2224 pub(crate) struct DotDotDotForRemainingFields { 2225 #[primary_span] 2226 #[suggestion(code = "..", style = "verbose", applicability = "machine-applicable")] 2227 pub span: Span, 2228 pub token_str: Cow<'static, str>, 2229 } 2230 2231 #[derive(Diagnostic)] 2232 #[diag(parse_expected_comma_after_pattern_field)] 2233 pub(crate) struct ExpectedCommaAfterPatternField { 2234 #[primary_span] 2235 pub span: Span, 2236 } 2237 2238 #[derive(Diagnostic)] 2239 #[diag(parse_return_types_use_thin_arrow)] 2240 pub(crate) struct ReturnTypesUseThinArrow { 2241 #[primary_span] 2242 #[suggestion(style = "short", code = "->", applicability = "machine-applicable")] 2243 pub span: Span, 2244 } 2245 2246 #[derive(Diagnostic)] 2247 #[diag(parse_need_plus_after_trait_object_lifetime)] 2248 pub(crate) struct NeedPlusAfterTraitObjectLifetime { 2249 #[primary_span] 2250 pub span: Span, 2251 } 2252 2253 #[derive(Diagnostic)] 2254 #[diag(parse_expected_mut_or_const_in_raw_pointer_type)] 2255 pub(crate) struct ExpectedMutOrConstInRawPointerType { 2256 #[primary_span] 2257 pub span: Span, 2258 #[suggestion(code("mut ", "const "), applicability = "has-placeholders")] 2259 pub after_asterisk: Span, 2260 } 2261 2262 #[derive(Diagnostic)] 2263 #[diag(parse_lifetime_after_mut)] 2264 pub(crate) struct LifetimeAfterMut { 2265 #[primary_span] 2266 pub span: Span, 2267 #[suggestion(code = "&{snippet} mut", applicability = "maybe-incorrect")] 2268 pub suggest_lifetime: Option<Span>, 2269 pub snippet: String, 2270 } 2271 2272 #[derive(Diagnostic)] 2273 #[diag(parse_dyn_after_mut)] 2274 pub(crate) struct DynAfterMut { 2275 #[primary_span] 2276 #[suggestion(code = "&mut dyn", applicability = "machine-applicable")] 2277 pub span: Span, 2278 } 2279 2280 #[derive(Diagnostic)] 2281 #[diag(parse_fn_pointer_cannot_be_const)] 2282 pub(crate) struct FnPointerCannotBeConst { 2283 #[primary_span] 2284 pub span: Span, 2285 #[suggestion(code = "", applicability = "maybe-incorrect")] 2286 #[label] 2287 pub qualifier: Span, 2288 } 2289 2290 #[derive(Diagnostic)] 2291 #[diag(parse_fn_pointer_cannot_be_async)] 2292 pub(crate) struct FnPointerCannotBeAsync { 2293 #[primary_span] 2294 pub span: Span, 2295 #[suggestion(code = "", applicability = "maybe-incorrect")] 2296 #[label] 2297 pub qualifier: Span, 2298 } 2299 2300 #[derive(Diagnostic)] 2301 #[diag(parse_nested_c_variadic_type, code = "E0743")] 2302 pub(crate) struct NestedCVariadicType { 2303 #[primary_span] 2304 pub span: Span, 2305 } 2306 2307 #[derive(Diagnostic)] 2308 #[diag(parse_invalid_dyn_keyword)] 2309 #[help] 2310 pub(crate) struct InvalidDynKeyword { 2311 #[primary_span] 2312 #[suggestion(code = "", applicability = "machine-applicable")] 2313 pub span: Span, 2314 } 2315 2316 #[derive(Subdiagnostic)] 2317 pub enum HelpUseLatestEdition { 2318 #[help(parse_help_set_edition_cargo)] 2319 #[note(parse_note_edition_guide)] 2320 Cargo { edition: Edition }, 2321 #[help(parse_help_set_edition_standalone)] 2322 #[note(parse_note_edition_guide)] 2323 Standalone { edition: Edition }, 2324 } 2325 2326 impl HelpUseLatestEdition { new() -> Self2327 pub fn new() -> Self { 2328 let edition = LATEST_STABLE_EDITION; 2329 if std::env::var_os("CARGO").is_some() { 2330 Self::Cargo { edition } 2331 } else { 2332 Self::Standalone { edition } 2333 } 2334 } 2335 } 2336 2337 #[derive(Diagnostic)] 2338 #[diag(parse_box_syntax_removed)] 2339 pub struct BoxSyntaxRemoved<'a> { 2340 #[primary_span] 2341 #[suggestion( 2342 code = "Box::new({code})", 2343 applicability = "machine-applicable", 2344 style = "verbose" 2345 )] 2346 pub span: Span, 2347 pub code: &'a str, 2348 } 2349 2350 #[derive(Diagnostic)] 2351 #[diag(parse_bad_return_type_notation_output)] 2352 pub(crate) struct BadReturnTypeNotationOutput { 2353 #[primary_span] 2354 #[suggestion(code = "", applicability = "maybe-incorrect")] 2355 pub span: Span, 2356 } 2357 2358 #[derive(Diagnostic)] 2359 #[diag(parse_bad_return_type_notation_dotdot)] 2360 pub(crate) struct BadReturnTypeNotationDotDot { 2361 #[primary_span] 2362 #[suggestion(code = "", applicability = "maybe-incorrect")] 2363 pub span: Span, 2364 } 2365 2366 #[derive(Diagnostic)] 2367 #[diag(parse_bad_assoc_type_bounds)] 2368 pub(crate) struct BadAssocTypeBounds { 2369 #[primary_span] 2370 #[label] 2371 pub span: Span, 2372 } 2373 2374 #[derive(Diagnostic)] 2375 #[diag(parse_attr_after_generic)] 2376 pub(crate) struct AttrAfterGeneric { 2377 #[primary_span] 2378 #[label] 2379 pub span: Span, 2380 } 2381 2382 #[derive(Diagnostic)] 2383 #[diag(parse_attr_without_generics)] 2384 pub(crate) struct AttrWithoutGenerics { 2385 #[primary_span] 2386 #[label] 2387 pub span: Span, 2388 } 2389 2390 #[derive(Diagnostic)] 2391 #[diag(parse_where_generics)] 2392 pub(crate) struct WhereOnGenerics { 2393 #[primary_span] 2394 #[label] 2395 pub span: Span, 2396 } 2397 2398 #[derive(Diagnostic)] 2399 #[diag(parse_generics_in_path)] 2400 pub(crate) struct GenericsInPath { 2401 #[primary_span] 2402 pub span: Vec<Span>, 2403 } 2404 2405 #[derive(Diagnostic)] 2406 #[diag(parse_assoc_lifetime)] 2407 #[help] 2408 pub(crate) struct AssocLifetime { 2409 #[primary_span] 2410 pub span: Span, 2411 #[label] 2412 pub lifetime: Span, 2413 } 2414 2415 #[derive(Diagnostic)] 2416 #[diag(parse_tilde_const_lifetime)] 2417 pub(crate) struct TildeConstLifetime { 2418 #[primary_span] 2419 pub span: Span, 2420 } 2421 2422 #[derive(Diagnostic)] 2423 #[diag(parse_modifier_lifetime)] 2424 pub(crate) struct ModifierLifetime { 2425 #[primary_span] 2426 #[suggestion(style = "tool-only", applicability = "maybe-incorrect", code = "")] 2427 pub span: Span, 2428 pub sigil: &'static str, 2429 } 2430 2431 #[derive(Diagnostic)] 2432 #[diag(parse_parenthesized_lifetime)] 2433 pub(crate) struct ParenthesizedLifetime { 2434 #[primary_span] 2435 pub span: Span, 2436 #[suggestion(style = "short", applicability = "machine-applicable", code = "{snippet}")] 2437 pub sugg: Option<Span>, 2438 pub snippet: String, 2439 } 2440 2441 #[derive(Diagnostic)] 2442 #[diag(parse_const_bounds_missing_tilde)] 2443 pub(crate) struct ConstMissingTilde { 2444 #[primary_span] 2445 pub span: Span, 2446 #[suggestion(code = "~", applicability = "machine-applicable")] 2447 pub start: Span, 2448 } 2449 2450 #[derive(Diagnostic)] 2451 #[diag(parse_underscore_literal_suffix)] 2452 pub(crate) struct UnderscoreLiteralSuffix { 2453 #[primary_span] 2454 pub span: Span, 2455 } 2456 2457 #[derive(Diagnostic)] 2458 #[diag(parse_expect_label_found_ident)] 2459 pub(crate) struct ExpectedLabelFoundIdent { 2460 #[primary_span] 2461 pub span: Span, 2462 #[suggestion(code = "'", applicability = "machine-applicable", style = "short")] 2463 pub start: Span, 2464 } 2465 2466 #[derive(Diagnostic)] 2467 #[diag(parse_inappropriate_default)] 2468 #[note] 2469 pub(crate) struct InappropriateDefault { 2470 #[primary_span] 2471 #[label] 2472 pub span: Span, 2473 pub article: &'static str, 2474 pub descr: &'static str, 2475 } 2476 2477 #[derive(Diagnostic)] 2478 #[diag(parse_recover_import_as_use)] 2479 pub(crate) struct RecoverImportAsUse { 2480 #[primary_span] 2481 #[suggestion(code = "use", applicability = "machine-applicable", style = "short")] 2482 pub span: Span, 2483 pub token_name: String, 2484 } 2485 2486 #[derive(Diagnostic)] 2487 #[diag(parse_single_colon_import_path)] 2488 #[note] 2489 pub(crate) struct SingleColonImportPath { 2490 #[primary_span] 2491 #[suggestion(code = "::", applicability = "machine-applicable", style = "short")] 2492 pub span: Span, 2493 } 2494 2495 #[derive(Diagnostic)] 2496 #[diag(parse_bad_item_kind)] 2497 #[help] 2498 pub(crate) struct BadItemKind { 2499 #[primary_span] 2500 pub span: Span, 2501 pub descr: &'static str, 2502 pub ctx: &'static str, 2503 } 2504 2505 #[derive(Diagnostic)] 2506 #[diag(parse_single_colon_struct_type)] 2507 pub(crate) struct SingleColonStructType { 2508 #[primary_span] 2509 #[suggestion(code = "::", applicability = "maybe-incorrect", style = "verbose")] 2510 pub span: Span, 2511 } 2512 2513 #[derive(Diagnostic)] 2514 #[diag(parse_equals_struct_default)] 2515 pub(crate) struct EqualsStructDefault { 2516 #[primary_span] 2517 #[suggestion(code = "", applicability = "machine-applicable")] 2518 pub span: Span, 2519 } 2520 2521 #[derive(Diagnostic)] 2522 #[diag(parse_macro_rules_missing_bang)] 2523 pub(crate) struct MacroRulesMissingBang { 2524 #[primary_span] 2525 pub span: Span, 2526 #[suggestion(code = "!", applicability = "machine-applicable", style = "verbose")] 2527 pub hi: Span, 2528 } 2529 2530 #[derive(Diagnostic)] 2531 #[diag(parse_macro_name_remove_bang)] 2532 pub(crate) struct MacroNameRemoveBang { 2533 #[primary_span] 2534 #[suggestion(code = "", applicability = "machine-applicable")] 2535 pub span: Span, 2536 } 2537 2538 #[derive(Diagnostic)] 2539 #[diag(parse_macro_rules_visibility)] 2540 pub(crate) struct MacroRulesVisibility<'a> { 2541 #[primary_span] 2542 #[suggestion(code = "#[macro_export]", applicability = "maybe-incorrect")] 2543 pub span: Span, 2544 pub vis: &'a str, 2545 } 2546 2547 #[derive(Diagnostic)] 2548 #[diag(parse_macro_invocation_visibility)] 2549 #[help] 2550 pub(crate) struct MacroInvocationVisibility<'a> { 2551 #[primary_span] 2552 #[suggestion(code = "", applicability = "machine-applicable")] 2553 pub span: Span, 2554 pub vis: &'a str, 2555 } 2556 2557 #[derive(Diagnostic)] 2558 #[diag(parse_nested_adt)] 2559 pub(crate) struct NestedAdt<'a> { 2560 #[primary_span] 2561 pub span: Span, 2562 #[suggestion(code = "", applicability = "maybe-incorrect")] 2563 pub item: Span, 2564 pub keyword: &'a str, 2565 pub kw_str: Cow<'a, str>, 2566 } 2567 2568 #[derive(Diagnostic)] 2569 #[diag(parse_function_body_equals_expr)] 2570 pub(crate) struct FunctionBodyEqualsExpr { 2571 #[primary_span] 2572 pub span: Span, 2573 #[subdiagnostic] 2574 pub sugg: FunctionBodyEqualsExprSugg, 2575 } 2576 2577 #[derive(Subdiagnostic)] 2578 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 2579 pub(crate) struct FunctionBodyEqualsExprSugg { 2580 #[suggestion_part(code = "{{")] 2581 pub eq: Span, 2582 #[suggestion_part(code = " }}")] 2583 pub semi: Span, 2584 } 2585 2586 #[derive(Diagnostic)] 2587 #[diag(parse_box_not_pat)] 2588 pub(crate) struct BoxNotPat { 2589 #[primary_span] 2590 pub span: Span, 2591 #[note] 2592 pub kw: Span, 2593 #[suggestion(code = "r#", applicability = "maybe-incorrect", style = "verbose")] 2594 pub lo: Span, 2595 pub descr: String, 2596 } 2597 2598 #[derive(Diagnostic)] 2599 #[diag(parse_unmatched_angle)] 2600 pub(crate) struct UnmatchedAngle { 2601 #[primary_span] 2602 #[suggestion(code = "", applicability = "machine-applicable")] 2603 pub span: Span, 2604 pub plural: bool, 2605 } 2606 2607 #[derive(Diagnostic)] 2608 #[diag(parse_missing_plus_in_bounds)] 2609 pub(crate) struct MissingPlusBounds { 2610 #[primary_span] 2611 pub span: Span, 2612 #[suggestion(code = " +", applicability = "maybe-incorrect", style = "verbose")] 2613 pub hi: Span, 2614 pub sym: Symbol, 2615 } 2616 2617 #[derive(Diagnostic)] 2618 #[diag(parse_incorrect_braces_trait_bounds)] 2619 pub(crate) struct IncorrectBracesTraitBounds { 2620 #[primary_span] 2621 pub span: Vec<Span>, 2622 #[subdiagnostic] 2623 pub sugg: IncorrectBracesTraitBoundsSugg, 2624 } 2625 2626 #[derive(Subdiagnostic)] 2627 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] 2628 pub(crate) struct IncorrectBracesTraitBoundsSugg { 2629 #[suggestion_part(code = " ")] 2630 pub l: Span, 2631 #[suggestion_part(code = "")] 2632 pub r: Span, 2633 } 2634 2635 #[derive(Diagnostic)] 2636 #[diag(parse_kw_bad_case)] 2637 pub(crate) struct KwBadCase<'a> { 2638 #[primary_span] 2639 #[suggestion(code = "{kw}", applicability = "machine-applicable")] 2640 pub span: Span, 2641 pub kw: &'a str, 2642 } 2643 2644 #[derive(Diagnostic)] 2645 #[diag(parse_meta_bad_delim)] 2646 pub(crate) struct MetaBadDelim { 2647 #[primary_span] 2648 pub span: Span, 2649 #[subdiagnostic] 2650 pub sugg: MetaBadDelimSugg, 2651 } 2652 2653 #[derive(Diagnostic)] 2654 #[diag(parse_cfg_attr_bad_delim)] 2655 pub(crate) struct CfgAttrBadDelim { 2656 #[primary_span] 2657 pub span: Span, 2658 #[subdiagnostic] 2659 pub sugg: MetaBadDelimSugg, 2660 } 2661 2662 #[derive(Subdiagnostic)] 2663 #[multipart_suggestion(parse_meta_bad_delim_suggestion, applicability = "machine-applicable")] 2664 pub(crate) struct MetaBadDelimSugg { 2665 #[suggestion_part(code = "(")] 2666 pub open: Span, 2667 #[suggestion_part(code = ")")] 2668 pub close: Span, 2669 } 2670 2671 #[derive(Diagnostic)] 2672 #[diag(parse_malformed_cfg_attr)] 2673 #[note] 2674 pub(crate) struct MalformedCfgAttr { 2675 #[primary_span] 2676 #[suggestion(code = "{sugg}")] 2677 pub span: Span, 2678 pub sugg: &'static str, 2679 } 2680 2681 #[derive(Diagnostic)] 2682 #[diag(parse_unknown_builtin_construct)] 2683 pub(crate) struct UnknownBuiltinConstruct { 2684 #[primary_span] 2685 pub span: Span, 2686 pub name: Symbol, 2687 } 2688 2689 #[derive(Diagnostic)] 2690 #[diag(parse_expected_builtin_ident)] 2691 pub(crate) struct ExpectedBuiltinIdent { 2692 #[primary_span] 2693 pub span: Span, 2694 } 2695