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