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