• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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