1use std::borrow::Cow;
4
5use rustc_ast::token::Token;
6use rustc_ast::util::parser::ExprPrecedence;
7use rustc_ast::{Path, Visibility};
8use rustc_errors::codes::*;
9use rustc_errors::{
10 Applicability, Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level, Subdiagnostic,
11};
12use rustc_macros::{Diagnostic, Subdiagnostic};
13use rustc_session::errors::ExprParenthesesNeeded;
14use rustc_span::edition::{Edition, LATEST_STABLE_EDITION};
15use rustc_span::{Ident, Span, Symbol};
16
17use crate::fluent_generated as fluent;
18use crate::parser::{ForbiddenLetReason, TokenDescription};
19
20#[derive(Diagnostic)]
21#[diag(parse_maybe_report_ambiguous_plus)]
22pub(crate) struct AmbiguousPlus {
23 #[primary_span]
24 pub span: Span,
25 #[subdiagnostic]
26 pub suggestion: AddParen,
27}
28
29#[derive(Diagnostic)]
30#[diag(parse_maybe_recover_from_bad_type_plus, code = E0178)]
31pub(crate) struct BadTypePlus {
32 #[primary_span]
33 pub span: Span,
34 #[subdiagnostic]
35 pub sub: BadTypePlusSub,
36}
37
38#[derive(Subdiagnostic)]
39#[multipart_suggestion(parse_add_paren, applicability = "machine-applicable")]
40pub(crate) struct AddParen {
41 #[suggestion_part(code = "(")]
42 pub lo: Span,
43 #[suggestion_part(code = ")")]
44 pub hi: Span,
45}
46
47#[derive(Subdiagnostic)]
48pub(crate) enum BadTypePlusSub {
49 AddParen {
50 #[subdiagnostic]
51 suggestion: AddParen,
52 },
53 #[label(parse_forgot_paren)]
54 ForgotParen {
55 #[primary_span]
56 span: Span,
57 },
58 #[label(parse_expect_path)]
59 ExpectPath {
60 #[primary_span]
61 span: Span,
62 },
63}
64
65#[derive(Diagnostic)]
66#[diag(parse_maybe_recover_from_bad_qpath_stage_2)]
67pub(crate) struct BadQPathStage2 {
68 #[primary_span]
69 pub span: Span,
70 #[subdiagnostic]
71 pub wrap: WrapType,
72}
73
74#[derive(Subdiagnostic)]
75#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
76pub(crate) struct WrapType {
77 #[suggestion_part(code = "<")]
78 pub lo: Span,
79 #[suggestion_part(code = ">")]
80 pub hi: Span,
81}
82
83#[derive(Diagnostic)]
84#[diag(parse_incorrect_semicolon)]
85pub(crate) struct IncorrectSemicolon<'a> {
86 #[primary_span]
87 #[suggestion(style = "verbose", code = "", applicability = "machine-applicable")]
88 pub span: Span,
89 #[help]
90 pub show_help: bool,
91 pub name: &'a str,
92}
93
94#[derive(Diagnostic)]
95#[diag(parse_incorrect_use_of_await)]
96pub(crate) struct IncorrectUseOfAwait {
97 #[primary_span]
98 #[suggestion(
99 parse_parentheses_suggestion,
100 style = "verbose",
101 code = "",
102 applicability = "machine-applicable"
103 )]
104 pub span: Span,
105}
106
107#[derive(Diagnostic)]
108#[diag(parse_incorrect_use_of_use)]
109pub(crate) struct IncorrectUseOfUse {
110 #[primary_span]
111 #[suggestion(
112 parse_parentheses_suggestion,
113 style = "verbose",
114 code = "",
115 applicability = "machine-applicable"
116 )]
117 pub span: Span,
118}
119
120#[derive(Subdiagnostic)]
121#[multipart_suggestion(
122 parse_incorrect_use_of_await_postfix_suggestion,
123 applicability = "machine-applicable"
124)]
125pub(crate) struct AwaitSuggestion {
126 #[suggestion_part(code = "")]
127 pub removal: Span,
128 #[suggestion_part(code = ".await{question_mark}")]
129 pub dot_await: Span,
130 pub question_mark: &'static str,
131}
132
133#[derive(Diagnostic)]
134#[diag(parse_incorrect_use_of_await)]
135pub(crate) struct IncorrectAwait {
136 #[primary_span]
137 pub span: Span,
138 #[subdiagnostic]
139 pub suggestion: AwaitSuggestion,
140}
141
142#[derive(Diagnostic)]
143#[diag(parse_in_in_typo)]
144pub(crate) struct InInTypo {
145 #[primary_span]
146 pub span: Span,
147 #[suggestion(code = "", style = "verbose", applicability = "machine-applicable")]
148 pub sugg_span: Span,
149}
150
151#[derive(Diagnostic)]
152#[diag(parse_invalid_variable_declaration)]
153pub(crate) struct InvalidVariableDeclaration {
154 #[primary_span]
155 pub span: Span,
156 #[subdiagnostic]
157 pub sub: InvalidVariableDeclarationSub,
158}
159
160#[derive(Subdiagnostic)]
161pub(crate) enum InvalidVariableDeclarationSub {
162 #[suggestion(
163 parse_switch_mut_let_order,
164 style = "verbose",
165 applicability = "maybe-incorrect",
166 code = "let mut"
167 )]
168 SwitchMutLetOrder(#[primary_span] Span),
169 #[suggestion(
170 parse_missing_let_before_mut,
171 applicability = "machine-applicable",
172 style = "verbose",
173 code = "let mut"
174 )]
175 MissingLet(#[primary_span] Span),
176 #[suggestion(
177 parse_use_let_not_auto,
178 style = "verbose",
179 applicability = "machine-applicable",
180 code = "let"
181 )]
182 UseLetNotAuto(#[primary_span] Span),
183 #[suggestion(
184 parse_use_let_not_var,
185 style = "verbose",
186 applicability = "machine-applicable",
187 code = "let"
188 )]
189 UseLetNotVar(#[primary_span] Span),
190}
191
192#[derive(Diagnostic)]
193#[diag(parse_switch_ref_box_order)]
194pub(crate) struct SwitchRefBoxOrder {
195 #[primary_span]
196 #[suggestion(applicability = "machine-applicable", style = "verbose", code = "box ref")]
197 pub span: Span,
198}
199
200#[derive(Diagnostic)]
201#[diag(parse_invalid_comparison_operator)]
202pub(crate) struct InvalidComparisonOperator {
203 #[primary_span]
204 pub span: Span,
205 pub invalid: String,
206 #[subdiagnostic]
207 pub sub: InvalidComparisonOperatorSub,
208}
209
210#[derive(Subdiagnostic)]
211pub(crate) enum InvalidComparisonOperatorSub {
212 #[suggestion(
213 parse_use_instead,
214 style = "verbose",
215 applicability = "machine-applicable",
216 code = "{correct}"
217 )]
218 Correctable {
219 #[primary_span]
220 span: Span,
221 invalid: String,
222 correct: String,
223 },
224 #[label(parse_spaceship_operator_invalid)]
225 Spaceship(#[primary_span] Span),
226}
227
228#[derive(Diagnostic)]
229#[diag(parse_invalid_logical_operator)]
230#[note]
231pub(crate) struct InvalidLogicalOperator {
232 #[primary_span]
233 pub span: Span,
234 pub incorrect: String,
235 #[subdiagnostic]
236 pub sub: InvalidLogicalOperatorSub,
237}
238
239#[derive(Subdiagnostic)]
240pub(crate) enum InvalidLogicalOperatorSub {
241 #[suggestion(
242 parse_use_amp_amp_for_conjunction,
243 style = "verbose",
244 applicability = "machine-applicable",
245 code = "&&"
246 )]
247 Conjunction(#[primary_span] Span),
248 #[suggestion(
249 parse_use_pipe_pipe_for_disjunction,
250 style = "verbose",
251 applicability = "machine-applicable",
252 code = "||"
253 )]
254 Disjunction(#[primary_span] Span),
255}
256
257#[derive(Diagnostic)]
258#[diag(parse_tilde_is_not_unary_operator)]
259pub(crate) struct TildeAsUnaryOperator(
260 #[primary_span]
261 #[suggestion(style = "verbose", applicability = "machine-applicable", code = "!")]
262 pub Span,
263);
264
265#[derive(Diagnostic)]
266#[diag(parse_unexpected_token_after_not)]
267pub(crate) struct NotAsNegationOperator {
268 #[primary_span]
269 pub negated: Span,
270 pub negated_desc: String,
271 #[subdiagnostic]
272 pub sub: NotAsNegationOperatorSub,
273}
274
275#[derive(Subdiagnostic)]
276pub(crate) enum NotAsNegationOperatorSub {
277 #[suggestion(
278 parse_unexpected_token_after_not_default,
279 style = "verbose",
280 applicability = "machine-applicable",
281 code = "!"
282 )]
283 SuggestNotDefault(#[primary_span] Span),
284
285 #[suggestion(
286 parse_unexpected_token_after_not_bitwise,
287 style = "verbose",
288 applicability = "machine-applicable",
289 code = "!"
290 )]
291 SuggestNotBitwise(#[primary_span] Span),
292
293 #[suggestion(
294 parse_unexpected_token_after_not_logical,
295 style = "verbose",
296 applicability = "machine-applicable",
297 code = "!"
298 )]
299 SuggestNotLogical(#[primary_span] Span),
300}
301
302#[derive(Diagnostic)]
303#[diag(parse_malformed_loop_label)]
304pub(crate) struct MalformedLoopLabel {
305 #[primary_span]
306 pub span: Span,
307 #[suggestion(applicability = "machine-applicable", code = "'", style = "verbose")]
308 pub suggestion: Span,
309}
310
311#[derive(Diagnostic)]
312#[diag(parse_lifetime_in_borrow_expression)]
313pub(crate) struct LifetimeInBorrowExpression {
314 #[primary_span]
315 pub span: Span,
316 #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")]
317 #[label]
318 pub lifetime_span: Span,
319}
320
321#[derive(Diagnostic)]
322#[diag(parse_field_expression_with_generic)]
323pub(crate) struct FieldExpressionWithGeneric(#[primary_span] pub Span);
324
325#[derive(Diagnostic)]
326#[diag(parse_macro_invocation_with_qualified_path)]
327pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span);
328
329#[derive(Diagnostic)]
330#[diag(parse_unexpected_token_after_label)]
331pub(crate) struct UnexpectedTokenAfterLabel {
332 #[primary_span]
333 #[label(parse_unexpected_token_after_label)]
334 pub span: Span,
335 #[suggestion(parse_suggestion_remove_label, style = "verbose", code = "")]
336 pub remove_label: Option<Span>,
337 #[subdiagnostic]
338 pub enclose_in_block: Option<UnexpectedTokenAfterLabelSugg>,
339}
340
341#[derive(Subdiagnostic)]
342#[multipart_suggestion(parse_suggestion_enclose_in_block, applicability = "machine-applicable")]
343pub(crate) struct UnexpectedTokenAfterLabelSugg {
344 #[suggestion_part(code = "{{ ")]
345 pub left: Span,
346 #[suggestion_part(code = " }}")]
347 pub right: Span,
348}
349
350#[derive(Diagnostic)]
351#[diag(parse_require_colon_after_labeled_expression)]
352#[note]
353pub(crate) struct RequireColonAfterLabeledExpression {
354 #[primary_span]
355 pub span: Span,
356 #[label]
357 pub label: Span,
358 #[suggestion(style = "verbose", applicability = "machine-applicable", code = ": ")]
359 pub label_end: Span,
360}
361
362#[derive(Diagnostic)]
363#[diag(parse_do_catch_syntax_removed)]
364#[note]
365pub(crate) struct DoCatchSyntaxRemoved {
366 #[primary_span]
367 #[suggestion(applicability = "machine-applicable", code = "try", style = "verbose")]
368 pub span: Span,
369}
370
371#[derive(Diagnostic)]
372#[diag(parse_float_literal_requires_integer_part)]
373pub(crate) struct FloatLiteralRequiresIntegerPart {
374 #[primary_span]
375 pub span: Span,
376 #[suggestion(applicability = "machine-applicable", code = "0", style = "verbose")]
377 pub suggestion: Span,
378}
379
380#[derive(Diagnostic)]
381#[diag(parse_missing_semicolon_before_array)]
382pub(crate) struct MissingSemicolonBeforeArray {
383 #[primary_span]
384 pub open_delim: Span,
385 #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = ";")]
386 pub semicolon: Span,
387}
388
389#[derive(Diagnostic)]
390#[diag(parse_expect_dotdot_not_dotdotdot)]
391pub(crate) struct MissingDotDot {
392 #[primary_span]
393 pub token_span: Span,
394 #[suggestion(applicability = "maybe-incorrect", code = "..", style = "verbose")]
395 pub sugg_span: Span,
396}
397
398#[derive(Diagnostic)]
399#[diag(parse_invalid_block_macro_segment)]
400pub(crate) struct InvalidBlockMacroSegment {
401 #[primary_span]
402 pub span: Span,
403 #[label]
404 pub context: Span,
405 #[subdiagnostic]
406 pub wrap: WrapInExplicitBlock,
407}
408
409#[derive(Subdiagnostic)]
410#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
411pub(crate) struct WrapInExplicitBlock {
412 #[suggestion_part(code = "{{ ")]
413 pub lo: Span,
414 #[suggestion_part(code = " }}")]
415 pub hi: Span,
416}
417
418#[derive(Diagnostic)]
419#[diag(parse_if_expression_missing_then_block)]
420pub(crate) struct IfExpressionMissingThenBlock {
421 #[primary_span]
422 pub if_span: Span,
423 #[subdiagnostic]
424 pub missing_then_block_sub: IfExpressionMissingThenBlockSub,
425 #[subdiagnostic]
426 pub let_else_sub: Option<IfExpressionLetSomeSub>,
427}
428
429#[derive(Subdiagnostic)]
430pub(crate) enum IfExpressionMissingThenBlockSub {
431 #[help(parse_condition_possibly_unfinished)]
432 UnfinishedCondition(#[primary_span] Span),
433 #[help(parse_add_then_block)]
434 AddThenBlock(#[primary_span] Span),
435}
436
437#[derive(Diagnostic)]
438#[diag(parse_ternary_operator)]
439pub(crate) struct TernaryOperator {
440 #[primary_span]
441 pub span: Span,
442 #[subdiagnostic]
444 pub sugg: Option<TernaryOperatorSuggestion>,
445 #[help(parse_use_if_else)]
447 pub no_sugg: bool,
448}
449
450#[derive(Subdiagnostic, Copy, Clone)]
451#[multipart_suggestion(parse_use_if_else, applicability = "maybe-incorrect", style = "verbose")]
452pub(crate) struct TernaryOperatorSuggestion {
453 #[suggestion_part(code = "if ")]
454 pub before_cond: Span,
455 #[suggestion_part(code = "{{")]
456 pub question: Span,
457 #[suggestion_part(code = "}} else {{")]
458 pub colon: Span,
459 #[suggestion_part(code = " }}")]
460 pub end: Span,
461}
462
463#[derive(Subdiagnostic)]
464#[suggestion(
465 parse_extra_if_in_let_else,
466 applicability = "maybe-incorrect",
467 code = "",
468 style = "verbose"
469)]
470pub(crate) struct IfExpressionLetSomeSub {
471 #[primary_span]
472 pub if_span: Span,
473}
474
475#[derive(Diagnostic)]
476#[diag(parse_if_expression_missing_condition)]
477pub(crate) struct IfExpressionMissingCondition {
478 #[primary_span]
479 #[label(parse_condition_label)]
480 pub if_span: Span,
481 #[label(parse_block_label)]
482 pub block_span: Span,
483}
484
485#[derive(Diagnostic)]
486#[diag(parse_expected_expression_found_let)]
487#[note]
488pub(crate) struct ExpectedExpressionFoundLet {
489 #[primary_span]
490 pub span: Span,
491 #[subdiagnostic]
492 pub reason: ForbiddenLetReason,
493 #[subdiagnostic]
494 pub missing_let: Option<MaybeMissingLet>,
495 #[subdiagnostic]
496 pub comparison: Option<MaybeComparison>,
497}
498
499#[derive(Diagnostic)]
500#[diag(parse_or_in_let_chain)]
501pub(crate) struct OrInLetChain {
502 #[primary_span]
503 pub span: Span,
504}
505
506#[derive(Subdiagnostic, Clone, Copy)]
507#[multipart_suggestion(
508 parse_maybe_missing_let,
509 applicability = "maybe-incorrect",
510 style = "verbose"
511)]
512pub(crate) struct MaybeMissingLet {
513 #[suggestion_part(code = "let ")]
514 pub span: Span,
515}
516
517#[derive(Subdiagnostic, Clone, Copy)]
518#[multipart_suggestion(
519 parse_maybe_comparison,
520 applicability = "maybe-incorrect",
521 style = "verbose"
522)]
523pub(crate) struct MaybeComparison {
524 #[suggestion_part(code = "=")]
525 pub span: Span,
526}
527
528#[derive(Diagnostic)]
529#[diag(parse_expect_eq_instead_of_eqeq)]
530pub(crate) struct ExpectedEqForLetExpr {
531 #[primary_span]
532 pub span: Span,
533 #[suggestion(applicability = "maybe-incorrect", code = "=", style = "verbose")]
534 pub sugg_span: Span,
535}
536
537#[derive(Diagnostic)]
538#[diag(parse_expected_else_block)]
539pub(crate) struct ExpectedElseBlock {
540 #[primary_span]
541 pub first_tok_span: Span,
542 pub first_tok: String,
543 #[label]
544 pub else_span: Span,
545 #[suggestion(applicability = "maybe-incorrect", code = "if ", style = "verbose")]
546 pub condition_start: Span,
547}
548
549#[derive(Diagnostic)]
550#[diag(parse_expected_struct_field)]
551pub(crate) struct ExpectedStructField {
552 #[primary_span]
553 #[label]
554 pub span: Span,
555 pub token: Token,
556 #[label(parse_ident_label)]
557 pub ident_span: Span,
558}
559
560#[derive(Diagnostic)]
561#[diag(parse_outer_attribute_not_allowed_on_if_else)]
562pub(crate) struct OuterAttributeNotAllowedOnIfElse {
563 #[primary_span]
564 pub last: Span,
565
566 #[label(parse_branch_label)]
567 pub branch_span: Span,
568
569 #[label(parse_ctx_label)]
570 pub ctx_span: Span,
571 pub ctx: String,
572
573 #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")]
574 pub attributes: Span,
575}
576
577#[derive(Diagnostic)]
578#[diag(parse_missing_in_in_for_loop)]
579pub(crate) struct MissingInInForLoop {
580 #[primary_span]
581 pub span: Span,
582 #[subdiagnostic]
583 pub sub: MissingInInForLoopSub,
584}
585
586#[derive(Subdiagnostic)]
587pub(crate) enum MissingInInForLoopSub {
588 #[suggestion(
590 parse_use_in_not_of,
591 style = "verbose",
592 applicability = "maybe-incorrect",
593 code = "in"
594 )]
595 InNotOf(#[primary_span] Span),
596 #[suggestion(parse_add_in, style = "verbose", applicability = "maybe-incorrect", code = " in ")]
597 AddIn(#[primary_span] Span),
598}
599
600#[derive(Diagnostic)]
601#[diag(parse_missing_expression_in_for_loop)]
602pub(crate) struct MissingExpressionInForLoop {
603 #[primary_span]
604 #[suggestion(
605 code = "/* expression */ ",
606 applicability = "has-placeholders",
607 style = "verbose"
608 )]
609 pub span: Span,
610}
611
612#[derive(Diagnostic)]
613#[diag(parse_loop_else)]
614#[note]
615pub(crate) struct LoopElseNotSupported {
616 #[primary_span]
617 pub span: Span,
618 pub loop_kind: &'static str,
619 #[label(parse_loop_keyword)]
620 pub loop_kw: Span,
621}
622
623#[derive(Diagnostic)]
624#[diag(parse_missing_comma_after_match_arm)]
625pub(crate) struct MissingCommaAfterMatchArm {
626 #[primary_span]
627 #[suggestion(applicability = "machine-applicable", code = ",", style = "verbose")]
628 pub span: Span,
629}
630
631#[derive(Diagnostic)]
632#[diag(parse_catch_after_try)]
633#[help]
634pub(crate) struct CatchAfterTry {
635 #[primary_span]
636 pub span: Span,
637}
638
639#[derive(Diagnostic)]
640#[diag(parse_comma_after_base_struct)]
641#[note]
642pub(crate) struct CommaAfterBaseStruct {
643 #[primary_span]
644 pub span: Span,
645 #[suggestion(style = "verbose", applicability = "machine-applicable", code = "")]
646 pub comma: Span,
647}
648
649#[derive(Diagnostic)]
650#[diag(parse_eq_field_init)]
651pub(crate) struct EqFieldInit {
652 #[primary_span]
653 pub span: Span,
654 #[suggestion(applicability = "machine-applicable", code = ":", style = "verbose")]
655 pub eq: Span,
656}
657
658#[derive(Diagnostic)]
659#[diag(parse_dotdotdot)]
660pub(crate) struct DotDotDot {
661 #[primary_span]
662 #[suggestion(
663 parse_suggest_exclusive_range,
664 applicability = "maybe-incorrect",
665 code = "..",
666 style = "verbose"
667 )]
668 #[suggestion(
669 parse_suggest_inclusive_range,
670 applicability = "maybe-incorrect",
671 code = "..=",
672 style = "verbose"
673 )]
674 pub span: Span,
675}
676
677#[derive(Diagnostic)]
678#[diag(parse_left_arrow_operator)]
679pub(crate) struct LeftArrowOperator {
680 #[primary_span]
681 #[suggestion(applicability = "maybe-incorrect", code = "< -", style = "verbose")]
682 pub span: Span,
683}
684
685#[derive(Diagnostic)]
686#[diag(parse_remove_let)]
687pub(crate) struct RemoveLet {
688 #[primary_span]
689 pub span: Span,
690 #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")]
691 pub suggestion: Span,
692}
693
694#[derive(Diagnostic)]
695#[diag(parse_use_eq_instead)]
696pub(crate) struct UseEqInstead {
697 #[primary_span]
698 #[suggestion(style = "verbose", applicability = "machine-applicable", code = "=")]
699 pub span: Span,
700}
701
702#[derive(Diagnostic)]
703#[diag(parse_use_empty_block_not_semi)]
704pub(crate) struct UseEmptyBlockNotSemi {
705 #[primary_span]
706 #[suggestion(style = "hidden", applicability = "machine-applicable", code = "{{}}")]
707 pub span: Span,
708}
709
710#[derive(Diagnostic)]
711#[diag(parse_comparison_interpreted_as_generic)]
712pub(crate) struct ComparisonInterpretedAsGeneric {
713 #[primary_span]
714 #[label(parse_label_comparison)]
715 pub comparison: Span,
716 pub r#type: Path,
717 #[label(parse_label_args)]
718 pub args: Span,
719 #[subdiagnostic]
720 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
721}
722
723#[derive(Diagnostic)]
724#[diag(parse_shift_interpreted_as_generic)]
725pub(crate) struct ShiftInterpretedAsGeneric {
726 #[primary_span]
727 #[label(parse_label_comparison)]
728 pub shift: Span,
729 pub r#type: Path,
730 #[label(parse_label_args)]
731 pub args: Span,
732 #[subdiagnostic]
733 pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg,
734}
735
736#[derive(Subdiagnostic)]
737#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
738pub(crate) struct ComparisonOrShiftInterpretedAsGenericSugg {
739 #[suggestion_part(code = "(")]
740 pub left: Span,
741 #[suggestion_part(code = ")")]
742 pub right: Span,
743}
744
745#[derive(Diagnostic)]
746#[diag(parse_found_expr_would_be_stmt)]
747pub(crate) struct FoundExprWouldBeStmt {
748 #[primary_span]
749 #[label]
750 pub span: Span,
751 pub token: Token,
752 #[subdiagnostic]
753 pub suggestion: ExprParenthesesNeeded,
754}
755
756#[derive(Diagnostic)]
757#[diag(parse_frontmatter_extra_characters_after_close)]
758pub(crate) struct FrontmatterExtraCharactersAfterClose {
759 #[primary_span]
760 pub span: Span,
761}
762
763#[derive(Diagnostic)]
764#[diag(parse_frontmatter_invalid_infostring)]
765#[note]
766pub(crate) struct FrontmatterInvalidInfostring {
767 #[primary_span]
768 pub span: Span,
769}
770
771#[derive(Diagnostic)]
772#[diag(parse_frontmatter_invalid_opening_preceding_whitespace)]
773pub(crate) struct FrontmatterInvalidOpeningPrecedingWhitespace {
774 #[primary_span]
775 pub span: Span,
776 #[note]
777 pub note_span: Span,
778}
779
780#[derive(Diagnostic)]
781#[diag(parse_frontmatter_unclosed)]
782pub(crate) struct FrontmatterUnclosed {
783 #[primary_span]
784 pub span: Span,
785 #[note]
786 pub note_span: Span,
787}
788
789#[derive(Diagnostic)]
790#[diag(parse_frontmatter_invalid_close_preceding_whitespace)]
791pub(crate) struct FrontmatterInvalidClosingPrecedingWhitespace {
792 #[primary_span]
793 pub span: Span,
794 #[note]
795 pub note_span: Span,
796}
797
798#[derive(Diagnostic)]
799#[diag(parse_frontmatter_length_mismatch)]
800pub(crate) struct FrontmatterLengthMismatch {
801 #[primary_span]
802 pub span: Span,
803 #[label(parse_label_opening)]
804 pub opening: Span,
805 #[label(parse_label_close)]
806 pub close: Span,
807 pub len_opening: usize,
808 pub len_close: usize,
809}
810
811#[derive(Diagnostic)]
812#[diag(parse_leading_plus_not_supported)]
813pub(crate) struct LeadingPlusNotSupported {
814 #[primary_span]
815 #[label]
816 pub span: Span,
817 #[suggestion(
818 parse_suggestion_remove_plus,
819 style = "verbose",
820 code = "",
821 applicability = "machine-applicable"
822 )]
823 pub remove_plus: Option<Span>,
824 #[subdiagnostic]
825 pub add_parentheses: Option<ExprParenthesesNeeded>,
826}
827
828#[derive(Diagnostic)]
829#[diag(parse_parentheses_with_struct_fields)]
830pub(crate) struct ParenthesesWithStructFields {
831 #[primary_span]
832 pub span: Span,
833 pub r#type: Path,
834 #[subdiagnostic]
835 pub braces_for_struct: BracesForStructLiteral,
836 #[subdiagnostic]
837 pub no_fields_for_fn: NoFieldsForFnCall,
838}
839
840#[derive(Subdiagnostic)]
841#[multipart_suggestion(parse_suggestion_braces_for_struct, applicability = "maybe-incorrect")]
842pub(crate) struct BracesForStructLiteral {
843 #[suggestion_part(code = " {{ ")]
844 pub first: Span,
845 #[suggestion_part(code = " }}")]
846 pub second: Span,
847}
848
849#[derive(Subdiagnostic)]
850#[multipart_suggestion(parse_suggestion_no_fields_for_fn, applicability = "maybe-incorrect")]
851pub(crate) struct NoFieldsForFnCall {
852 #[suggestion_part(code = "")]
853 pub fields: Vec<Span>,
854}
855
856#[derive(Diagnostic)]
857#[diag(parse_labeled_loop_in_break)]
858pub(crate) struct LabeledLoopInBreak {
859 #[primary_span]
860 pub span: Span,
861 #[subdiagnostic]
862 pub sub: WrapInParentheses,
863}
864
865#[derive(Subdiagnostic)]
866pub(crate) enum WrapInParentheses {
867 #[multipart_suggestion(
868 parse_sugg_wrap_expression_in_parentheses,
869 applicability = "machine-applicable"
870 )]
871 Expression {
872 #[suggestion_part(code = "(")]
873 left: Span,
874 #[suggestion_part(code = ")")]
875 right: Span,
876 },
877 #[multipart_suggestion(
878 parse_sugg_wrap_macro_in_parentheses,
879 applicability = "machine-applicable"
880 )]
881 MacroArgs {
882 #[suggestion_part(code = "(")]
883 left: Span,
884 #[suggestion_part(code = ")")]
885 right: Span,
886 },
887}
888
889#[derive(Diagnostic)]
890#[diag(parse_array_brackets_instead_of_braces)]
891pub(crate) struct ArrayBracketsInsteadOfBraces {
892 #[primary_span]
893 pub span: Span,
894 #[subdiagnostic]
895 pub sub: ArrayBracketsInsteadOfBracesSugg,
896}
897
898#[derive(Subdiagnostic)]
899#[multipart_suggestion(parse_suggestion, applicability = "maybe-incorrect")]
900pub(crate) struct ArrayBracketsInsteadOfBracesSugg {
901 #[suggestion_part(code = "[")]
902 pub left: Span,
903 #[suggestion_part(code = "]")]
904 pub right: Span,
905}
906
907#[derive(Diagnostic)]
908#[diag(parse_match_arm_body_without_braces)]
909pub(crate) struct MatchArmBodyWithoutBraces {
910 #[primary_span]
911 #[label(parse_label_statements)]
912 pub statements: Span,
913 #[label(parse_label_arrow)]
914 pub arrow: Span,
915 pub num_statements: usize,
916 #[subdiagnostic]
917 pub sub: MatchArmBodyWithoutBracesSugg,
918}
919
920#[derive(Diagnostic)]
921#[diag(parse_inclusive_range_extra_equals)]
922#[note]
923pub(crate) struct InclusiveRangeExtraEquals {
924 #[primary_span]
925 #[suggestion(
926 parse_suggestion_remove_eq,
927 style = "verbose",
928 code = "..=",
929 applicability = "maybe-incorrect"
930 )]
931 pub span: Span,
932}
933
934#[derive(Diagnostic)]
935#[diag(parse_inclusive_range_match_arrow)]
936pub(crate) struct InclusiveRangeMatchArrow {
937 #[primary_span]
938 pub arrow: Span,
939 #[label]
940 pub span: Span,
941 #[suggestion(style = "verbose", code = " ", applicability = "machine-applicable")]
942 pub after_pat: Span,
943}
944
945#[derive(Diagnostic)]
946#[diag(parse_inclusive_range_no_end, code = E0586)]
947#[note]
948pub(crate) struct InclusiveRangeNoEnd {
949 #[primary_span]
950 pub span: Span,
951 #[suggestion(
952 parse_suggestion_open_range,
953 code = "",
954 applicability = "machine-applicable",
955 style = "verbose"
956 )]
957 pub suggestion: Span,
958}
959
960#[derive(Subdiagnostic)]
961pub(crate) enum MatchArmBodyWithoutBracesSugg {
962 #[multipart_suggestion(parse_suggestion_add_braces, applicability = "machine-applicable")]
963 AddBraces {
964 #[suggestion_part(code = "{{ ")]
965 left: Span,
966 #[suggestion_part(code = " }}")]
967 right: Span,
968 },
969 #[suggestion(
970 parse_suggestion_use_comma_not_semicolon,
971 code = ",",
972 applicability = "machine-applicable",
973 style = "verbose"
974 )]
975 UseComma {
976 #[primary_span]
977 semicolon: Span,
978 },
979}
980
981#[derive(Diagnostic)]
982#[diag(parse_struct_literal_not_allowed_here)]
983pub(crate) struct StructLiteralNotAllowedHere {
984 #[primary_span]
985 pub span: Span,
986 #[subdiagnostic]
987 pub sub: StructLiteralNotAllowedHereSugg,
988}
989
990#[derive(Subdiagnostic)]
991#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
992pub(crate) struct StructLiteralNotAllowedHereSugg {
993 #[suggestion_part(code = "(")]
994 pub left: Span,
995 #[suggestion_part(code = ")")]
996 pub right: Span,
997}
998
999#[derive(Diagnostic)]
1000#[diag(parse_invalid_literal_suffix_on_tuple_index)]
1001pub(crate) struct InvalidLiteralSuffixOnTupleIndex {
1002 #[primary_span]
1003 #[label]
1004 pub span: Span,
1005 pub suffix: Symbol,
1006 #[help(parse_tuple_exception_line_1)]
1007 #[help(parse_tuple_exception_line_2)]
1008 #[help(parse_tuple_exception_line_3)]
1009 pub exception: bool,
1010}
1011
1012#[derive(Diagnostic)]
1013#[diag(parse_non_string_abi_literal)]
1014pub(crate) struct NonStringAbiLiteral {
1015 #[primary_span]
1016 #[suggestion(code = "\"C\"", applicability = "maybe-incorrect", style = "verbose")]
1017 pub span: Span,
1018}
1019
1020#[derive(Diagnostic)]
1021#[diag(parse_mismatched_closing_delimiter)]
1022pub(crate) struct MismatchedClosingDelimiter {
1023 #[primary_span]
1024 pub spans: Vec<Span>,
1025 pub delimiter: String,
1026 #[label(parse_label_unmatched)]
1027 pub unmatched: Span,
1028 #[label(parse_label_opening_candidate)]
1029 pub opening_candidate: Option<Span>,
1030 #[label(parse_label_unclosed)]
1031 pub unclosed: Option<Span>,
1032}
1033
1034#[derive(Diagnostic)]
1035#[diag(parse_incorrect_visibility_restriction, code = E0704)]
1036#[help]
1037pub(crate) struct IncorrectVisibilityRestriction {
1038 #[primary_span]
1039 #[suggestion(code = "in {inner_str}", applicability = "machine-applicable", style = "verbose")]
1040 pub span: Span,
1041 pub inner_str: String,
1042}
1043
1044#[derive(Diagnostic)]
1045#[diag(parse_assignment_else_not_allowed)]
1046pub(crate) struct AssignmentElseNotAllowed {
1047 #[primary_span]
1048 pub span: Span,
1049}
1050
1051#[derive(Diagnostic)]
1052#[diag(parse_expected_statement_after_outer_attr)]
1053pub(crate) struct ExpectedStatementAfterOuterAttr {
1054 #[primary_span]
1055 pub span: Span,
1056}
1057
1058#[derive(Diagnostic)]
1059#[diag(parse_doc_comment_does_not_document_anything, code = E0585)]
1060#[help]
1061pub(crate) struct DocCommentDoesNotDocumentAnything {
1062 #[primary_span]
1063 pub span: Span,
1064 #[suggestion(code = ",", applicability = "machine-applicable", style = "verbose")]
1065 pub missing_comma: Option<Span>,
1066}
1067
1068#[derive(Diagnostic)]
1069#[diag(parse_const_let_mutually_exclusive)]
1070pub(crate) struct ConstLetMutuallyExclusive {
1071 #[primary_span]
1072 #[suggestion(code = "const", applicability = "maybe-incorrect", style = "verbose")]
1073 pub span: Span,
1074}
1075
1076#[derive(Diagnostic)]
1077#[diag(parse_invalid_expression_in_let_else)]
1078pub(crate) struct InvalidExpressionInLetElse {
1079 #[primary_span]
1080 pub span: Span,
1081 pub operator: &'static str,
1082 #[subdiagnostic]
1083 pub sugg: WrapInParentheses,
1084}
1085
1086#[derive(Diagnostic)]
1087#[diag(parse_invalid_curly_in_let_else)]
1088pub(crate) struct InvalidCurlyInLetElse {
1089 #[primary_span]
1090 pub span: Span,
1091 #[subdiagnostic]
1092 pub sugg: WrapInParentheses,
1093}
1094
1095#[derive(Diagnostic)]
1096#[diag(parse_compound_assignment_expression_in_let)]
1097#[help]
1098pub(crate) struct CompoundAssignmentExpressionInLet {
1099 #[primary_span]
1100 pub span: Span,
1101 #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")]
1102 pub suggestion: Span,
1103}
1104
1105#[derive(Diagnostic)]
1106#[diag(parse_suffixed_literal_in_attribute)]
1107#[help]
1108pub(crate) struct SuffixedLiteralInAttribute {
1109 #[primary_span]
1110 pub span: Span,
1111}
1112
1113#[derive(Diagnostic)]
1114#[diag(parse_invalid_meta_item)]
1115pub(crate) struct InvalidMetaItem {
1116 #[primary_span]
1117 pub span: Span,
1118 pub descr: String,
1119 #[subdiagnostic]
1120 pub quote_ident_sugg: Option<InvalidMetaItemQuoteIdentSugg>,
1121}
1122
1123#[derive(Subdiagnostic)]
1124#[multipart_suggestion(parse_quote_ident_sugg, applicability = "machine-applicable")]
1125pub(crate) struct InvalidMetaItemQuoteIdentSugg {
1126 #[suggestion_part(code = "\"")]
1127 pub before: Span,
1128 #[suggestion_part(code = "\"")]
1129 pub after: Span,
1130}
1131
1132#[derive(Subdiagnostic)]
1133#[suggestion(
1134 parse_sugg_escape_identifier,
1135 style = "verbose",
1136 applicability = "maybe-incorrect",
1137 code = "r#"
1138)]
1139pub(crate) struct SuggEscapeIdentifier {
1140 #[primary_span]
1141 pub span: Span,
1142 pub ident_name: String,
1143}
1144
1145#[derive(Subdiagnostic)]
1146#[suggestion(
1147 parse_sugg_remove_comma,
1148 applicability = "machine-applicable",
1149 code = "",
1150 style = "verbose"
1151)]
1152pub(crate) struct SuggRemoveComma {
1153 #[primary_span]
1154 pub span: Span,
1155}
1156
1157#[derive(Subdiagnostic)]
1158#[suggestion(
1159 parse_sugg_add_let_for_stmt,
1160 style = "verbose",
1161 applicability = "maybe-incorrect",
1162 code = "let "
1163)]
1164pub(crate) struct SuggAddMissingLetStmt {
1165 #[primary_span]
1166 pub span: Span,
1167}
1168
1169#[derive(Subdiagnostic)]
1170pub(crate) enum ExpectedIdentifierFound {
1171 #[label(parse_expected_identifier_found_reserved_identifier)]
1172 ReservedIdentifier(#[primary_span] Span),
1173 #[label(parse_expected_identifier_found_keyword)]
1174 Keyword(#[primary_span] Span),
1175 #[label(parse_expected_identifier_found_reserved_keyword)]
1176 ReservedKeyword(#[primary_span] Span),
1177 #[label(parse_expected_identifier_found_doc_comment)]
1178 DocComment(#[primary_span] Span),
1179 #[label(parse_expected_identifier_found_metavar)]
1180 MetaVar(#[primary_span] Span),
1181 #[label(parse_expected_identifier)]
1182 Other(#[primary_span] Span),
1183}
1184
1185impl ExpectedIdentifierFound {
1186 pub(crate) fn new(token_descr: Option<TokenDescription>, span: Span) -> Self {
1187 (match token_descr {
1188 Some(TokenDescription::ReservedIdentifier) => {
1189 ExpectedIdentifierFound::ReservedIdentifier
1190 }
1191 Some(TokenDescription::Keyword) => ExpectedIdentifierFound::Keyword,
1192 Some(TokenDescription::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword,
1193 Some(TokenDescription::DocComment) => ExpectedIdentifierFound::DocComment,
1194 Some(TokenDescription::MetaVar(_)) => ExpectedIdentifierFound::MetaVar,
1195 None => ExpectedIdentifierFound::Other,
1196 })(span)
1197 }
1198}
1199
1200pub(crate) struct ExpectedIdentifier {
1201 pub span: Span,
1202 pub token: Token,
1203 pub suggest_raw: Option<SuggEscapeIdentifier>,
1204 pub suggest_remove_comma: Option<SuggRemoveComma>,
1205 pub help_cannot_start_number: Option<HelpIdentifierStartsWithNumber>,
1206}
1207
1208impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for ExpectedIdentifier {
1209 #[track_caller]
1210 fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
1211 let token_descr = TokenDescription::from_token(&self.token);
1212
1213 let mut add_token = true;
1214 let mut diag = Diag::new(
1215 dcx,
1216 level,
1217 match token_descr {
1218 Some(TokenDescription::ReservedIdentifier) => {
1219 fluent::parse_expected_identifier_found_reserved_identifier_str
1220 }
1221 Some(TokenDescription::Keyword) => {
1222 fluent::parse_expected_identifier_found_keyword_str
1223 }
1224 Some(TokenDescription::ReservedKeyword) => {
1225 fluent::parse_expected_identifier_found_reserved_keyword_str
1226 }
1227 Some(TokenDescription::DocComment) => {
1228 fluent::parse_expected_identifier_found_doc_comment_str
1229 }
1230 Some(TokenDescription::MetaVar(_)) => {
1231 add_token = false;
1232 fluent::parse_expected_identifier_found_metavar_str
1233 }
1234 None => fluent::parse_expected_identifier_found_str,
1235 },
1236 );
1237 diag.span(self.span);
1238 if add_token {
1239 diag.arg("token", self.token);
1240 }
1241
1242 if let Some(sugg) = self.suggest_raw {
1243 sugg.add_to_diag(&mut diag);
1244 }
1245
1246 ExpectedIdentifierFound::new(token_descr, self.span).add_to_diag(&mut diag);
1247
1248 if let Some(sugg) = self.suggest_remove_comma {
1249 sugg.add_to_diag(&mut diag);
1250 }
1251
1252 if let Some(help) = self.help_cannot_start_number {
1253 help.add_to_diag(&mut diag);
1254 }
1255
1256 diag
1257 }
1258}
1259
1260#[derive(Subdiagnostic)]
1261#[help(parse_invalid_identifier_with_leading_number)]
1262pub(crate) struct HelpIdentifierStartsWithNumber {
1263 #[primary_span]
1264 pub num_span: Span,
1265}
1266
1267pub(crate) struct ExpectedSemi {
1268 pub span: Span,
1269 pub token: Token,
1270
1271 pub unexpected_token_label: Option<Span>,
1272 pub sugg: ExpectedSemiSugg,
1273}
1274
1275impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for ExpectedSemi {
1276 #[track_caller]
1277 fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
1278 let token_descr = TokenDescription::from_token(&self.token);
1279
1280 let mut add_token = true;
1281 let mut diag = Diag::new(
1282 dcx,
1283 level,
1284 match token_descr {
1285 Some(TokenDescription::ReservedIdentifier) => {
1286 fluent::parse_expected_semi_found_reserved_identifier_str
1287 }
1288 Some(TokenDescription::Keyword) => fluent::parse_expected_semi_found_keyword_str,
1289 Some(TokenDescription::ReservedKeyword) => {
1290 fluent::parse_expected_semi_found_reserved_keyword_str
1291 }
1292 Some(TokenDescription::DocComment) => {
1293 fluent::parse_expected_semi_found_doc_comment_str
1294 }
1295 Some(TokenDescription::MetaVar(_)) => {
1296 add_token = false;
1297 fluent::parse_expected_semi_found_metavar_str
1298 }
1299 None => fluent::parse_expected_semi_found_str,
1300 },
1301 );
1302 diag.span(self.span);
1303 if add_token {
1304 diag.arg("token", self.token);
1305 }
1306
1307 if let Some(unexpected_token_label) = self.unexpected_token_label {
1308 diag.span_label(unexpected_token_label, fluent::parse_label_unexpected_token);
1309 }
1310
1311 self.sugg.add_to_diag(&mut diag);
1312
1313 diag
1314 }
1315}
1316
1317#[derive(Subdiagnostic)]
1318pub(crate) enum ExpectedSemiSugg {
1319 #[suggestion(
1320 parse_sugg_change_this_to_semi,
1321 code = ";",
1322 applicability = "machine-applicable",
1323 style = "short"
1324 )]
1325 ChangeToSemi(#[primary_span] Span),
1326 #[suggestion(
1327 parse_sugg_add_semi,
1328 code = ";",
1329 applicability = "machine-applicable",
1330 style = "short"
1331 )]
1332 AddSemi(#[primary_span] Span),
1333}
1334
1335#[derive(Diagnostic)]
1336#[diag(parse_struct_literal_body_without_path)]
1337pub(crate) struct StructLiteralBodyWithoutPath {
1338 #[primary_span]
1339 pub span: Span,
1340 #[subdiagnostic]
1341 pub sugg: StructLiteralBodyWithoutPathSugg,
1342}
1343
1344#[derive(Subdiagnostic)]
1345#[multipart_suggestion(parse_suggestion, applicability = "has-placeholders")]
1346pub(crate) struct StructLiteralBodyWithoutPathSugg {
1347 #[suggestion_part(code = "{{ SomeStruct ")]
1348 pub before: Span,
1349 #[suggestion_part(code = " }}")]
1350 pub after: Span,
1351}
1352
1353#[derive(Diagnostic)]
1354#[diag(parse_unmatched_angle_brackets)]
1355pub(crate) struct UnmatchedAngleBrackets {
1356 #[primary_span]
1357 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
1358 pub span: Span,
1359 pub num_extra_brackets: usize,
1360}
1361
1362#[derive(Diagnostic)]
1363#[diag(parse_generic_parameters_without_angle_brackets)]
1364pub(crate) struct GenericParamsWithoutAngleBrackets {
1365 #[primary_span]
1366 pub span: Span,
1367 #[subdiagnostic]
1368 pub sugg: GenericParamsWithoutAngleBracketsSugg,
1369}
1370
1371#[derive(Subdiagnostic)]
1372#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1373pub(crate) struct GenericParamsWithoutAngleBracketsSugg {
1374 #[suggestion_part(code = "<")]
1375 pub left: Span,
1376 #[suggestion_part(code = ">")]
1377 pub right: Span,
1378}
1379
1380#[derive(Diagnostic)]
1381#[diag(parse_comparison_operators_cannot_be_chained)]
1382pub(crate) struct ComparisonOperatorsCannotBeChained {
1383 #[primary_span]
1384 pub span: Vec<Span>,
1385 #[suggestion(
1386 parse_sugg_turbofish_syntax,
1387 style = "verbose",
1388 code = "::",
1389 applicability = "maybe-incorrect"
1390 )]
1391 pub suggest_turbofish: Option<Span>,
1392 #[help(parse_sugg_turbofish_syntax)]
1393 #[help(parse_sugg_parentheses_for_function_args)]
1394 pub help_turbofish: bool,
1395 #[subdiagnostic]
1396 pub chaining_sugg: Option<ComparisonOperatorsCannotBeChainedSugg>,
1397}
1398
1399#[derive(Subdiagnostic)]
1400pub(crate) enum ComparisonOperatorsCannotBeChainedSugg {
1401 #[suggestion(
1402 parse_sugg_split_comparison,
1403 style = "verbose",
1404 code = " && {middle_term}",
1405 applicability = "maybe-incorrect"
1406 )]
1407 SplitComparison {
1408 #[primary_span]
1409 span: Span,
1410 middle_term: String,
1411 },
1412 #[multipart_suggestion(parse_sugg_parenthesize, applicability = "maybe-incorrect")]
1413 Parenthesize {
1414 #[suggestion_part(code = "(")]
1415 left: Span,
1416 #[suggestion_part(code = ")")]
1417 right: Span,
1418 },
1419}
1420
1421#[derive(Diagnostic)]
1422#[diag(parse_question_mark_in_type)]
1423pub(crate) struct QuestionMarkInType {
1424 #[primary_span]
1425 #[label]
1426 pub span: Span,
1427 #[subdiagnostic]
1428 pub sugg: QuestionMarkInTypeSugg,
1429}
1430
1431#[derive(Subdiagnostic)]
1432#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1433pub(crate) struct QuestionMarkInTypeSugg {
1434 #[suggestion_part(code = "Option<")]
1435 pub left: Span,
1436 #[suggestion_part(code = ">")]
1437 pub right: Span,
1438}
1439
1440#[derive(Diagnostic)]
1441#[diag(parse_unexpected_parentheses_in_for_head)]
1442pub(crate) struct ParenthesesInForHead {
1443 #[primary_span]
1444 pub span: Vec<Span>,
1445 #[subdiagnostic]
1446 pub sugg: ParenthesesInForHeadSugg,
1447}
1448
1449#[derive(Subdiagnostic)]
1450#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1451pub(crate) struct ParenthesesInForHeadSugg {
1452 #[suggestion_part(code = " ")]
1453 pub left: Span,
1454 #[suggestion_part(code = " ")]
1455 pub right: Span,
1456}
1457
1458#[derive(Diagnostic)]
1459#[diag(parse_unexpected_parentheses_in_match_arm_pattern)]
1460pub(crate) struct ParenthesesInMatchPat {
1461 #[primary_span]
1462 pub span: Vec<Span>,
1463 #[subdiagnostic]
1464 pub sugg: ParenthesesInMatchPatSugg,
1465}
1466
1467#[derive(Subdiagnostic)]
1468#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1469pub(crate) struct ParenthesesInMatchPatSugg {
1470 #[suggestion_part(code = "")]
1471 pub left: Span,
1472 #[suggestion_part(code = "")]
1473 pub right: Span,
1474}
1475
1476#[derive(Diagnostic)]
1477#[diag(parse_doc_comment_on_param_type)]
1478pub(crate) struct DocCommentOnParamType {
1479 #[primary_span]
1480 #[label]
1481 pub span: Span,
1482}
1483
1484#[derive(Diagnostic)]
1485#[diag(parse_attribute_on_param_type)]
1486pub(crate) struct AttributeOnParamType {
1487 #[primary_span]
1488 #[label]
1489 pub span: Span,
1490}
1491
1492#[derive(Diagnostic)]
1493#[diag(parse_pattern_method_param_without_body, code = E0642)]
1494pub(crate) struct PatternMethodParamWithoutBody {
1495 #[primary_span]
1496 #[suggestion(code = "_", applicability = "machine-applicable", style = "verbose")]
1497 pub span: Span,
1498}
1499
1500#[derive(Diagnostic)]
1501#[diag(parse_self_param_not_first)]
1502pub(crate) struct SelfParamNotFirst {
1503 #[primary_span]
1504 #[label]
1505 pub span: Span,
1506}
1507
1508#[derive(Diagnostic)]
1509#[diag(parse_const_generic_without_braces)]
1510pub(crate) struct ConstGenericWithoutBraces {
1511 #[primary_span]
1512 pub span: Span,
1513 #[subdiagnostic]
1514 pub sugg: ConstGenericWithoutBracesSugg,
1515}
1516
1517#[derive(Subdiagnostic)]
1518#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1519pub(crate) struct ConstGenericWithoutBracesSugg {
1520 #[suggestion_part(code = "{{ ")]
1521 pub left: Span,
1522 #[suggestion_part(code = " }}")]
1523 pub right: Span,
1524}
1525
1526#[derive(Diagnostic)]
1527#[diag(parse_unexpected_const_param_declaration)]
1528pub(crate) struct UnexpectedConstParamDeclaration {
1529 #[primary_span]
1530 #[label]
1531 pub span: Span,
1532 #[subdiagnostic]
1533 pub sugg: Option<UnexpectedConstParamDeclarationSugg>,
1534}
1535
1536#[derive(Subdiagnostic)]
1537pub(crate) enum UnexpectedConstParamDeclarationSugg {
1538 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1539 AddParam {
1540 #[suggestion_part(code = "<{snippet}>")]
1541 impl_generics: Span,
1542 #[suggestion_part(code = "{ident}")]
1543 incorrect_decl: Span,
1544 snippet: String,
1545 ident: String,
1546 },
1547 #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1548 AppendParam {
1549 #[suggestion_part(code = ", {snippet}")]
1550 impl_generics_end: Span,
1551 #[suggestion_part(code = "{ident}")]
1552 incorrect_decl: Span,
1553 snippet: String,
1554 ident: String,
1555 },
1556}
1557
1558#[derive(Diagnostic)]
1559#[diag(parse_unexpected_const_in_generic_param)]
1560pub(crate) struct UnexpectedConstInGenericParam {
1561 #[primary_span]
1562 pub span: Span,
1563 #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")]
1564 pub to_remove: Option<Span>,
1565}
1566
1567#[derive(Diagnostic)]
1568#[diag(parse_async_move_order_incorrect)]
1569pub(crate) struct AsyncMoveOrderIncorrect {
1570 #[primary_span]
1571 #[suggestion(style = "verbose", code = "async move", applicability = "maybe-incorrect")]
1572 pub span: Span,
1573}
1574
1575#[derive(Diagnostic)]
1576#[diag(parse_async_use_order_incorrect)]
1577pub(crate) struct AsyncUseOrderIncorrect {
1578 #[primary_span]
1579 #[suggestion(style = "verbose", code = "async use", applicability = "maybe-incorrect")]
1580 pub span: Span,
1581}
1582
1583#[derive(Diagnostic)]
1584#[diag(parse_double_colon_in_bound)]
1585pub(crate) struct DoubleColonInBound {
1586 #[primary_span]
1587 pub span: Span,
1588 #[suggestion(code = ": ", applicability = "machine-applicable", style = "verbose")]
1589 pub between: Span,
1590}
1591
1592#[derive(Diagnostic)]
1593#[diag(parse_fn_ptr_with_generics)]
1594pub(crate) struct FnPtrWithGenerics {
1595 #[primary_span]
1596 pub span: Span,
1597 #[subdiagnostic]
1598 pub sugg: Option<FnPtrWithGenericsSugg>,
1599}
1600
1601#[derive(Subdiagnostic)]
1602#[multipart_suggestion(
1603 parse_misplaced_return_type,
1604 style = "verbose",
1605 applicability = "maybe-incorrect"
1606)]
1607pub(crate) struct MisplacedReturnType {
1608 #[suggestion_part(code = " {snippet}")]
1609 pub fn_params_end: Span,
1610 pub snippet: String,
1611 #[suggestion_part(code = "")]
1612 pub ret_ty_span: Span,
1613}
1614
1615#[derive(Subdiagnostic)]
1616#[multipart_suggestion(parse_suggestion, applicability = "maybe-incorrect")]
1617pub(crate) struct FnPtrWithGenericsSugg {
1618 #[suggestion_part(code = "{snippet}")]
1619 pub left: Span,
1620 pub snippet: String,
1621 #[suggestion_part(code = "")]
1622 pub right: Span,
1623 pub arity: usize,
1624 pub for_param_list_exists: bool,
1625}
1626
1627pub(crate) struct FnTraitMissingParen {
1628 pub span: Span,
1629}
1630
1631impl Subdiagnostic for FnTraitMissingParen {
1632 fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
1633 diag.span_label(self.span, crate::fluent_generated::parse_fn_trait_missing_paren);
1634 diag.span_suggestion_short(
1635 self.span.shrink_to_hi(),
1636 crate::fluent_generated::parse_add_paren,
1637 "()",
1638 Applicability::MachineApplicable,
1639 );
1640 }
1641}
1642
1643#[derive(Diagnostic)]
1644#[diag(parse_unexpected_if_with_if)]
1645pub(crate) struct UnexpectedIfWithIf(
1646 #[primary_span]
1647 #[suggestion(applicability = "machine-applicable", code = " ", style = "verbose")]
1648 pub Span,
1649);
1650
1651#[derive(Diagnostic)]
1652#[diag(parse_maybe_fn_typo_with_impl)]
1653pub(crate) struct FnTypoWithImpl {
1654 #[primary_span]
1655 #[suggestion(applicability = "maybe-incorrect", code = "impl", style = "verbose")]
1656 pub fn_span: Span,
1657}
1658
1659#[derive(Diagnostic)]
1660#[diag(parse_expected_fn_path_found_fn_keyword)]
1661pub(crate) struct ExpectedFnPathFoundFnKeyword {
1662 #[primary_span]
1663 #[suggestion(applicability = "machine-applicable", code = "Fn", style = "verbose")]
1664 pub fn_token_span: Span,
1665}
1666
1667#[derive(Diagnostic)]
1668#[diag(parse_path_found_named_params)]
1669pub(crate) struct FnPathFoundNamedParams {
1670 #[primary_span]
1671 #[suggestion(applicability = "machine-applicable", code = "")]
1672 pub named_param_span: Span,
1673}
1674
1675#[derive(Diagnostic)]
1676#[diag(parse_path_found_c_variadic_params)]
1677pub(crate) struct PathFoundCVariadicParams {
1678 #[primary_span]
1679 #[suggestion(applicability = "machine-applicable", code = "")]
1680 pub span: Span,
1681}
1682
1683#[derive(Diagnostic)]
1684#[diag(parse_path_found_attribute_in_params)]
1685pub(crate) struct PathFoundAttributeInParams {
1686 #[primary_span]
1687 #[suggestion(applicability = "machine-applicable", code = "")]
1688 pub span: Span,
1689}
1690
1691#[derive(Diagnostic)]
1692#[diag(parse_path_double_colon)]
1693pub(crate) struct PathSingleColon {
1694 #[primary_span]
1695 pub span: Span,
1696
1697 #[suggestion(applicability = "machine-applicable", code = ":", style = "verbose")]
1698 pub suggestion: Span,
1699}
1700
1701#[derive(Diagnostic)]
1702#[diag(parse_path_double_colon)]
1703pub(crate) struct PathTripleColon {
1704 #[primary_span]
1705 #[suggestion(applicability = "maybe-incorrect", code = "", style = "verbose")]
1706 pub span: Span,
1707}
1708
1709#[derive(Diagnostic)]
1710#[diag(parse_colon_as_semi)]
1711pub(crate) struct ColonAsSemi {
1712 #[primary_span]
1713 #[suggestion(applicability = "machine-applicable", code = ";", style = "verbose")]
1714 pub span: Span,
1715}
1716
1717#[derive(Diagnostic)]
1718#[diag(parse_where_clause_before_tuple_struct_body)]
1719pub(crate) struct WhereClauseBeforeTupleStructBody {
1720 #[primary_span]
1721 #[label]
1722 pub span: Span,
1723 #[label(parse_name_label)]
1724 pub name: Span,
1725 #[label(parse_body_label)]
1726 pub body: Span,
1727 #[subdiagnostic]
1728 pub sugg: Option<WhereClauseBeforeTupleStructBodySugg>,
1729}
1730
1731#[derive(Subdiagnostic)]
1732#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1733pub(crate) struct WhereClauseBeforeTupleStructBodySugg {
1734 #[suggestion_part(code = "{snippet}")]
1735 pub left: Span,
1736 pub snippet: String,
1737 #[suggestion_part(code = "")]
1738 pub right: Span,
1739}
1740
1741#[derive(Diagnostic)]
1742#[diag(parse_async_fn_in_2015, code = E0670)]
1743pub(crate) struct AsyncFnIn2015 {
1744 #[primary_span]
1745 #[label]
1746 pub span: Span,
1747 #[subdiagnostic]
1748 pub help: HelpUseLatestEdition,
1749}
1750
1751#[derive(Subdiagnostic)]
1752#[label(parse_async_block_in_2015)]
1753pub(crate) struct AsyncBlockIn2015 {
1754 #[primary_span]
1755 pub span: Span,
1756}
1757
1758#[derive(Diagnostic)]
1759#[diag(parse_async_move_block_in_2015)]
1760pub(crate) struct AsyncMoveBlockIn2015 {
1761 #[primary_span]
1762 pub span: Span,
1763}
1764
1765#[derive(Diagnostic)]
1766#[diag(parse_async_use_block_in_2015)]
1767pub(crate) struct AsyncUseBlockIn2015 {
1768 #[primary_span]
1769 pub span: Span,
1770}
1771
1772#[derive(Diagnostic)]
1773#[diag(parse_async_bound_modifier_in_2015)]
1774pub(crate) struct AsyncBoundModifierIn2015 {
1775 #[primary_span]
1776 pub span: Span,
1777 #[subdiagnostic]
1778 pub help: HelpUseLatestEdition,
1779}
1780
1781#[derive(Diagnostic)]
1782#[diag(parse_let_chain_pre_2024)]
1783pub(crate) struct LetChainPre2024 {
1784 #[primary_span]
1785 pub span: Span,
1786}
1787
1788#[derive(Diagnostic)]
1789#[diag(parse_self_argument_pointer)]
1790pub(crate) struct SelfArgumentPointer {
1791 #[primary_span]
1792 #[label]
1793 pub span: Span,
1794}
1795
1796#[derive(Diagnostic)]
1797#[diag(parse_unexpected_token_after_dot)]
1798pub(crate) struct UnexpectedTokenAfterDot {
1799 #[primary_span]
1800 pub span: Span,
1801 pub actual: String,
1802}
1803
1804#[derive(Diagnostic)]
1805#[diag(parse_visibility_not_followed_by_item)]
1806#[help]
1807pub(crate) struct VisibilityNotFollowedByItem {
1808 #[primary_span]
1809 #[label]
1810 pub span: Span,
1811 pub vis: Visibility,
1812}
1813
1814#[derive(Diagnostic)]
1815#[diag(parse_default_not_followed_by_item)]
1816#[note]
1817pub(crate) struct DefaultNotFollowedByItem {
1818 #[primary_span]
1819 #[label]
1820 pub span: Span,
1821}
1822
1823#[derive(Diagnostic)]
1824pub(crate) enum MissingKeywordForItemDefinition {
1825 #[diag(parse_missing_enum_for_enum_definition)]
1826 Enum {
1827 #[primary_span]
1828 span: Span,
1829 #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "enum ")]
1830 insert_span: Span,
1831 ident: Ident,
1832 },
1833 #[diag(parse_missing_enum_or_struct_for_item_definition)]
1834 EnumOrStruct {
1835 #[primary_span]
1836 span: Span,
1837 },
1838 #[diag(parse_missing_struct_for_struct_definition)]
1839 Struct {
1840 #[primary_span]
1841 span: Span,
1842 #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "struct ")]
1843 insert_span: Span,
1844 ident: Ident,
1845 },
1846 #[diag(parse_missing_fn_for_function_definition)]
1847 Function {
1848 #[primary_span]
1849 span: Span,
1850 #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "fn ")]
1851 insert_span: Span,
1852 ident: Ident,
1853 },
1854 #[diag(parse_missing_fn_for_method_definition)]
1855 Method {
1856 #[primary_span]
1857 span: Span,
1858 #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "fn ")]
1859 insert_span: Span,
1860 ident: Ident,
1861 },
1862 #[diag(parse_missing_fn_or_struct_for_item_definition)]
1863 Ambiguous {
1864 #[primary_span]
1865 span: Span,
1866 #[subdiagnostic]
1867 subdiag: Option<AmbiguousMissingKwForItemSub>,
1868 },
1869}
1870
1871#[derive(Subdiagnostic)]
1872pub(crate) enum AmbiguousMissingKwForItemSub {
1873 #[suggestion(
1874 parse_suggestion,
1875 applicability = "maybe-incorrect",
1876 code = "{snippet}!",
1877 style = "verbose"
1878 )]
1879 SuggestMacro {
1880 #[primary_span]
1881 span: Span,
1882 snippet: String,
1883 },
1884 #[help(parse_help)]
1885 HelpMacro,
1886}
1887
1888#[derive(Diagnostic)]
1889#[diag(parse_missing_fn_params)]
1890pub(crate) struct MissingFnParams {
1891 #[primary_span]
1892 #[suggestion(code = "()", applicability = "machine-applicable", style = "verbose")]
1893 pub span: Span,
1894}
1895
1896#[derive(Diagnostic)]
1897#[diag(parse_invalid_path_sep_in_fn_definition)]
1898pub(crate) struct InvalidPathSepInFnDefinition {
1899 #[primary_span]
1900 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
1901 pub span: Span,
1902}
1903
1904#[derive(Diagnostic)]
1905#[diag(parse_missing_trait_in_trait_impl)]
1906pub(crate) struct MissingTraitInTraitImpl {
1907 #[primary_span]
1908 #[suggestion(
1909 parse_suggestion_add_trait,
1910 code = " Trait ",
1911 applicability = "has-placeholders",
1912 style = "verbose"
1913 )]
1914 pub span: Span,
1915 #[suggestion(
1916 parse_suggestion_remove_for,
1917 code = "",
1918 applicability = "maybe-incorrect",
1919 style = "verbose"
1920 )]
1921 pub for_span: Span,
1922}
1923
1924#[derive(Diagnostic)]
1925#[diag(parse_missing_for_in_trait_impl)]
1926pub(crate) struct MissingForInTraitImpl {
1927 #[primary_span]
1928 #[suggestion(style = "verbose", code = " for ", applicability = "machine-applicable")]
1929 pub span: Span,
1930}
1931
1932#[derive(Diagnostic)]
1933#[diag(parse_expected_trait_in_trait_impl_found_type)]
1934pub(crate) struct ExpectedTraitInTraitImplFoundType {
1935 #[primary_span]
1936 pub span: Span,
1937}
1938
1939#[derive(Diagnostic)]
1940#[diag(parse_extra_impl_keyword_in_trait_impl)]
1941pub(crate) struct ExtraImplKeywordInTraitImpl {
1942 #[primary_span]
1943 #[suggestion(code = "", applicability = "maybe-incorrect", style = "short")]
1944 pub extra_impl_kw: Span,
1945 #[note]
1946 pub impl_trait_span: Span,
1947}
1948
1949#[derive(Diagnostic)]
1950#[diag(parse_bounds_not_allowed_on_trait_aliases)]
1951pub(crate) struct BoundsNotAllowedOnTraitAliases {
1952 #[primary_span]
1953 pub span: Span,
1954}
1955
1956#[derive(Diagnostic)]
1957#[diag(parse_trait_alias_cannot_be_auto)]
1958pub(crate) struct TraitAliasCannotBeAuto {
1959 #[primary_span]
1960 #[label(parse_trait_alias_cannot_be_auto)]
1961 pub span: Span,
1962}
1963
1964#[derive(Diagnostic)]
1965#[diag(parse_trait_alias_cannot_be_unsafe)]
1966pub(crate) struct TraitAliasCannotBeUnsafe {
1967 #[primary_span]
1968 #[label(parse_trait_alias_cannot_be_unsafe)]
1969 pub span: Span,
1970}
1971
1972#[derive(Diagnostic)]
1973#[diag(parse_associated_static_item_not_allowed)]
1974pub(crate) struct AssociatedStaticItemNotAllowed {
1975 #[primary_span]
1976 pub span: Span,
1977}
1978
1979#[derive(Diagnostic)]
1980#[diag(parse_extern_crate_name_with_dashes)]
1981pub(crate) struct ExternCrateNameWithDashes {
1982 #[primary_span]
1983 #[label]
1984 pub span: Span,
1985 #[subdiagnostic]
1986 pub sugg: ExternCrateNameWithDashesSugg,
1987}
1988
1989#[derive(Subdiagnostic)]
1990#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
1991pub(crate) struct ExternCrateNameWithDashesSugg {
1992 #[suggestion_part(code = "_")]
1993 pub dashes: Vec<Span>,
1994}
1995
1996#[derive(Diagnostic)]
1997#[diag(parse_extern_item_cannot_be_const)]
1998#[note]
1999pub(crate) struct ExternItemCannotBeConst {
2000 #[primary_span]
2001 pub ident_span: Span,
2002 #[suggestion(code = "static ", applicability = "machine-applicable", style = "verbose")]
2003 pub const_span: Option<Span>,
2004}
2005
2006#[derive(Diagnostic)]
2007#[diag(parse_const_global_cannot_be_mutable)]
2008pub(crate) struct ConstGlobalCannotBeMutable {
2009 #[primary_span]
2010 #[label]
2011 pub ident_span: Span,
2012 #[suggestion(code = "static", style = "verbose", applicability = "maybe-incorrect")]
2013 pub const_span: Span,
2014}
2015
2016#[derive(Diagnostic)]
2017#[diag(parse_missing_const_type)]
2018pub(crate) struct MissingConstType {
2019 #[primary_span]
2020 #[suggestion(code = "{colon} <type>", style = "verbose", applicability = "has-placeholders")]
2021 pub span: Span,
2022
2023 pub kind: &'static str,
2024 pub colon: &'static str,
2025}
2026
2027#[derive(Diagnostic)]
2028#[diag(parse_enum_struct_mutually_exclusive)]
2029pub(crate) struct EnumStructMutuallyExclusive {
2030 #[primary_span]
2031 #[suggestion(code = "enum", style = "verbose", applicability = "machine-applicable")]
2032 pub span: Span,
2033}
2034
2035#[derive(Diagnostic)]
2036pub(crate) enum UnexpectedTokenAfterStructName {
2037 #[diag(parse_unexpected_token_after_struct_name_found_reserved_identifier)]
2038 ReservedIdentifier {
2039 #[primary_span]
2040 #[label(parse_unexpected_token_after_struct_name)]
2041 span: Span,
2042 token: Token,
2043 },
2044 #[diag(parse_unexpected_token_after_struct_name_found_keyword)]
2045 Keyword {
2046 #[primary_span]
2047 #[label(parse_unexpected_token_after_struct_name)]
2048 span: Span,
2049 token: Token,
2050 },
2051 #[diag(parse_unexpected_token_after_struct_name_found_reserved_keyword)]
2052 ReservedKeyword {
2053 #[primary_span]
2054 #[label(parse_unexpected_token_after_struct_name)]
2055 span: Span,
2056 token: Token,
2057 },
2058 #[diag(parse_unexpected_token_after_struct_name_found_doc_comment)]
2059 DocComment {
2060 #[primary_span]
2061 #[label(parse_unexpected_token_after_struct_name)]
2062 span: Span,
2063 token: Token,
2064 },
2065 #[diag(parse_unexpected_token_after_struct_name_found_metavar)]
2066 MetaVar {
2067 #[primary_span]
2068 #[label(parse_unexpected_token_after_struct_name)]
2069 span: Span,
2070 },
2071 #[diag(parse_unexpected_token_after_struct_name_found_other)]
2072 Other {
2073 #[primary_span]
2074 #[label(parse_unexpected_token_after_struct_name)]
2075 span: Span,
2076 token: Token,
2077 },
2078}
2079
2080impl UnexpectedTokenAfterStructName {
2081 pub(crate) fn new(span: Span, token: Token) -> Self {
2082 match TokenDescription::from_token(&token) {
2083 Some(TokenDescription::ReservedIdentifier) => Self::ReservedIdentifier { span, token },
2084 Some(TokenDescription::Keyword) => Self::Keyword { span, token },
2085 Some(TokenDescription::ReservedKeyword) => Self::ReservedKeyword { span, token },
2086 Some(TokenDescription::DocComment) => Self::DocComment { span, token },
2087 Some(TokenDescription::MetaVar(_)) => Self::MetaVar { span },
2088 None => Self::Other { span, token },
2089 }
2090 }
2091}
2092
2093#[derive(Diagnostic)]
2094#[diag(parse_unexpected_self_in_generic_parameters)]
2095#[note]
2096pub(crate) struct UnexpectedSelfInGenericParameters {
2097 #[primary_span]
2098 pub span: Span,
2099}
2100
2101#[derive(Diagnostic)]
2102#[diag(parse_unexpected_default_value_for_lifetime_in_generic_parameters)]
2103pub(crate) struct UnexpectedDefaultValueForLifetimeInGenericParameters {
2104 #[primary_span]
2105 #[label]
2106 pub span: Span,
2107}
2108
2109#[derive(Diagnostic)]
2110#[diag(parse_multiple_where_clauses)]
2111pub(crate) struct MultipleWhereClauses {
2112 #[primary_span]
2113 pub span: Span,
2114 #[label]
2115 pub previous: Span,
2116 #[suggestion(style = "verbose", code = ",", applicability = "maybe-incorrect")]
2117 pub between: Span,
2118}
2119
2120#[derive(Diagnostic)]
2121pub(crate) enum UnexpectedNonterminal {
2122 #[diag(parse_nonterminal_expected_item_keyword)]
2123 Item(#[primary_span] Span),
2124 #[diag(parse_nonterminal_expected_statement)]
2125 Statement(#[primary_span] Span),
2126 #[diag(parse_nonterminal_expected_ident)]
2127 Ident {
2128 #[primary_span]
2129 span: Span,
2130 token: Token,
2131 },
2132 #[diag(parse_nonterminal_expected_lifetime)]
2133 Lifetime {
2134 #[primary_span]
2135 span: Span,
2136 token: Token,
2137 },
2138}
2139
2140#[derive(Diagnostic)]
2141pub(crate) enum TopLevelOrPatternNotAllowed {
2142 #[diag(parse_or_pattern_not_allowed_in_let_binding)]
2143 LetBinding {
2144 #[primary_span]
2145 span: Span,
2146 #[subdiagnostic]
2147 sub: Option<TopLevelOrPatternNotAllowedSugg>,
2148 },
2149 #[diag(parse_or_pattern_not_allowed_in_fn_parameters)]
2150 FunctionParameter {
2151 #[primary_span]
2152 span: Span,
2153 #[subdiagnostic]
2154 sub: Option<TopLevelOrPatternNotAllowedSugg>,
2155 },
2156}
2157
2158#[derive(Diagnostic)]
2159#[diag(parse_cannot_be_raw_ident)]
2160pub(crate) struct CannotBeRawIdent {
2161 #[primary_span]
2162 pub span: Span,
2163 pub ident: Symbol,
2164}
2165
2166#[derive(Diagnostic)]
2167#[diag(parse_cannot_be_raw_lifetime)]
2168pub(crate) struct CannotBeRawLifetime {
2169 #[primary_span]
2170 pub span: Span,
2171 pub ident: Symbol,
2172}
2173
2174#[derive(Diagnostic)]
2175#[diag(parse_keyword_lifetime)]
2176pub(crate) struct KeywordLifetime {
2177 #[primary_span]
2178 pub span: Span,
2179}
2180
2181#[derive(Diagnostic)]
2182#[diag(parse_invalid_label)]
2183pub(crate) struct InvalidLabel {
2184 #[primary_span]
2185 pub span: Span,
2186 pub name: Symbol,
2187}
2188
2189#[derive(Diagnostic)]
2190#[diag(parse_cr_doc_comment)]
2191pub(crate) struct CrDocComment {
2192 #[primary_span]
2193 pub span: Span,
2194 pub block: bool,
2195}
2196
2197#[derive(Diagnostic)]
2198#[diag(parse_no_digits_literal, code = E0768)]
2199pub(crate) struct NoDigitsLiteral {
2200 #[primary_span]
2201 pub span: Span,
2202}
2203
2204#[derive(Diagnostic)]
2205#[diag(parse_invalid_digit_literal)]
2206pub(crate) struct InvalidDigitLiteral {
2207 #[primary_span]
2208 pub span: Span,
2209 pub base: u32,
2210}
2211
2212#[derive(Diagnostic)]
2213#[diag(parse_empty_exponent_float)]
2214pub(crate) struct EmptyExponentFloat {
2215 #[primary_span]
2216 pub span: Span,
2217}
2218
2219#[derive(Diagnostic)]
2220#[diag(parse_float_literal_unsupported_base)]
2221pub(crate) struct FloatLiteralUnsupportedBase {
2222 #[primary_span]
2223 pub span: Span,
2224 pub base: &'static str,
2225}
2226
2227#[derive(Diagnostic)]
2228#[diag(parse_unknown_prefix)]
2229#[note]
2230pub(crate) struct UnknownPrefix<'a> {
2231 #[primary_span]
2232 #[label]
2233 pub span: Span,
2234 pub prefix: &'a str,
2235 #[subdiagnostic]
2236 pub sugg: Option<UnknownPrefixSugg>,
2237}
2238
2239#[derive(Subdiagnostic)]
2240#[note(parse_macro_expands_to_adt_field)]
2241pub(crate) struct MacroExpandsToAdtField<'a> {
2242 pub adt_ty: &'a str,
2243}
2244
2245#[derive(Subdiagnostic)]
2246pub(crate) enum UnknownPrefixSugg {
2247 #[suggestion(
2248 parse_suggestion_br,
2249 code = "br",
2250 applicability = "maybe-incorrect",
2251 style = "verbose"
2252 )]
2253 UseBr(#[primary_span] Span),
2254 #[suggestion(
2255 parse_suggestion_cr,
2256 code = "cr",
2257 applicability = "maybe-incorrect",
2258 style = "verbose"
2259 )]
2260 UseCr(#[primary_span] Span),
2261 #[suggestion(
2262 parse_suggestion_whitespace,
2263 code = " ",
2264 applicability = "maybe-incorrect",
2265 style = "verbose"
2266 )]
2267 Whitespace(#[primary_span] Span),
2268 #[multipart_suggestion(
2269 parse_suggestion_str,
2270 applicability = "maybe-incorrect",
2271 style = "verbose"
2272 )]
2273 MeantStr {
2274 #[suggestion_part(code = "\"")]
2275 start: Span,
2276 #[suggestion_part(code = "\"")]
2277 end: Span,
2278 },
2279}
2280
2281#[derive(Diagnostic)]
2282#[diag(parse_reserved_multihash)]
2283#[note]
2284pub(crate) struct ReservedMultihash {
2285 #[primary_span]
2286 pub span: Span,
2287 #[subdiagnostic]
2288 pub sugg: Option<GuardedStringSugg>,
2289}
2290#[derive(Diagnostic)]
2291#[diag(parse_reserved_string)]
2292#[note]
2293pub(crate) struct ReservedString {
2294 #[primary_span]
2295 pub span: Span,
2296 #[subdiagnostic]
2297 pub sugg: Option<GuardedStringSugg>,
2298}
2299#[derive(Subdiagnostic)]
2300#[suggestion(
2301 parse_suggestion_whitespace,
2302 code = " ",
2303 applicability = "maybe-incorrect",
2304 style = "verbose"
2305)]
2306pub(crate) struct GuardedStringSugg(#[primary_span] pub Span);
2307
2308#[derive(Diagnostic)]
2309#[diag(parse_too_many_hashes)]
2310pub(crate) struct TooManyHashes {
2311 #[primary_span]
2312 pub span: Span,
2313 pub num: u32,
2314}
2315
2316#[derive(Diagnostic)]
2317#[diag(parse_unknown_start_of_token)]
2318pub(crate) struct UnknownTokenStart {
2319 #[primary_span]
2320 pub span: Span,
2321 pub escaped: String,
2322 #[subdiagnostic]
2323 pub sugg: Option<TokenSubstitution>,
2324 #[subdiagnostic]
2325 pub null: Option<UnknownTokenNull>,
2326 #[subdiagnostic]
2327 pub repeat: Option<UnknownTokenRepeat>,
2328}
2329
2330#[derive(Subdiagnostic)]
2331pub(crate) enum TokenSubstitution {
2332 #[suggestion(
2333 parse_sugg_quotes,
2334 code = "{suggestion}",
2335 applicability = "maybe-incorrect",
2336 style = "verbose"
2337 )]
2338 DirectedQuotes {
2339 #[primary_span]
2340 span: Span,
2341 suggestion: String,
2342 ascii_str: &'static str,
2343 ascii_name: &'static str,
2344 },
2345 #[suggestion(
2346 parse_sugg_other,
2347 code = "{suggestion}",
2348 applicability = "maybe-incorrect",
2349 style = "verbose"
2350 )]
2351 Other {
2352 #[primary_span]
2353 span: Span,
2354 suggestion: String,
2355 ch: String,
2356 u_name: &'static str,
2357 ascii_str: &'static str,
2358 ascii_name: &'static str,
2359 },
2360}
2361
2362#[derive(Subdiagnostic)]
2363#[note(parse_note_repeats)]
2364pub(crate) struct UnknownTokenRepeat {
2365 pub repeats: usize,
2366}
2367
2368#[derive(Subdiagnostic)]
2369#[help(parse_help_null)]
2370pub(crate) struct UnknownTokenNull;
2371
2372#[derive(Diagnostic)]
2373pub(crate) enum UnescapeError {
2374 #[diag(parse_invalid_unicode_escape)]
2375 #[help]
2376 InvalidUnicodeEscape {
2377 #[primary_span]
2378 #[label]
2379 span: Span,
2380 surrogate: bool,
2381 },
2382 #[diag(parse_escape_only_char)]
2383 EscapeOnlyChar {
2384 #[primary_span]
2385 span: Span,
2386 #[suggestion(
2387 parse_escape,
2388 applicability = "machine-applicable",
2389 code = "{escaped_sugg}",
2390 style = "verbose"
2391 )]
2392 char_span: Span,
2393 escaped_sugg: String,
2394 escaped_msg: String,
2395 byte: bool,
2396 },
2397 #[diag(parse_bare_cr)]
2398 BareCr {
2399 #[primary_span]
2400 #[suggestion(
2401 parse_escape,
2402 applicability = "machine-applicable",
2403 code = "\\r",
2404 style = "verbose"
2405 )]
2406 span: Span,
2407 double_quotes: bool,
2408 },
2409 #[diag(parse_bare_cr_in_raw_string)]
2410 BareCrRawString(#[primary_span] Span),
2411 #[diag(parse_too_short_hex_escape)]
2412 TooShortHexEscape(#[primary_span] Span),
2413 #[diag(parse_invalid_char_in_escape)]
2414 InvalidCharInEscape {
2415 #[primary_span]
2416 #[label]
2417 span: Span,
2418 is_hex: bool,
2419 ch: String,
2420 },
2421 #[diag(parse_out_of_range_hex_escape)]
2422 OutOfRangeHexEscape(
2423 #[primary_span]
2424 #[label]
2425 Span,
2426 ),
2427 #[diag(parse_leading_underscore_unicode_escape)]
2428 LeadingUnderscoreUnicodeEscape {
2429 #[primary_span]
2430 #[label(parse_leading_underscore_unicode_escape_label)]
2431 span: Span,
2432 ch: String,
2433 },
2434 #[diag(parse_overlong_unicode_escape)]
2435 OverlongUnicodeEscape(
2436 #[primary_span]
2437 #[label]
2438 Span,
2439 ),
2440 #[diag(parse_unclosed_unicode_escape)]
2441 UnclosedUnicodeEscape(
2442 #[primary_span]
2443 #[label]
2444 Span,
2445 #[suggestion(
2446 parse_terminate,
2447 code = "}}",
2448 applicability = "maybe-incorrect",
2449 style = "verbose"
2450 )]
2451 Span,
2452 ),
2453 #[diag(parse_no_brace_unicode_escape)]
2454 NoBraceInUnicodeEscape {
2455 #[primary_span]
2456 span: Span,
2457 #[label]
2458 label: Option<Span>,
2459 #[subdiagnostic]
2460 sub: NoBraceUnicodeSub,
2461 },
2462 #[diag(parse_unicode_escape_in_byte)]
2463 #[help]
2464 UnicodeEscapeInByte(
2465 #[primary_span]
2466 #[label]
2467 Span,
2468 ),
2469 #[diag(parse_empty_unicode_escape)]
2470 EmptyUnicodeEscape(
2471 #[primary_span]
2472 #[label]
2473 Span,
2474 ),
2475 #[diag(parse_zero_chars)]
2476 ZeroChars(
2477 #[primary_span]
2478 #[label]
2479 Span,
2480 ),
2481 #[diag(parse_lone_slash)]
2482 LoneSlash(
2483 #[primary_span]
2484 #[label]
2485 Span,
2486 ),
2487 #[diag(parse_unskipped_whitespace)]
2488 UnskippedWhitespace {
2489 #[primary_span]
2490 span: Span,
2491 #[label]
2492 char_span: Span,
2493 ch: String,
2494 },
2495 #[diag(parse_multiple_skipped_lines)]
2496 MultipleSkippedLinesWarning(
2497 #[primary_span]
2498 #[label]
2499 Span,
2500 ),
2501 #[diag(parse_more_than_one_char)]
2502 MoreThanOneChar {
2503 #[primary_span]
2504 span: Span,
2505 #[subdiagnostic]
2506 note: Option<MoreThanOneCharNote>,
2507 #[subdiagnostic]
2508 suggestion: MoreThanOneCharSugg,
2509 },
2510 #[diag(parse_nul_in_c_str)]
2511 NulInCStr {
2512 #[primary_span]
2513 span: Span,
2514 },
2515}
2516
2517#[derive(Subdiagnostic)]
2518pub(crate) enum MoreThanOneCharSugg {
2519 #[suggestion(
2520 parse_consider_normalized,
2521 code = "{normalized}",
2522 applicability = "machine-applicable",
2523 style = "verbose"
2524 )]
2525 NormalizedForm {
2526 #[primary_span]
2527 span: Span,
2528 ch: String,
2529 normalized: String,
2530 },
2531 #[suggestion(
2532 parse_remove_non,
2533 code = "{ch}",
2534 applicability = "maybe-incorrect",
2535 style = "verbose"
2536 )]
2537 RemoveNonPrinting {
2538 #[primary_span]
2539 span: Span,
2540 ch: String,
2541 },
2542 #[suggestion(
2543 parse_use_double_quotes,
2544 code = "{sugg}",
2545 applicability = "machine-applicable",
2546 style = "verbose"
2547 )]
2548 QuotesFull {
2549 #[primary_span]
2550 span: Span,
2551 is_byte: bool,
2552 sugg: String,
2553 },
2554 #[multipart_suggestion(parse_use_double_quotes, applicability = "machine-applicable")]
2555 Quotes {
2556 #[suggestion_part(code = "{prefix}\"")]
2557 start: Span,
2558 #[suggestion_part(code = "\"")]
2559 end: Span,
2560 is_byte: bool,
2561 prefix: &'static str,
2562 },
2563}
2564
2565#[derive(Subdiagnostic)]
2566pub(crate) enum MoreThanOneCharNote {
2567 #[note(parse_followed_by)]
2568 AllCombining {
2569 #[primary_span]
2570 span: Span,
2571 chr: String,
2572 len: usize,
2573 escaped_marks: String,
2574 },
2575 #[note(parse_non_printing)]
2576 NonPrinting {
2577 #[primary_span]
2578 span: Span,
2579 escaped: String,
2580 },
2581}
2582
2583#[derive(Subdiagnostic)]
2584pub(crate) enum NoBraceUnicodeSub {
2585 #[suggestion(
2586 parse_use_braces,
2587 code = "{suggestion}",
2588 applicability = "maybe-incorrect",
2589 style = "verbose"
2590 )]
2591 Suggestion {
2592 #[primary_span]
2593 span: Span,
2594 suggestion: String,
2595 },
2596 #[help(parse_format_of_unicode)]
2597 Help,
2598}
2599
2600#[derive(Subdiagnostic)]
2601#[multipart_suggestion(parse_sugg_wrap_pattern_in_parens, applicability = "machine-applicable")]
2602pub(crate) struct WrapInParens {
2603 #[suggestion_part(code = "(")]
2604 pub(crate) lo: Span,
2605 #[suggestion_part(code = ")")]
2606 pub(crate) hi: Span,
2607}
2608
2609#[derive(Subdiagnostic)]
2610pub(crate) enum TopLevelOrPatternNotAllowedSugg {
2611 #[suggestion(
2612 parse_sugg_remove_leading_vert_in_pattern,
2613 code = "",
2614 applicability = "machine-applicable",
2615 style = "verbose"
2616 )]
2617 RemoveLeadingVert {
2618 #[primary_span]
2619 span: Span,
2620 },
2621 WrapInParens {
2622 #[primary_span]
2623 span: Span,
2624 #[subdiagnostic]
2625 suggestion: WrapInParens,
2626 },
2627}
2628
2629#[derive(Diagnostic)]
2630#[diag(parse_unexpected_vert_vert_before_function_parameter)]
2631#[note(parse_note_pattern_alternatives_use_single_vert)]
2632pub(crate) struct UnexpectedVertVertBeforeFunctionParam {
2633 #[primary_span]
2634 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2635 pub span: Span,
2636}
2637
2638#[derive(Diagnostic)]
2639#[diag(parse_unexpected_vert_vert_in_pattern)]
2640pub(crate) struct UnexpectedVertVertInPattern {
2641 #[primary_span]
2642 #[suggestion(code = "|", applicability = "machine-applicable", style = "verbose")]
2643 pub span: Span,
2644 #[label(parse_label_while_parsing_or_pattern_here)]
2645 pub start: Option<Span>,
2646}
2647
2648#[derive(Diagnostic)]
2649#[diag(parse_trailing_vert_not_allowed)]
2650pub(crate) struct TrailingVertNotAllowed {
2651 #[primary_span]
2652 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2653 pub span: Span,
2654 #[label(parse_label_while_parsing_or_pattern_here)]
2655 pub start: Option<Span>,
2656 pub token: Token,
2657 #[note(parse_note_pattern_alternatives_use_single_vert)]
2658 pub note_double_vert: bool,
2659}
2660
2661#[derive(Diagnostic)]
2662#[diag(parse_dotdotdot_rest_pattern)]
2663pub(crate) struct DotDotDotRestPattern {
2664 #[primary_span]
2665 #[label]
2666 pub span: Span,
2667 #[suggestion(style = "verbose", code = "", applicability = "machine-applicable")]
2668 pub suggestion: Span,
2669}
2670
2671#[derive(Diagnostic)]
2672#[diag(parse_pattern_on_wrong_side_of_at)]
2673pub(crate) struct PatternOnWrongSideOfAt {
2674 #[primary_span]
2675 #[suggestion(code = "{whole_pat}", applicability = "machine-applicable", style = "verbose")]
2676 pub whole_span: Span,
2677 pub whole_pat: String,
2678 #[label(parse_label_pattern)]
2679 pub pattern: Span,
2680 #[label(parse_label_binding)]
2681 pub binding: Span,
2682}
2683
2684#[derive(Diagnostic)]
2685#[diag(parse_expected_binding_left_of_at)]
2686#[note]
2687pub(crate) struct ExpectedBindingLeftOfAt {
2688 #[primary_span]
2689 pub whole_span: Span,
2690 #[label(parse_label_lhs)]
2691 pub lhs: Span,
2692 #[label(parse_label_rhs)]
2693 pub rhs: Span,
2694}
2695
2696#[derive(Subdiagnostic)]
2697#[multipart_suggestion(
2698 parse_ambiguous_range_pattern_suggestion,
2699 applicability = "machine-applicable"
2700)]
2701pub(crate) struct ParenRangeSuggestion {
2702 #[suggestion_part(code = "(")]
2703 pub lo: Span,
2704 #[suggestion_part(code = ")")]
2705 pub hi: Span,
2706}
2707
2708#[derive(Diagnostic)]
2709#[diag(parse_ambiguous_range_pattern)]
2710pub(crate) struct AmbiguousRangePattern {
2711 #[primary_span]
2712 pub span: Span,
2713 #[subdiagnostic]
2714 pub suggestion: ParenRangeSuggestion,
2715}
2716
2717#[derive(Diagnostic)]
2718#[diag(parse_unexpected_lifetime_in_pattern)]
2719pub(crate) struct UnexpectedLifetimeInPattern {
2720 #[primary_span]
2721 pub span: Span,
2722 pub symbol: Symbol,
2723 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2724 pub suggestion: Span,
2725}
2726
2727#[derive(Diagnostic)]
2728pub(crate) enum InvalidMutInPattern {
2729 #[diag(parse_mut_on_nested_ident_pattern)]
2730 #[note(parse_note_mut_pattern_usage)]
2731 NestedIdent {
2732 #[primary_span]
2733 #[suggestion(code = "{pat}", applicability = "machine-applicable", style = "verbose")]
2734 span: Span,
2735 pat: String,
2736 },
2737 #[diag(parse_mut_on_non_ident_pattern)]
2738 #[note(parse_note_mut_pattern_usage)]
2739 NonIdent {
2740 #[primary_span]
2741 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2742 span: Span,
2743 },
2744}
2745
2746#[derive(Diagnostic)]
2747#[diag(parse_repeated_mut_in_pattern)]
2748pub(crate) struct RepeatedMutInPattern {
2749 #[primary_span]
2750 pub span: Span,
2751 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2752 pub suggestion: Span,
2753}
2754
2755#[derive(Diagnostic)]
2756#[diag(parse_dot_dot_dot_range_to_pattern_not_allowed)]
2757pub(crate) struct DotDotDotRangeToPatternNotAllowed {
2758 #[primary_span]
2759 #[suggestion(style = "verbose", code = "..=", applicability = "machine-applicable")]
2760 pub span: Span,
2761}
2762
2763#[derive(Diagnostic)]
2764#[diag(parse_enum_pattern_instead_of_identifier)]
2765pub(crate) struct EnumPatternInsteadOfIdentifier {
2766 #[primary_span]
2767 pub span: Span,
2768}
2769
2770#[derive(Diagnostic)]
2771#[diag(parse_at_dot_dot_in_struct_pattern)]
2772pub(crate) struct AtDotDotInStructPattern {
2773 #[primary_span]
2774 pub span: Span,
2775 #[suggestion(code = "", style = "verbose", applicability = "machine-applicable")]
2776 pub remove: Span,
2777 pub ident: Ident,
2778}
2779
2780#[derive(Diagnostic)]
2781#[diag(parse_at_in_struct_pattern)]
2782#[note]
2783#[help]
2784pub(crate) struct AtInStructPattern {
2785 #[primary_span]
2786 pub span: Span,
2787}
2788
2789#[derive(Diagnostic)]
2790#[diag(parse_dot_dot_dot_for_remaining_fields)]
2791pub(crate) struct DotDotDotForRemainingFields {
2792 #[primary_span]
2793 #[suggestion(code = "..", style = "verbose", applicability = "machine-applicable")]
2794 pub span: Span,
2795 pub token_str: Cow<'static, str>,
2796}
2797
2798#[derive(Diagnostic)]
2799#[diag(parse_expected_comma_after_pattern_field)]
2800pub(crate) struct ExpectedCommaAfterPatternField {
2801 #[primary_span]
2802 pub span: Span,
2803}
2804
2805#[derive(Diagnostic)]
2806#[diag(parse_unexpected_expr_in_pat)]
2807#[note]
2808pub(crate) struct UnexpectedExpressionInPattern {
2809 #[primary_span]
2811 #[label]
2812 pub span: Span,
2813 pub is_bound: bool,
2815 pub expr_precedence: ExprPrecedence,
2817}
2818
2819#[derive(Subdiagnostic)]
2820pub(crate) enum UnexpectedExpressionInPatternSugg {
2821 #[multipart_suggestion(
2822 parse_unexpected_expr_in_pat_create_guard_sugg,
2823 applicability = "maybe-incorrect"
2824 )]
2825 CreateGuard {
2826 #[suggestion_part(code = "{ident}")]
2828 ident_span: Span,
2829 #[suggestion_part(code = " if {ident} == {expr}")]
2831 pat_hi: Span,
2832 ident: String,
2834 expr: String,
2836 },
2837
2838 #[multipart_suggestion(
2839 parse_unexpected_expr_in_pat_update_guard_sugg,
2840 applicability = "maybe-incorrect"
2841 )]
2842 UpdateGuard {
2843 #[suggestion_part(code = "{ident}")]
2845 ident_span: Span,
2846 #[suggestion_part(code = "(")]
2848 guard_lo: Option<Span>,
2849 #[suggestion_part(code = "{guard_hi_paren} && {ident} == {expr}")]
2851 guard_hi: Span,
2852 guard_hi_paren: &'static str,
2854 ident: String,
2856 expr: String,
2858 },
2859
2860 #[multipart_suggestion(
2861 parse_unexpected_expr_in_pat_const_sugg,
2862 applicability = "has-placeholders"
2863 )]
2864 Const {
2865 #[suggestion_part(code = "{indentation}const {ident}: /* Type */ = {expr};\n")]
2867 stmt_lo: Span,
2868 #[suggestion_part(code = "{ident}")]
2870 ident_span: Span,
2871 ident: String,
2873 expr: String,
2875 indentation: String,
2877 },
2878}
2879
2880#[derive(Diagnostic)]
2881#[diag(parse_unexpected_paren_in_range_pat)]
2882pub(crate) struct UnexpectedParenInRangePat {
2883 #[primary_span]
2884 pub span: Vec<Span>,
2885 #[subdiagnostic]
2886 pub sugg: UnexpectedParenInRangePatSugg,
2887}
2888
2889#[derive(Subdiagnostic)]
2890#[multipart_suggestion(
2891 parse_unexpected_paren_in_range_pat_sugg,
2892 applicability = "machine-applicable"
2893)]
2894pub(crate) struct UnexpectedParenInRangePatSugg {
2895 #[suggestion_part(code = "")]
2896 pub start_span: Span,
2897 #[suggestion_part(code = "")]
2898 pub end_span: Span,
2899}
2900
2901#[derive(Diagnostic)]
2902#[diag(parse_return_types_use_thin_arrow)]
2903pub(crate) struct ReturnTypesUseThinArrow {
2904 #[primary_span]
2905 pub span: Span,
2906 #[suggestion(style = "verbose", code = " -> ", applicability = "machine-applicable")]
2907 pub suggestion: Span,
2908}
2909
2910#[derive(Diagnostic)]
2911#[diag(parse_need_plus_after_trait_object_lifetime)]
2912pub(crate) struct NeedPlusAfterTraitObjectLifetime {
2913 #[primary_span]
2914 pub span: Span,
2915 #[suggestion(code = " + /* Trait */", applicability = "has-placeholders")]
2916 pub suggestion: Span,
2917}
2918
2919#[derive(Diagnostic)]
2920#[diag(parse_expected_mut_or_const_in_raw_pointer_type)]
2921pub(crate) struct ExpectedMutOrConstInRawPointerType {
2922 #[primary_span]
2923 pub span: Span,
2924 #[suggestion(code("mut ", "const "), applicability = "has-placeholders", style = "verbose")]
2925 pub after_asterisk: Span,
2926}
2927
2928#[derive(Diagnostic)]
2929#[diag(parse_lifetime_after_mut)]
2930pub(crate) struct LifetimeAfterMut {
2931 #[primary_span]
2932 pub span: Span,
2933 #[suggestion(code = "&{snippet} mut", applicability = "maybe-incorrect", style = "verbose")]
2934 pub suggest_lifetime: Option<Span>,
2935 pub snippet: String,
2936}
2937
2938#[derive(Diagnostic)]
2939#[diag(parse_dyn_after_mut)]
2940pub(crate) struct DynAfterMut {
2941 #[primary_span]
2942 #[suggestion(code = "&mut dyn", applicability = "machine-applicable", style = "verbose")]
2943 pub span: Span,
2944}
2945
2946#[derive(Diagnostic)]
2947#[diag(parse_fn_pointer_cannot_be_const)]
2948#[note]
2949pub(crate) struct FnPointerCannotBeConst {
2950 #[primary_span]
2951 #[label]
2952 pub span: Span,
2953 #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
2954 pub suggestion: Span,
2955}
2956
2957#[derive(Diagnostic)]
2958#[diag(parse_fn_pointer_cannot_be_async)]
2959#[note]
2960pub(crate) struct FnPointerCannotBeAsync {
2961 #[primary_span]
2962 #[label]
2963 pub span: Span,
2964 #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
2965 pub suggestion: Span,
2966}
2967
2968#[derive(Diagnostic)]
2969#[diag(parse_nested_c_variadic_type, code = E0743)]
2970pub(crate) struct NestedCVariadicType {
2971 #[primary_span]
2972 pub span: Span,
2973}
2974
2975#[derive(Diagnostic)]
2976#[diag(parse_invalid_dyn_keyword)]
2977#[help]
2978pub(crate) struct InvalidDynKeyword {
2979 #[primary_span]
2980 pub span: Span,
2981 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
2982 pub suggestion: Span,
2983}
2984
2985#[derive(Subdiagnostic)]
2986pub(crate) enum HelpUseLatestEdition {
2987 #[help(parse_help_set_edition_cargo)]
2988 #[note(parse_note_edition_guide)]
2989 Cargo { edition: Edition },
2990 #[help(parse_help_set_edition_standalone)]
2991 #[note(parse_note_edition_guide)]
2992 Standalone { edition: Edition },
2993}
2994
2995impl HelpUseLatestEdition {
2996 pub(crate) fn new() -> Self {
2997 let edition = LATEST_STABLE_EDITION;
2998 if rustc_session::utils::was_invoked_from_cargo() {
2999 Self::Cargo { edition }
3000 } else {
3001 Self::Standalone { edition }
3002 }
3003 }
3004}
3005
3006#[derive(Diagnostic)]
3007#[diag(parse_box_syntax_removed)]
3008pub(crate) struct BoxSyntaxRemoved {
3009 #[primary_span]
3010 pub span: Span,
3011 #[subdiagnostic]
3012 pub sugg: AddBoxNew,
3013}
3014
3015#[derive(Subdiagnostic)]
3016#[multipart_suggestion(
3017 parse_box_syntax_removed_suggestion,
3018 applicability = "machine-applicable",
3019 style = "verbose"
3020)]
3021pub(crate) struct AddBoxNew {
3022 #[suggestion_part(code = "Box::new(")]
3023 pub box_kw_and_lo: Span,
3024 #[suggestion_part(code = ")")]
3025 pub hi: Span,
3026}
3027
3028#[derive(Diagnostic)]
3029#[diag(parse_bad_return_type_notation_output)]
3030pub(crate) struct BadReturnTypeNotationOutput {
3031 #[primary_span]
3032 pub span: Span,
3033 #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
3034 pub suggestion: Span,
3035}
3036
3037#[derive(Diagnostic)]
3038#[diag(parse_bad_assoc_type_bounds)]
3039pub(crate) struct BadAssocTypeBounds {
3040 #[primary_span]
3041 #[label]
3042 pub span: Span,
3043}
3044
3045#[derive(Diagnostic)]
3046#[diag(parse_attr_after_generic)]
3047pub(crate) struct AttrAfterGeneric {
3048 #[primary_span]
3049 #[label]
3050 pub span: Span,
3051}
3052
3053#[derive(Diagnostic)]
3054#[diag(parse_attr_without_generics)]
3055pub(crate) struct AttrWithoutGenerics {
3056 #[primary_span]
3057 #[label]
3058 pub span: Span,
3059}
3060
3061#[derive(Diagnostic)]
3062#[diag(parse_where_generics)]
3063pub(crate) struct WhereOnGenerics {
3064 #[primary_span]
3065 #[label]
3066 pub span: Span,
3067}
3068
3069#[derive(Diagnostic)]
3070#[diag(parse_generics_in_path)]
3071pub(crate) struct GenericsInPath {
3072 #[primary_span]
3073 pub span: Vec<Span>,
3074}
3075
3076#[derive(Diagnostic)]
3077#[diag(parse_lifetime_in_eq_constraint)]
3078#[help]
3079pub(crate) struct LifetimeInEqConstraint {
3080 #[primary_span]
3081 #[label]
3082 pub span: Span,
3083 pub lifetime: Ident,
3084 #[label(parse_context_label)]
3085 pub binding_label: Span,
3086 #[suggestion(
3087 parse_colon_sugg,
3088 style = "verbose",
3089 applicability = "maybe-incorrect",
3090 code = ": "
3091 )]
3092 pub colon_sugg: Span,
3093}
3094
3095#[derive(Diagnostic)]
3096#[diag(parse_modifier_lifetime)]
3097pub(crate) struct ModifierLifetime {
3098 #[primary_span]
3099 #[suggestion(style = "tool-only", applicability = "maybe-incorrect", code = "")]
3100 pub span: Span,
3101 pub modifier: &'static str,
3102}
3103
3104#[derive(Subdiagnostic)]
3105#[multipart_suggestion(
3106 parse_parenthesized_lifetime_suggestion,
3107 applicability = "machine-applicable"
3108)]
3109pub(crate) struct RemoveParens {
3110 #[suggestion_part(code = "")]
3111 pub lo: Span,
3112 #[suggestion_part(code = "")]
3113 pub hi: Span,
3114}
3115
3116#[derive(Diagnostic)]
3117#[diag(parse_parenthesized_lifetime)]
3118pub(crate) struct ParenthesizedLifetime {
3119 #[primary_span]
3120 pub span: Span,
3121 #[subdiagnostic]
3122 pub sugg: RemoveParens,
3123}
3124
3125#[derive(Diagnostic)]
3126#[diag(parse_underscore_literal_suffix)]
3127pub(crate) struct UnderscoreLiteralSuffix {
3128 #[primary_span]
3129 pub span: Span,
3130}
3131
3132#[derive(Diagnostic)]
3133#[diag(parse_expect_label_found_ident)]
3134pub(crate) struct ExpectedLabelFoundIdent {
3135 #[primary_span]
3136 pub span: Span,
3137 #[suggestion(code = "'", applicability = "machine-applicable", style = "verbose")]
3138 pub start: Span,
3139}
3140
3141#[derive(Diagnostic)]
3142#[diag(parse_inappropriate_default)]
3143#[note]
3144pub(crate) struct InappropriateDefault {
3145 #[primary_span]
3146 #[label]
3147 pub span: Span,
3148 pub article: &'static str,
3149 pub descr: &'static str,
3150}
3151
3152#[derive(Diagnostic)]
3153#[diag(parse_recover_import_as_use)]
3154pub(crate) struct RecoverImportAsUse {
3155 #[primary_span]
3156 #[suggestion(code = "use", applicability = "machine-applicable", style = "verbose")]
3157 pub span: Span,
3158 pub token_name: String,
3159}
3160
3161#[derive(Diagnostic)]
3162#[diag(parse_single_colon_import_path)]
3163#[note]
3164pub(crate) struct SingleColonImportPath {
3165 #[primary_span]
3166 #[suggestion(code = "::", applicability = "machine-applicable", style = "verbose")]
3167 pub span: Span,
3168}
3169
3170#[derive(Diagnostic)]
3171#[diag(parse_bad_item_kind)]
3172pub(crate) struct BadItemKind {
3173 #[primary_span]
3174 pub span: Span,
3175 pub descr: &'static str,
3176 pub ctx: &'static str,
3177 #[help]
3178 pub help: bool,
3179}
3180
3181#[derive(Diagnostic)]
3182#[diag(parse_macro_rules_missing_bang)]
3183pub(crate) struct MacroRulesMissingBang {
3184 #[primary_span]
3185 pub span: Span,
3186 #[suggestion(code = "!", applicability = "machine-applicable", style = "verbose")]
3187 pub hi: Span,
3188}
3189
3190#[derive(Diagnostic)]
3191#[diag(parse_macro_name_remove_bang)]
3192pub(crate) struct MacroNameRemoveBang {
3193 #[primary_span]
3194 #[suggestion(code = "", applicability = "machine-applicable", style = "short")]
3195 pub span: Span,
3196}
3197
3198#[derive(Diagnostic)]
3199#[diag(parse_macro_rules_visibility)]
3200pub(crate) struct MacroRulesVisibility<'a> {
3201 #[primary_span]
3202 #[suggestion(code = "#[macro_export]", applicability = "maybe-incorrect", style = "verbose")]
3203 pub span: Span,
3204 pub vis: &'a str,
3205}
3206
3207#[derive(Diagnostic)]
3208#[diag(parse_macro_invocation_visibility)]
3209#[help]
3210pub(crate) struct MacroInvocationVisibility<'a> {
3211 #[primary_span]
3212 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
3213 pub span: Span,
3214 pub vis: &'a str,
3215}
3216
3217#[derive(Diagnostic)]
3218#[diag(parse_nested_adt)]
3219pub(crate) struct NestedAdt<'a> {
3220 #[primary_span]
3221 pub span: Span,
3222 #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")]
3223 pub item: Span,
3224 pub keyword: &'a str,
3225 pub kw_str: Cow<'a, str>,
3226}
3227
3228#[derive(Diagnostic)]
3229#[diag(parse_function_body_equals_expr)]
3230pub(crate) struct FunctionBodyEqualsExpr {
3231 #[primary_span]
3232 pub span: Span,
3233 #[subdiagnostic]
3234 pub sugg: FunctionBodyEqualsExprSugg,
3235}
3236
3237#[derive(Subdiagnostic)]
3238#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
3239pub(crate) struct FunctionBodyEqualsExprSugg {
3240 #[suggestion_part(code = "{{")]
3241 pub eq: Span,
3242 #[suggestion_part(code = " }}")]
3243 pub semi: Span,
3244}
3245
3246#[derive(Diagnostic)]
3247#[diag(parse_box_not_pat)]
3248pub(crate) struct BoxNotPat {
3249 #[primary_span]
3250 pub span: Span,
3251 #[note]
3252 pub kw: Span,
3253 #[suggestion(code = "r#", applicability = "maybe-incorrect", style = "verbose")]
3254 pub lo: Span,
3255 pub descr: String,
3256}
3257
3258#[derive(Diagnostic)]
3259#[diag(parse_unmatched_angle)]
3260pub(crate) struct UnmatchedAngle {
3261 #[primary_span]
3262 #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
3263 pub span: Span,
3264 pub plural: bool,
3265}
3266
3267#[derive(Diagnostic)]
3268#[diag(parse_missing_plus_in_bounds)]
3269pub(crate) struct MissingPlusBounds {
3270 #[primary_span]
3271 pub span: Span,
3272 #[suggestion(code = " +", applicability = "maybe-incorrect", style = "verbose")]
3273 pub hi: Span,
3274 pub sym: Symbol,
3275}
3276
3277#[derive(Diagnostic)]
3278#[diag(parse_incorrect_parens_trait_bounds)]
3279pub(crate) struct IncorrectParensTraitBounds {
3280 #[primary_span]
3281 pub span: Vec<Span>,
3282 #[subdiagnostic]
3283 pub sugg: IncorrectParensTraitBoundsSugg,
3284}
3285
3286#[derive(Subdiagnostic)]
3287#[multipart_suggestion(
3288 parse_incorrect_parens_trait_bounds_sugg,
3289 applicability = "machine-applicable"
3290)]
3291pub(crate) struct IncorrectParensTraitBoundsSugg {
3292 #[suggestion_part(code = " ")]
3293 pub wrong_span: Span,
3294 #[suggestion_part(code = "(")]
3295 pub new_span: Span,
3296}
3297
3298#[derive(Diagnostic)]
3299#[diag(parse_kw_bad_case)]
3300pub(crate) struct KwBadCase<'a> {
3301 #[primary_span]
3302 #[suggestion(code = "{kw}", style = "verbose", applicability = "machine-applicable")]
3303 pub span: Span,
3304 pub kw: &'a str,
3305}
3306
3307#[derive(Diagnostic)]
3308#[diag(parse_meta_bad_delim)]
3309pub(crate) struct MetaBadDelim {
3310 #[primary_span]
3311 pub span: Span,
3312 #[subdiagnostic]
3313 pub sugg: MetaBadDelimSugg,
3314}
3315
3316#[derive(Diagnostic)]
3317#[diag(parse_cfg_attr_bad_delim)]
3318pub(crate) struct CfgAttrBadDelim {
3319 #[primary_span]
3320 pub span: Span,
3321 #[subdiagnostic]
3322 pub sugg: MetaBadDelimSugg,
3323}
3324
3325#[derive(Subdiagnostic)]
3326#[multipart_suggestion(parse_meta_bad_delim_suggestion, applicability = "machine-applicable")]
3327pub(crate) struct MetaBadDelimSugg {
3328 #[suggestion_part(code = "(")]
3329 pub open: Span,
3330 #[suggestion_part(code = ")")]
3331 pub close: Span,
3332}
3333
3334#[derive(Diagnostic)]
3335#[diag(parse_malformed_cfg_attr)]
3336#[note]
3337pub(crate) struct MalformedCfgAttr {
3338 #[primary_span]
3339 #[suggestion(style = "verbose", code = "{sugg}")]
3340 pub span: Span,
3341 pub sugg: &'static str,
3342}
3343
3344#[derive(Diagnostic)]
3345#[diag(parse_unknown_builtin_construct)]
3346pub(crate) struct UnknownBuiltinConstruct {
3347 #[primary_span]
3348 pub span: Span,
3349 pub name: Ident,
3350}
3351
3352#[derive(Diagnostic)]
3353#[diag(parse_expected_builtin_ident)]
3354pub(crate) struct ExpectedBuiltinIdent {
3355 #[primary_span]
3356 pub span: Span,
3357}
3358
3359#[derive(Diagnostic)]
3360#[diag(parse_static_with_generics)]
3361pub(crate) struct StaticWithGenerics {
3362 #[primary_span]
3363 pub span: Span,
3364}
3365
3366#[derive(Diagnostic)]
3367#[diag(parse_where_clause_before_const_body)]
3368pub(crate) struct WhereClauseBeforeConstBody {
3369 #[primary_span]
3370 #[label]
3371 pub span: Span,
3372 #[label(parse_name_label)]
3373 pub name: Span,
3374 #[label(parse_body_label)]
3375 pub body: Span,
3376 #[subdiagnostic]
3377 pub sugg: Option<WhereClauseBeforeConstBodySugg>,
3378}
3379
3380#[derive(Subdiagnostic)]
3381#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
3382pub(crate) struct WhereClauseBeforeConstBodySugg {
3383 #[suggestion_part(code = "= {snippet} ")]
3384 pub left: Span,
3385 pub snippet: String,
3386 #[suggestion_part(code = "")]
3387 pub right: Span,
3388}
3389
3390#[derive(Diagnostic)]
3391#[diag(parse_generic_args_in_pat_require_turbofish_syntax)]
3392pub(crate) struct GenericArgsInPatRequireTurbofishSyntax {
3393 #[primary_span]
3394 pub span: Span,
3395 #[suggestion(
3396 parse_sugg_turbofish_syntax,
3397 style = "verbose",
3398 code = "::",
3399 applicability = "maybe-incorrect"
3400 )]
3401 pub suggest_turbofish: Span,
3402}
3403
3404#[derive(Diagnostic)]
3405#[diag(parse_transpose_dyn_or_impl)]
3406pub(crate) struct TransposeDynOrImpl<'a> {
3407 #[primary_span]
3408 pub span: Span,
3409 pub kw: &'a str,
3410 #[subdiagnostic]
3411 pub sugg: TransposeDynOrImplSugg<'a>,
3412}
3413
3414#[derive(Subdiagnostic)]
3415#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
3416pub(crate) struct TransposeDynOrImplSugg<'a> {
3417 #[suggestion_part(code = "")]
3418 pub removal_span: Span,
3419 #[suggestion_part(code = "{kw} ")]
3420 pub insertion_span: Span,
3421 pub kw: &'a str,
3422}
3423
3424#[derive(Diagnostic)]
3425#[diag(parse_array_index_offset_of)]
3426pub(crate) struct ArrayIndexInOffsetOf(#[primary_span] pub Span);
3427
3428#[derive(Diagnostic)]
3429#[diag(parse_invalid_offset_of)]
3430pub(crate) struct InvalidOffsetOf(#[primary_span] pub Span);
3431
3432#[derive(Diagnostic)]
3433#[diag(parse_async_impl)]
3434pub(crate) struct AsyncImpl {
3435 #[primary_span]
3436 pub span: Span,
3437}
3438
3439#[derive(Diagnostic)]
3440#[diag(parse_expr_rarrow_call)]
3441#[help]
3442pub(crate) struct ExprRArrowCall {
3443 #[primary_span]
3444 #[suggestion(style = "verbose", applicability = "machine-applicable", code = ".")]
3445 pub span: Span,
3446}
3447
3448#[derive(Diagnostic)]
3449#[diag(parse_dot_dot_range_attribute)]
3450pub(crate) struct DotDotRangeAttribute {
3451 #[primary_span]
3452 pub span: Span,
3453}
3454
3455#[derive(Diagnostic)]
3456#[diag(parse_invalid_attr_unsafe)]
3457#[note]
3458pub(crate) struct InvalidAttrUnsafe {
3459 #[primary_span]
3460 #[label]
3461 pub span: Span,
3462 pub name: Path,
3463}
3464
3465#[derive(Diagnostic)]
3466#[diag(parse_unsafe_attr_outside_unsafe)]
3467pub(crate) struct UnsafeAttrOutsideUnsafe {
3468 #[primary_span]
3469 #[label]
3470 pub span: Span,
3471 #[subdiagnostic]
3472 pub suggestion: UnsafeAttrOutsideUnsafeSuggestion,
3473}
3474
3475#[derive(Subdiagnostic)]
3476#[multipart_suggestion(
3477 parse_unsafe_attr_outside_unsafe_suggestion,
3478 applicability = "machine-applicable"
3479)]
3480pub(crate) struct UnsafeAttrOutsideUnsafeSuggestion {
3481 #[suggestion_part(code = "unsafe(")]
3482 pub left: Span,
3483 #[suggestion_part(code = ")")]
3484 pub right: Span,
3485}
3486
3487#[derive(Diagnostic)]
3488#[diag(parse_binder_before_modifiers)]
3489pub(crate) struct BinderBeforeModifiers {
3490 #[primary_span]
3491 pub binder_span: Span,
3492 #[label]
3493 pub modifiers_span: Span,
3494}
3495
3496#[derive(Diagnostic)]
3497#[diag(parse_binder_and_polarity)]
3498pub(crate) struct BinderAndPolarity {
3499 #[primary_span]
3500 pub polarity_span: Span,
3501 #[label]
3502 pub binder_span: Span,
3503 pub polarity: &'static str,
3504}
3505
3506#[derive(Diagnostic)]
3507#[diag(parse_modifiers_and_polarity)]
3508pub(crate) struct PolarityAndModifiers {
3509 #[primary_span]
3510 pub polarity_span: Span,
3511 #[label]
3512 pub modifiers_span: Span,
3513 pub polarity: &'static str,
3514 pub modifiers_concatenated: String,
3515}
3516
3517#[derive(Diagnostic)]
3518#[diag(parse_incorrect_type_on_self)]
3519pub(crate) struct IncorrectTypeOnSelf {
3520 #[primary_span]
3521 pub span: Span,
3522 #[subdiagnostic]
3523 pub move_self_modifier: MoveSelfModifier,
3524}
3525
3526#[derive(Subdiagnostic)]
3527#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
3528pub(crate) struct MoveSelfModifier {
3529 #[suggestion_part(code = "")]
3530 pub removal_span: Span,
3531 #[suggestion_part(code = "{modifier}")]
3532 pub insertion_span: Span,
3533 pub modifier: String,
3534}
3535
3536#[derive(Diagnostic)]
3537#[diag(parse_asm_unsupported_operand)]
3538pub(crate) struct AsmUnsupportedOperand<'a> {
3539 #[primary_span]
3540 #[label]
3541 pub(crate) span: Span,
3542 pub(crate) symbol: &'a str,
3543 pub(crate) macro_name: &'static str,
3544}
3545
3546#[derive(Diagnostic)]
3547#[diag(parse_asm_underscore_input)]
3548pub(crate) struct AsmUnderscoreInput {
3549 #[primary_span]
3550 pub(crate) span: Span,
3551}
3552
3553#[derive(Diagnostic)]
3554#[diag(parse_asm_sym_no_path)]
3555pub(crate) struct AsmSymNoPath {
3556 #[primary_span]
3557 pub(crate) span: Span,
3558}
3559
3560#[derive(Diagnostic)]
3561#[diag(parse_asm_requires_template)]
3562pub(crate) struct AsmRequiresTemplate {
3563 #[primary_span]
3564 pub(crate) span: Span,
3565}
3566
3567#[derive(Diagnostic)]
3568#[diag(parse_asm_expected_comma)]
3569pub(crate) struct AsmExpectedComma {
3570 #[primary_span]
3571 #[label]
3572 pub(crate) span: Span,
3573}
3574
3575#[derive(Diagnostic)]
3576#[diag(parse_asm_expected_other)]
3577pub(crate) struct AsmExpectedOther {
3578 #[primary_span]
3579 #[label(parse_asm_expected_other)]
3580 pub(crate) span: Span,
3581 pub(crate) is_inline_asm: bool,
3582}
3583
3584#[derive(Diagnostic)]
3585#[diag(parse_asm_non_abi)]
3586pub(crate) struct NonABI {
3587 #[primary_span]
3588 pub(crate) span: Span,
3589}
3590
3591#[derive(Diagnostic)]
3592#[diag(parse_asm_expected_string_literal)]
3593pub(crate) struct AsmExpectedStringLiteral {
3594 #[primary_span]
3595 #[label]
3596 pub(crate) span: Span,
3597}
3598
3599#[derive(Diagnostic)]
3600#[diag(parse_asm_expected_register_class_or_explicit_register)]
3601pub(crate) struct ExpectedRegisterClassOrExplicitRegister {
3602 #[primary_span]
3603 pub(crate) span: Span,
3604}