| // ignore-tidy-filelength | |
| use std::borrow::Cow; | |
| use std::path::PathBuf; | |
| use rustc_ast::token::Token; | |
| use rustc_ast::util::parser::ExprPrecedence; | |
| use rustc_ast::{Path, Visibility}; | |
| use rustc_errors::codes::*; | |
| use rustc_errors::{ | |
| Applicability, Diag, DiagArgValue, DiagCtxtHandle, Diagnostic, EmissionGuarantee, IntoDiagArg, | |
| Level, Subdiagnostic, SuggestionStyle, | |
| }; | |
| use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic}; | |
| use rustc_session::errors::ExprParenthesesNeeded; | |
| use rustc_span::edition::{Edition, LATEST_STABLE_EDITION}; | |
| use rustc_span::{Ident, Span, Symbol}; | |
| use crate::fluent_generated as fluent; | |
| use crate::parser::{ForbiddenLetReason, TokenDescription}; | |
| #[derive(Diagnostic)] | |
| #[diag(parse_maybe_report_ambiguous_plus)] | |
| pub(crate) struct AmbiguousPlus { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub suggestion: AddParen, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_maybe_recover_from_bad_type_plus, code = E0178)] | |
| pub(crate) struct BadTypePlus { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sub: BadTypePlusSub, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_add_paren, applicability = "machine-applicable")] | |
| pub(crate) struct AddParen { | |
| #[suggestion_part(code = "(")] | |
| pub lo: Span, | |
| #[suggestion_part(code = ")")] | |
| pub hi: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum BadTypePlusSub { | |
| AddParen { | |
| #[subdiagnostic] | |
| suggestion: AddParen, | |
| }, | |
| #[label(parse_forgot_paren)] | |
| ForgotParen { | |
| #[primary_span] | |
| span: Span, | |
| }, | |
| #[label(parse_expect_path)] | |
| ExpectPath { | |
| #[primary_span] | |
| span: Span, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_maybe_recover_from_bad_qpath_stage_2)] | |
| pub(crate) struct BadQPathStage2 { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub wrap: WrapType, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_trait_impl_modifier_in_inherent_impl)] | |
| #[note] | |
| pub(crate) struct TraitImplModifierInInherentImpl { | |
| #[primary_span] | |
| pub span: Span, | |
| pub modifier: &'static str, | |
| pub modifier_name: &'static str, | |
| #[label(parse_because)] | |
| pub modifier_span: Span, | |
| #[label(parse_type)] | |
| pub self_ty: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct WrapType { | |
| #[suggestion_part(code = "<")] | |
| pub lo: Span, | |
| #[suggestion_part(code = ">")] | |
| pub hi: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_incorrect_semicolon)] | |
| pub(crate) struct IncorrectSemicolon<'a> { | |
| #[primary_span] | |
| #[suggestion(style = "verbose", code = "", applicability = "machine-applicable")] | |
| pub span: Span, | |
| #[help] | |
| pub show_help: bool, | |
| pub name: &'a str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_incorrect_use_of_await)] | |
| pub(crate) struct IncorrectUseOfAwait { | |
| #[primary_span] | |
| #[suggestion( | |
| parse_parentheses_suggestion, | |
| style = "verbose", | |
| code = "", | |
| applicability = "machine-applicable" | |
| )] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_incorrect_use_of_use)] | |
| pub(crate) struct IncorrectUseOfUse { | |
| #[primary_span] | |
| #[suggestion( | |
| parse_parentheses_suggestion, | |
| style = "verbose", | |
| code = "", | |
| applicability = "machine-applicable" | |
| )] | |
| pub span: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion( | |
| parse_incorrect_use_of_await_postfix_suggestion, | |
| applicability = "machine-applicable" | |
| )] | |
| pub(crate) struct AwaitSuggestion { | |
| #[suggestion_part(code = "")] | |
| pub removal: Span, | |
| #[suggestion_part(code = ".await{question_mark}")] | |
| pub dot_await: Span, | |
| pub question_mark: &'static str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_incorrect_use_of_await)] | |
| pub(crate) struct IncorrectAwait { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub suggestion: AwaitSuggestion, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_in_in_typo)] | |
| pub(crate) struct InInTypo { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "", style = "verbose", applicability = "machine-applicable")] | |
| pub sugg_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_variable_declaration)] | |
| pub(crate) struct InvalidVariableDeclaration { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sub: InvalidVariableDeclarationSub, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum InvalidVariableDeclarationSub { | |
| #[suggestion( | |
| parse_switch_mut_let_order, | |
| style = "verbose", | |
| applicability = "maybe-incorrect", | |
| code = "let mut" | |
| )] | |
| SwitchMutLetOrder(#[primary_span] Span), | |
| #[suggestion( | |
| parse_missing_let_before_mut, | |
| applicability = "machine-applicable", | |
| style = "verbose", | |
| code = "let mut" | |
| )] | |
| MissingLet(#[primary_span] Span), | |
| #[suggestion( | |
| parse_use_let_not_auto, | |
| style = "verbose", | |
| applicability = "machine-applicable", | |
| code = "let" | |
| )] | |
| UseLetNotAuto(#[primary_span] Span), | |
| #[suggestion( | |
| parse_use_let_not_var, | |
| style = "verbose", | |
| applicability = "machine-applicable", | |
| code = "let" | |
| )] | |
| UseLetNotVar(#[primary_span] Span), | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_switch_ref_box_order)] | |
| pub(crate) struct SwitchRefBoxOrder { | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", style = "verbose", code = "box ref")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_comparison_operator)] | |
| pub(crate) struct InvalidComparisonOperator { | |
| #[primary_span] | |
| pub span: Span, | |
| pub invalid: String, | |
| #[subdiagnostic] | |
| pub sub: InvalidComparisonOperatorSub, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum InvalidComparisonOperatorSub { | |
| #[suggestion( | |
| parse_use_instead, | |
| style = "verbose", | |
| applicability = "machine-applicable", | |
| code = "{correct}" | |
| )] | |
| Correctable { | |
| #[primary_span] | |
| span: Span, | |
| invalid: String, | |
| correct: String, | |
| }, | |
| #[label(parse_spaceship_operator_invalid)] | |
| Spaceship(#[primary_span] Span), | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_logical_operator)] | |
| #[note] | |
| pub(crate) struct InvalidLogicalOperator { | |
| #[primary_span] | |
| pub span: Span, | |
| pub incorrect: String, | |
| #[subdiagnostic] | |
| pub sub: InvalidLogicalOperatorSub, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum InvalidLogicalOperatorSub { | |
| #[suggestion( | |
| parse_use_amp_amp_for_conjunction, | |
| style = "verbose", | |
| applicability = "machine-applicable", | |
| code = "&&" | |
| )] | |
| Conjunction(#[primary_span] Span), | |
| #[suggestion( | |
| parse_use_pipe_pipe_for_disjunction, | |
| style = "verbose", | |
| applicability = "machine-applicable", | |
| code = "||" | |
| )] | |
| Disjunction(#[primary_span] Span), | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_tilde_is_not_unary_operator)] | |
| pub(crate) struct TildeAsUnaryOperator( | |
| #[primary_span] | |
| #[suggestion(style = "verbose", applicability = "machine-applicable", code = "!")] | |
| pub Span, | |
| ); | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_token_after_not)] | |
| pub(crate) struct NotAsNegationOperator { | |
| #[primary_span] | |
| pub negated: Span, | |
| pub negated_desc: String, | |
| #[subdiagnostic] | |
| pub sub: NotAsNegationOperatorSub, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum NotAsNegationOperatorSub { | |
| #[suggestion( | |
| parse_unexpected_token_after_not_default, | |
| style = "verbose", | |
| applicability = "machine-applicable", | |
| code = "!" | |
| )] | |
| SuggestNotDefault(#[primary_span] Span), | |
| #[suggestion( | |
| parse_unexpected_token_after_not_bitwise, | |
| style = "verbose", | |
| applicability = "machine-applicable", | |
| code = "!" | |
| )] | |
| SuggestNotBitwise(#[primary_span] Span), | |
| #[suggestion( | |
| parse_unexpected_token_after_not_logical, | |
| style = "verbose", | |
| applicability = "machine-applicable", | |
| code = "!" | |
| )] | |
| SuggestNotLogical(#[primary_span] Span), | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_malformed_loop_label)] | |
| pub(crate) struct MalformedLoopLabel { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(applicability = "machine-applicable", code = "'", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_lifetime_in_borrow_expression)] | |
| pub(crate) struct LifetimeInBorrowExpression { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")] | |
| #[label] | |
| pub lifetime_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_field_expression_with_generic)] | |
| pub(crate) struct FieldExpressionWithGeneric(#[primary_span] pub Span); | |
| #[derive(Diagnostic)] | |
| #[diag(parse_macro_invocation_with_qualified_path)] | |
| pub(crate) struct MacroInvocationWithQualifiedPath(#[primary_span] pub Span); | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_token_after_label)] | |
| pub(crate) struct UnexpectedTokenAfterLabel { | |
| #[primary_span] | |
| #[label(parse_unexpected_token_after_label)] | |
| pub span: Span, | |
| #[suggestion(parse_suggestion_remove_label, style = "verbose", code = "")] | |
| pub remove_label: Option<Span>, | |
| #[subdiagnostic] | |
| pub enclose_in_block: Option<UnexpectedTokenAfterLabelSugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion_enclose_in_block, applicability = "machine-applicable")] | |
| pub(crate) struct UnexpectedTokenAfterLabelSugg { | |
| #[suggestion_part(code = "{{ ")] | |
| pub left: Span, | |
| #[suggestion_part(code = " }}")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_require_colon_after_labeled_expression)] | |
| #[note] | |
| pub(crate) struct RequireColonAfterLabeledExpression { | |
| #[primary_span] | |
| pub span: Span, | |
| #[label] | |
| pub label: Span, | |
| #[suggestion(style = "verbose", applicability = "machine-applicable", code = ": ")] | |
| pub label_end: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_do_catch_syntax_removed)] | |
| #[note] | |
| pub(crate) struct DoCatchSyntaxRemoved { | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", code = "try", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_float_literal_requires_integer_part)] | |
| pub(crate) struct FloatLiteralRequiresIntegerPart { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(applicability = "machine-applicable", code = "0", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_semicolon_before_array)] | |
| pub(crate) struct MissingSemicolonBeforeArray { | |
| #[primary_span] | |
| pub open_delim: Span, | |
| #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = ";")] | |
| pub semicolon: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expect_dotdot_not_dotdotdot)] | |
| pub(crate) struct MissingDotDot { | |
| #[primary_span] | |
| pub token_span: Span, | |
| #[suggestion(applicability = "maybe-incorrect", code = "..", style = "verbose")] | |
| pub sugg_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_block_macro_segment)] | |
| pub(crate) struct InvalidBlockMacroSegment { | |
| #[primary_span] | |
| pub span: Span, | |
| #[label] | |
| pub context: Span, | |
| #[subdiagnostic] | |
| pub wrap: WrapInExplicitBlock, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct WrapInExplicitBlock { | |
| #[suggestion_part(code = "{{ ")] | |
| pub lo: Span, | |
| #[suggestion_part(code = " }}")] | |
| pub hi: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_if_expression_missing_then_block)] | |
| pub(crate) struct IfExpressionMissingThenBlock { | |
| #[primary_span] | |
| pub if_span: Span, | |
| #[subdiagnostic] | |
| pub missing_then_block_sub: IfExpressionMissingThenBlockSub, | |
| #[subdiagnostic] | |
| pub let_else_sub: Option<IfExpressionLetSomeSub>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum IfExpressionMissingThenBlockSub { | |
| #[help(parse_condition_possibly_unfinished)] | |
| UnfinishedCondition(#[primary_span] Span), | |
| #[help(parse_add_then_block)] | |
| AddThenBlock(#[primary_span] Span), | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_ternary_operator)] | |
| pub(crate) struct TernaryOperator { | |
| #[primary_span] | |
| pub span: Span, | |
| /// If we have a span for the condition expression, suggest the if/else | |
| #[subdiagnostic] | |
| pub sugg: Option<TernaryOperatorSuggestion>, | |
| /// Otherwise, just print the suggestion message | |
| #[help(parse_use_if_else)] | |
| pub no_sugg: bool, | |
| } | |
| #[derive(Subdiagnostic, Copy, Clone)] | |
| #[multipart_suggestion(parse_use_if_else, applicability = "maybe-incorrect", style = "verbose")] | |
| pub(crate) struct TernaryOperatorSuggestion { | |
| #[suggestion_part(code = "if ")] | |
| pub before_cond: Span, | |
| #[suggestion_part(code = "{{")] | |
| pub question: Span, | |
| #[suggestion_part(code = "}} else {{")] | |
| pub colon: Span, | |
| #[suggestion_part(code = " }}")] | |
| pub end: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[suggestion( | |
| parse_extra_if_in_let_else, | |
| applicability = "maybe-incorrect", | |
| code = "", | |
| style = "verbose" | |
| )] | |
| pub(crate) struct IfExpressionLetSomeSub { | |
| #[primary_span] | |
| pub if_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_if_expression_missing_condition)] | |
| pub(crate) struct IfExpressionMissingCondition { | |
| #[primary_span] | |
| #[label(parse_condition_label)] | |
| pub if_span: Span, | |
| #[label(parse_block_label)] | |
| pub block_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_expression_found_let)] | |
| #[note] | |
| pub(crate) struct ExpectedExpressionFoundLet { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub reason: ForbiddenLetReason, | |
| #[subdiagnostic] | |
| pub missing_let: Option<MaybeMissingLet>, | |
| #[subdiagnostic] | |
| pub comparison: Option<MaybeComparison>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_or_in_let_chain)] | |
| pub(crate) struct OrInLetChain { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Subdiagnostic, Clone, Copy)] | |
| #[multipart_suggestion( | |
| parse_maybe_missing_let, | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| pub(crate) struct MaybeMissingLet { | |
| #[suggestion_part(code = "let ")] | |
| pub span: Span, | |
| } | |
| #[derive(Subdiagnostic, Clone, Copy)] | |
| #[multipart_suggestion( | |
| parse_maybe_comparison, | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| pub(crate) struct MaybeComparison { | |
| #[suggestion_part(code = "=")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expect_eq_instead_of_eqeq)] | |
| pub(crate) struct ExpectedEqForLetExpr { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(applicability = "maybe-incorrect", code = "=", style = "verbose")] | |
| pub sugg_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_else_block)] | |
| pub(crate) struct ExpectedElseBlock { | |
| #[primary_span] | |
| pub first_tok_span: Span, | |
| pub first_tok: String, | |
| #[label] | |
| pub else_span: Span, | |
| #[suggestion(applicability = "maybe-incorrect", code = "if ", style = "verbose")] | |
| pub condition_start: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_struct_field)] | |
| pub(crate) struct ExpectedStructField { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| pub token: Token, | |
| #[label(parse_ident_label)] | |
| pub ident_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_outer_attribute_not_allowed_on_if_else)] | |
| pub(crate) struct OuterAttributeNotAllowedOnIfElse { | |
| #[primary_span] | |
| pub last: Span, | |
| #[label(parse_branch_label)] | |
| pub branch_span: Span, | |
| #[label(parse_ctx_label)] | |
| pub ctx_span: Span, | |
| pub ctx: String, | |
| #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")] | |
| pub attributes: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_in_in_for_loop)] | |
| pub(crate) struct MissingInInForLoop { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sub: MissingInInForLoopSub, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum MissingInInForLoopSub { | |
| // User wrote `for pat of expr {}` | |
| // Has been misleading, at least in the past (closed Issue #48492), thus maybe-incorrect | |
| #[suggestion(parse_use_in, style = "verbose", applicability = "maybe-incorrect", code = "in")] | |
| InNotOf(#[primary_span] Span), | |
| // User wrote `for pat = expr {}` | |
| #[suggestion(parse_use_in, style = "verbose", applicability = "maybe-incorrect", code = "in")] | |
| InNotEq(#[primary_span] Span), | |
| #[suggestion(parse_add_in, style = "verbose", applicability = "maybe-incorrect", code = " in ")] | |
| AddIn(#[primary_span] Span), | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_expression_in_for_loop)] | |
| pub(crate) struct MissingExpressionInForLoop { | |
| #[primary_span] | |
| #[suggestion( | |
| code = "/* expression */ ", | |
| applicability = "has-placeholders", | |
| style = "verbose" | |
| )] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_loop_else)] | |
| #[note] | |
| pub(crate) struct LoopElseNotSupported { | |
| #[primary_span] | |
| pub span: Span, | |
| pub loop_kind: &'static str, | |
| #[label(parse_loop_keyword)] | |
| pub loop_kw: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_comma_after_match_arm)] | |
| pub(crate) struct MissingCommaAfterMatchArm { | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", code = ",", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_catch_after_try)] | |
| #[help] | |
| pub(crate) struct CatchAfterTry { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_comma_after_base_struct)] | |
| #[note] | |
| pub(crate) struct CommaAfterBaseStruct { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(style = "verbose", applicability = "machine-applicable", code = "")] | |
| pub comma: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_eq_field_init)] | |
| pub(crate) struct EqFieldInit { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(applicability = "machine-applicable", code = ":", style = "verbose")] | |
| pub eq: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_dotdotdot)] | |
| pub(crate) struct DotDotDot { | |
| #[primary_span] | |
| #[suggestion( | |
| parse_suggest_exclusive_range, | |
| applicability = "maybe-incorrect", | |
| code = "..", | |
| style = "verbose" | |
| )] | |
| #[suggestion( | |
| parse_suggest_inclusive_range, | |
| applicability = "maybe-incorrect", | |
| code = "..=", | |
| style = "verbose" | |
| )] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_left_arrow_operator)] | |
| pub(crate) struct LeftArrowOperator { | |
| #[primary_span] | |
| #[suggestion(applicability = "maybe-incorrect", code = "< -", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_remove_let)] | |
| pub(crate) struct RemoveLet { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(applicability = "machine-applicable", code = "", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_use_eq_instead)] | |
| pub(crate) struct UseEqInstead { | |
| #[primary_span] | |
| #[suggestion(style = "verbose", applicability = "machine-applicable", code = "=")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_use_empty_block_not_semi)] | |
| pub(crate) struct UseEmptyBlockNotSemi { | |
| #[primary_span] | |
| #[suggestion(style = "hidden", applicability = "machine-applicable", code = "{{}}")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_comparison_interpreted_as_generic)] | |
| pub(crate) struct ComparisonInterpretedAsGeneric { | |
| #[primary_span] | |
| #[label(parse_label_comparison)] | |
| pub comparison: Span, | |
| pub r#type: Path, | |
| #[label(parse_label_args)] | |
| pub args: Span, | |
| #[subdiagnostic] | |
| pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_shift_interpreted_as_generic)] | |
| pub(crate) struct ShiftInterpretedAsGeneric { | |
| #[primary_span] | |
| #[label(parse_label_comparison)] | |
| pub shift: Span, | |
| pub r#type: Path, | |
| #[label(parse_label_args)] | |
| pub args: Span, | |
| #[subdiagnostic] | |
| pub suggestion: ComparisonOrShiftInterpretedAsGenericSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct ComparisonOrShiftInterpretedAsGenericSugg { | |
| #[suggestion_part(code = "(")] | |
| pub left: Span, | |
| #[suggestion_part(code = ")")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_found_expr_would_be_stmt)] | |
| pub(crate) struct FoundExprWouldBeStmt { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| pub token: Token, | |
| #[subdiagnostic] | |
| pub suggestion: ExprParenthesesNeeded, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_frontmatter_extra_characters_after_close)] | |
| pub(crate) struct FrontmatterExtraCharactersAfterClose { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_frontmatter_invalid_infostring)] | |
| #[note] | |
| pub(crate) struct FrontmatterInvalidInfostring { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_frontmatter_invalid_opening_preceding_whitespace)] | |
| pub(crate) struct FrontmatterInvalidOpeningPrecedingWhitespace { | |
| #[primary_span] | |
| pub span: Span, | |
| #[note] | |
| pub note_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_frontmatter_unclosed)] | |
| pub(crate) struct FrontmatterUnclosed { | |
| #[primary_span] | |
| pub span: Span, | |
| #[note] | |
| pub note_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_frontmatter_invalid_close_preceding_whitespace)] | |
| pub(crate) struct FrontmatterInvalidClosingPrecedingWhitespace { | |
| #[primary_span] | |
| pub span: Span, | |
| #[note] | |
| pub note_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_frontmatter_length_mismatch)] | |
| pub(crate) struct FrontmatterLengthMismatch { | |
| #[primary_span] | |
| pub span: Span, | |
| #[label(parse_label_opening)] | |
| pub opening: Span, | |
| #[label(parse_label_close)] | |
| pub close: Span, | |
| pub len_opening: usize, | |
| pub len_close: usize, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_frontmatter_too_many_dashes)] | |
| pub(crate) struct FrontmatterTooManyDashes { | |
| pub len_opening: usize, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_leading_plus_not_supported)] | |
| pub(crate) struct LeadingPlusNotSupported { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[suggestion( | |
| parse_suggestion_remove_plus, | |
| style = "verbose", | |
| code = "", | |
| applicability = "machine-applicable" | |
| )] | |
| pub remove_plus: Option<Span>, | |
| #[subdiagnostic] | |
| pub add_parentheses: Option<ExprParenthesesNeeded>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_parentheses_with_struct_fields)] | |
| pub(crate) struct ParenthesesWithStructFields { | |
| #[primary_span] | |
| pub span: Span, | |
| pub r#type: Path, | |
| #[subdiagnostic] | |
| pub braces_for_struct: BracesForStructLiteral, | |
| #[subdiagnostic] | |
| pub no_fields_for_fn: NoFieldsForFnCall, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion_braces_for_struct, applicability = "maybe-incorrect")] | |
| pub(crate) struct BracesForStructLiteral { | |
| #[suggestion_part(code = " {{ ")] | |
| pub first: Span, | |
| #[suggestion_part(code = " }}")] | |
| pub second: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion_no_fields_for_fn, applicability = "maybe-incorrect")] | |
| pub(crate) struct NoFieldsForFnCall { | |
| #[suggestion_part(code = "")] | |
| pub fields: Vec<Span>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_labeled_loop_in_break)] | |
| pub(crate) struct LabeledLoopInBreak { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sub: WrapInParentheses, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum WrapInParentheses { | |
| #[multipart_suggestion( | |
| parse_sugg_wrap_expression_in_parentheses, | |
| applicability = "machine-applicable" | |
| )] | |
| Expression { | |
| #[suggestion_part(code = "(")] | |
| left: Span, | |
| #[suggestion_part(code = ")")] | |
| right: Span, | |
| }, | |
| #[multipart_suggestion( | |
| parse_sugg_wrap_macro_in_parentheses, | |
| applicability = "machine-applicable" | |
| )] | |
| MacroArgs { | |
| #[suggestion_part(code = "(")] | |
| left: Span, | |
| #[suggestion_part(code = ")")] | |
| right: Span, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_array_brackets_instead_of_braces)] | |
| pub(crate) struct ArrayBracketsInsteadOfBraces { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sub: ArrayBracketsInsteadOfBracesSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "maybe-incorrect")] | |
| pub(crate) struct ArrayBracketsInsteadOfBracesSugg { | |
| #[suggestion_part(code = "[")] | |
| pub left: Span, | |
| #[suggestion_part(code = "]")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_match_arm_body_without_braces)] | |
| pub(crate) struct MatchArmBodyWithoutBraces { | |
| #[primary_span] | |
| #[label(parse_label_statements)] | |
| pub statements: Span, | |
| #[label(parse_label_arrow)] | |
| pub arrow: Span, | |
| pub num_statements: usize, | |
| #[subdiagnostic] | |
| pub sub: MatchArmBodyWithoutBracesSugg, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_inclusive_range_extra_equals)] | |
| #[note] | |
| pub(crate) struct InclusiveRangeExtraEquals { | |
| #[primary_span] | |
| #[suggestion( | |
| parse_suggestion_remove_eq, | |
| style = "verbose", | |
| code = "..=", | |
| applicability = "maybe-incorrect" | |
| )] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_inclusive_range_match_arrow)] | |
| pub(crate) struct InclusiveRangeMatchArrow { | |
| #[primary_span] | |
| pub arrow: Span, | |
| #[label] | |
| pub span: Span, | |
| #[suggestion(style = "verbose", code = " ", applicability = "machine-applicable")] | |
| pub after_pat: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_inclusive_range_no_end, code = E0586)] | |
| #[note] | |
| pub(crate) struct InclusiveRangeNoEnd { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion( | |
| parse_suggestion_open_range, | |
| code = "", | |
| applicability = "machine-applicable", | |
| style = "verbose" | |
| )] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum MatchArmBodyWithoutBracesSugg { | |
| #[multipart_suggestion(parse_suggestion_add_braces, applicability = "machine-applicable")] | |
| AddBraces { | |
| #[suggestion_part(code = "{{ ")] | |
| left: Span, | |
| #[suggestion_part(code = " }}")] | |
| right: Span, | |
| }, | |
| #[suggestion( | |
| parse_suggestion_use_comma_not_semicolon, | |
| code = ",", | |
| applicability = "machine-applicable", | |
| style = "verbose" | |
| )] | |
| UseComma { | |
| #[primary_span] | |
| semicolon: Span, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_struct_literal_not_allowed_here)] | |
| pub(crate) struct StructLiteralNotAllowedHere { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sub: StructLiteralNotAllowedHereSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct StructLiteralNotAllowedHereSugg { | |
| #[suggestion_part(code = "(")] | |
| pub left: Span, | |
| #[suggestion_part(code = ")")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_literal_suffix_on_tuple_index)] | |
| pub(crate) struct InvalidLiteralSuffixOnTupleIndex { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| pub suffix: Symbol, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_non_string_abi_literal)] | |
| pub(crate) struct NonStringAbiLiteral { | |
| #[primary_span] | |
| #[suggestion(code = "\"C\"", applicability = "maybe-incorrect", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_mismatched_closing_delimiter)] | |
| pub(crate) struct MismatchedClosingDelimiter { | |
| #[primary_span] | |
| pub spans: Vec<Span>, | |
| pub delimiter: String, | |
| #[label(parse_label_unmatched)] | |
| pub unmatched: Span, | |
| #[label(parse_label_opening_candidate)] | |
| pub opening_candidate: Option<Span>, | |
| #[label(parse_label_unclosed)] | |
| pub unclosed: Option<Span>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_incorrect_visibility_restriction, code = E0704)] | |
| #[help] | |
| pub(crate) struct IncorrectVisibilityRestriction { | |
| #[primary_span] | |
| #[suggestion(code = "in {inner_str}", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| pub inner_str: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_assignment_else_not_allowed)] | |
| pub(crate) struct AssignmentElseNotAllowed { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_statement_after_outer_attr)] | |
| pub(crate) struct ExpectedStatementAfterOuterAttr { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_doc_comment_does_not_document_anything, code = E0585)] | |
| #[help] | |
| pub(crate) struct DocCommentDoesNotDocumentAnything { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = ",", applicability = "machine-applicable", style = "verbose")] | |
| pub missing_comma: Option<Span>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_const_let_mutually_exclusive)] | |
| pub(crate) struct ConstLetMutuallyExclusive { | |
| #[primary_span] | |
| #[suggestion(code = "const", applicability = "maybe-incorrect", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_expression_in_let_else)] | |
| pub(crate) struct InvalidExpressionInLetElse { | |
| #[primary_span] | |
| pub span: Span, | |
| pub operator: &'static str, | |
| #[subdiagnostic] | |
| pub sugg: WrapInParentheses, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_curly_in_let_else)] | |
| pub(crate) struct InvalidCurlyInLetElse { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: WrapInParentheses, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_compound_assignment_expression_in_let)] | |
| #[help] | |
| pub(crate) struct CompoundAssignmentExpressionInLet { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_suffixed_literal_in_attribute)] | |
| #[help] | |
| pub(crate) struct SuffixedLiteralInAttribute { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_meta_item)] | |
| pub(crate) struct InvalidMetaItem { | |
| #[primary_span] | |
| pub span: Span, | |
| pub descr: String, | |
| #[subdiagnostic] | |
| pub quote_ident_sugg: Option<InvalidMetaItemQuoteIdentSugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_quote_ident_sugg, applicability = "machine-applicable")] | |
| pub(crate) struct InvalidMetaItemQuoteIdentSugg { | |
| #[suggestion_part(code = "\"")] | |
| pub before: Span, | |
| #[suggestion_part(code = "\"")] | |
| pub after: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[suggestion( | |
| parse_sugg_escape_identifier, | |
| style = "verbose", | |
| applicability = "maybe-incorrect", | |
| code = "r#" | |
| )] | |
| pub(crate) struct SuggEscapeIdentifier { | |
| #[primary_span] | |
| pub span: Span, | |
| pub ident_name: String, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[suggestion( | |
| parse_sugg_remove_comma, | |
| applicability = "machine-applicable", | |
| code = "", | |
| style = "verbose" | |
| )] | |
| pub(crate) struct SuggRemoveComma { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[suggestion( | |
| parse_sugg_add_let_for_stmt, | |
| style = "verbose", | |
| applicability = "maybe-incorrect", | |
| code = "let " | |
| )] | |
| pub(crate) struct SuggAddMissingLetStmt { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum ExpectedIdentifierFound { | |
| #[label(parse_expected_identifier_found_reserved_identifier)] | |
| ReservedIdentifier(#[primary_span] Span), | |
| #[label(parse_expected_identifier_found_keyword)] | |
| Keyword(#[primary_span] Span), | |
| #[label(parse_expected_identifier_found_reserved_keyword)] | |
| ReservedKeyword(#[primary_span] Span), | |
| #[label(parse_expected_identifier_found_doc_comment)] | |
| DocComment(#[primary_span] Span), | |
| #[label(parse_expected_identifier_found_metavar)] | |
| MetaVar(#[primary_span] Span), | |
| #[label(parse_expected_identifier)] | |
| Other(#[primary_span] Span), | |
| } | |
| impl ExpectedIdentifierFound { | |
| pub(crate) fn new(token_descr: Option<TokenDescription>, span: Span) -> Self { | |
| (match token_descr { | |
| Some(TokenDescription::ReservedIdentifier) => { | |
| ExpectedIdentifierFound::ReservedIdentifier | |
| } | |
| Some(TokenDescription::Keyword) => ExpectedIdentifierFound::Keyword, | |
| Some(TokenDescription::ReservedKeyword) => ExpectedIdentifierFound::ReservedKeyword, | |
| Some(TokenDescription::DocComment) => ExpectedIdentifierFound::DocComment, | |
| Some(TokenDescription::MetaVar(_)) => ExpectedIdentifierFound::MetaVar, | |
| None => ExpectedIdentifierFound::Other, | |
| })(span) | |
| } | |
| } | |
| pub(crate) struct ExpectedIdentifier { | |
| pub span: Span, | |
| pub token: Token, | |
| pub suggest_raw: Option<SuggEscapeIdentifier>, | |
| pub suggest_remove_comma: Option<SuggRemoveComma>, | |
| pub help_cannot_start_number: Option<HelpIdentifierStartsWithNumber>, | |
| } | |
| impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for ExpectedIdentifier { | |
| #[track_caller] | |
| fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> { | |
| let token_descr = TokenDescription::from_token(&self.token); | |
| let mut add_token = true; | |
| let mut diag = Diag::new( | |
| dcx, | |
| level, | |
| match token_descr { | |
| Some(TokenDescription::ReservedIdentifier) => { | |
| fluent::parse_expected_identifier_found_reserved_identifier_str | |
| } | |
| Some(TokenDescription::Keyword) => { | |
| fluent::parse_expected_identifier_found_keyword_str | |
| } | |
| Some(TokenDescription::ReservedKeyword) => { | |
| fluent::parse_expected_identifier_found_reserved_keyword_str | |
| } | |
| Some(TokenDescription::DocComment) => { | |
| fluent::parse_expected_identifier_found_doc_comment_str | |
| } | |
| Some(TokenDescription::MetaVar(_)) => { | |
| add_token = false; | |
| fluent::parse_expected_identifier_found_metavar_str | |
| } | |
| None => fluent::parse_expected_identifier_found_str, | |
| }, | |
| ); | |
| diag.span(self.span); | |
| if add_token { | |
| diag.arg("token", self.token); | |
| } | |
| if let Some(sugg) = self.suggest_raw { | |
| sugg.add_to_diag(&mut diag); | |
| } | |
| ExpectedIdentifierFound::new(token_descr, self.span).add_to_diag(&mut diag); | |
| if let Some(sugg) = self.suggest_remove_comma { | |
| sugg.add_to_diag(&mut diag); | |
| } | |
| if let Some(help) = self.help_cannot_start_number { | |
| help.add_to_diag(&mut diag); | |
| } | |
| diag | |
| } | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[help(parse_invalid_identifier_with_leading_number)] | |
| pub(crate) struct HelpIdentifierStartsWithNumber { | |
| #[primary_span] | |
| pub num_span: Span, | |
| } | |
| pub(crate) struct ExpectedSemi { | |
| pub span: Span, | |
| pub token: Token, | |
| pub unexpected_token_label: Option<Span>, | |
| pub sugg: ExpectedSemiSugg, | |
| } | |
| impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for ExpectedSemi { | |
| #[track_caller] | |
| fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> { | |
| let token_descr = TokenDescription::from_token(&self.token); | |
| let mut add_token = true; | |
| let mut diag = Diag::new( | |
| dcx, | |
| level, | |
| match token_descr { | |
| Some(TokenDescription::ReservedIdentifier) => { | |
| fluent::parse_expected_semi_found_reserved_identifier_str | |
| } | |
| Some(TokenDescription::Keyword) => fluent::parse_expected_semi_found_keyword_str, | |
| Some(TokenDescription::ReservedKeyword) => { | |
| fluent::parse_expected_semi_found_reserved_keyword_str | |
| } | |
| Some(TokenDescription::DocComment) => { | |
| fluent::parse_expected_semi_found_doc_comment_str | |
| } | |
| Some(TokenDescription::MetaVar(_)) => { | |
| add_token = false; | |
| fluent::parse_expected_semi_found_metavar_str | |
| } | |
| None => fluent::parse_expected_semi_found_str, | |
| }, | |
| ); | |
| diag.span(self.span); | |
| if add_token { | |
| diag.arg("token", self.token); | |
| } | |
| if let Some(unexpected_token_label) = self.unexpected_token_label { | |
| diag.span_label(unexpected_token_label, fluent::parse_label_unexpected_token); | |
| } | |
| self.sugg.add_to_diag(&mut diag); | |
| diag | |
| } | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum ExpectedSemiSugg { | |
| #[suggestion( | |
| parse_sugg_change_this_to_semi, | |
| code = ";", | |
| applicability = "machine-applicable", | |
| style = "short" | |
| )] | |
| ChangeToSemi(#[primary_span] Span), | |
| #[suggestion( | |
| parse_sugg_add_semi, | |
| code = ";", | |
| applicability = "machine-applicable", | |
| style = "short" | |
| )] | |
| AddSemi(#[primary_span] Span), | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_struct_literal_body_without_path)] | |
| pub(crate) struct StructLiteralBodyWithoutPath { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: StructLiteralBodyWithoutPathSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "has-placeholders")] | |
| pub(crate) struct StructLiteralBodyWithoutPathSugg { | |
| #[suggestion_part(code = "{{ SomeStruct ")] | |
| pub before: Span, | |
| #[suggestion_part(code = " }}")] | |
| pub after: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unmatched_angle_brackets)] | |
| pub(crate) struct UnmatchedAngleBrackets { | |
| #[primary_span] | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| pub num_extra_brackets: usize, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_generic_parameters_without_angle_brackets)] | |
| pub(crate) struct GenericParamsWithoutAngleBrackets { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: GenericParamsWithoutAngleBracketsSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct GenericParamsWithoutAngleBracketsSugg { | |
| #[suggestion_part(code = "<")] | |
| pub left: Span, | |
| #[suggestion_part(code = ">")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_comparison_operators_cannot_be_chained)] | |
| pub(crate) struct ComparisonOperatorsCannotBeChained { | |
| #[primary_span] | |
| pub span: Vec<Span>, | |
| #[suggestion( | |
| parse_sugg_turbofish_syntax, | |
| style = "verbose", | |
| code = "::", | |
| applicability = "maybe-incorrect" | |
| )] | |
| pub suggest_turbofish: Option<Span>, | |
| #[help(parse_sugg_turbofish_syntax)] | |
| #[help(parse_sugg_parentheses_for_function_args)] | |
| pub help_turbofish: bool, | |
| #[subdiagnostic] | |
| pub chaining_sugg: Option<ComparisonOperatorsCannotBeChainedSugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum ComparisonOperatorsCannotBeChainedSugg { | |
| #[suggestion( | |
| parse_sugg_split_comparison, | |
| style = "verbose", | |
| code = " && {middle_term}", | |
| applicability = "maybe-incorrect" | |
| )] | |
| SplitComparison { | |
| #[primary_span] | |
| span: Span, | |
| middle_term: String, | |
| }, | |
| #[multipart_suggestion(parse_sugg_parenthesize, applicability = "maybe-incorrect")] | |
| Parenthesize { | |
| #[suggestion_part(code = "(")] | |
| left: Span, | |
| #[suggestion_part(code = ")")] | |
| right: Span, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_question_mark_in_type)] | |
| pub(crate) struct QuestionMarkInType { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: QuestionMarkInTypeSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct QuestionMarkInTypeSugg { | |
| #[suggestion_part(code = "Option<")] | |
| pub left: Span, | |
| #[suggestion_part(code = ">")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_parentheses_in_for_head)] | |
| pub(crate) struct ParenthesesInForHead { | |
| #[primary_span] | |
| pub span: Vec<Span>, | |
| #[subdiagnostic] | |
| pub sugg: ParenthesesInForHeadSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct ParenthesesInForHeadSugg { | |
| #[suggestion_part(code = " ")] | |
| pub left: Span, | |
| #[suggestion_part(code = " ")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_parentheses_in_match_arm_pattern)] | |
| pub(crate) struct ParenthesesInMatchPat { | |
| #[primary_span] | |
| pub span: Vec<Span>, | |
| #[subdiagnostic] | |
| pub sugg: ParenthesesInMatchPatSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct ParenthesesInMatchPatSugg { | |
| #[suggestion_part(code = "")] | |
| pub left: Span, | |
| #[suggestion_part(code = "")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_doc_comment_on_param_type)] | |
| pub(crate) struct DocCommentOnParamType { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_attribute_on_param_type)] | |
| pub(crate) struct AttributeOnParamType { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_attribute_on_type)] | |
| pub(crate) struct AttributeOnType { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")] | |
| pub fix_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_attribute_on_generic_arg)] | |
| pub(crate) struct AttributeOnGenericArg { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")] | |
| pub fix_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_attribute_on_empty_type)] | |
| pub(crate) struct AttributeOnEmptyType { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_pattern_method_param_without_body, code = E0642)] | |
| pub(crate) struct PatternMethodParamWithoutBody { | |
| #[primary_span] | |
| #[suggestion(code = "_", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_self_param_not_first)] | |
| pub(crate) struct SelfParamNotFirst { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_const_generic_without_braces)] | |
| pub(crate) struct ConstGenericWithoutBraces { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: ConstGenericWithoutBracesSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct ConstGenericWithoutBracesSugg { | |
| #[suggestion_part(code = "{{ ")] | |
| pub left: Span, | |
| #[suggestion_part(code = " }}")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_const_param_declaration)] | |
| pub(crate) struct UnexpectedConstParamDeclaration { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: Option<UnexpectedConstParamDeclarationSugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum UnexpectedConstParamDeclarationSugg { | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| AddParam { | |
| #[suggestion_part(code = "<{snippet}>")] | |
| impl_generics: Span, | |
| #[suggestion_part(code = "{ident}")] | |
| incorrect_decl: Span, | |
| snippet: String, | |
| ident: String, | |
| }, | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| AppendParam { | |
| #[suggestion_part(code = ", {snippet}")] | |
| impl_generics_end: Span, | |
| #[suggestion_part(code = "{ident}")] | |
| incorrect_decl: Span, | |
| snippet: String, | |
| ident: String, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_const_in_generic_param)] | |
| pub(crate) struct UnexpectedConstInGenericParam { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(style = "verbose", code = "", applicability = "maybe-incorrect")] | |
| pub to_remove: Option<Span>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_async_move_order_incorrect)] | |
| pub(crate) struct AsyncMoveOrderIncorrect { | |
| #[primary_span] | |
| #[suggestion(style = "verbose", code = "async move", applicability = "maybe-incorrect")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_async_use_order_incorrect)] | |
| pub(crate) struct AsyncUseOrderIncorrect { | |
| #[primary_span] | |
| #[suggestion(style = "verbose", code = "async use", applicability = "maybe-incorrect")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_double_colon_in_bound)] | |
| pub(crate) struct DoubleColonInBound { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = ": ", applicability = "machine-applicable", style = "verbose")] | |
| pub between: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_fn_ptr_with_generics)] | |
| pub(crate) struct FnPtrWithGenerics { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: Option<FnPtrWithGenericsSugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion( | |
| parse_misplaced_return_type, | |
| style = "verbose", | |
| applicability = "maybe-incorrect" | |
| )] | |
| pub(crate) struct MisplacedReturnType { | |
| #[suggestion_part(code = " {snippet}")] | |
| pub fn_params_end: Span, | |
| pub snippet: String, | |
| #[suggestion_part(code = "")] | |
| pub ret_ty_span: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "maybe-incorrect")] | |
| pub(crate) struct FnPtrWithGenericsSugg { | |
| #[suggestion_part(code = "{snippet}")] | |
| pub left: Span, | |
| pub snippet: String, | |
| #[suggestion_part(code = "")] | |
| pub right: Span, | |
| pub arity: usize, | |
| pub for_param_list_exists: bool, | |
| } | |
| pub(crate) struct FnTraitMissingParen { | |
| pub span: Span, | |
| } | |
| impl Subdiagnostic for FnTraitMissingParen { | |
| fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) { | |
| diag.span_label(self.span, crate::fluent_generated::parse_fn_trait_missing_paren); | |
| diag.span_suggestion_short( | |
| self.span.shrink_to_hi(), | |
| crate::fluent_generated::parse_add_paren, | |
| "()", | |
| Applicability::MachineApplicable, | |
| ); | |
| } | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_if_with_if)] | |
| pub(crate) struct UnexpectedIfWithIf( | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", code = " ", style = "verbose")] | |
| pub Span, | |
| ); | |
| #[derive(Diagnostic)] | |
| #[diag(parse_maybe_fn_typo_with_impl)] | |
| pub(crate) struct FnTypoWithImpl { | |
| #[primary_span] | |
| #[suggestion(applicability = "maybe-incorrect", code = "impl", style = "verbose")] | |
| pub fn_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_fn_path_found_fn_keyword)] | |
| pub(crate) struct ExpectedFnPathFoundFnKeyword { | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", code = "Fn", style = "verbose")] | |
| pub fn_token_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_path_found_named_params)] | |
| pub(crate) struct FnPathFoundNamedParams { | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", code = "")] | |
| pub named_param_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_path_found_c_variadic_params)] | |
| pub(crate) struct PathFoundCVariadicParams { | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", code = "")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_path_found_attribute_in_params)] | |
| pub(crate) struct PathFoundAttributeInParams { | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", code = "")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_path_double_colon)] | |
| pub(crate) struct PathSingleColon { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(applicability = "machine-applicable", code = ":", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_path_double_colon)] | |
| pub(crate) struct PathTripleColon { | |
| #[primary_span] | |
| #[suggestion(applicability = "maybe-incorrect", code = "", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_colon_as_semi)] | |
| pub(crate) struct ColonAsSemi { | |
| #[primary_span] | |
| #[suggestion(applicability = "machine-applicable", code = ";", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_where_clause_before_tuple_struct_body)] | |
| pub(crate) struct WhereClauseBeforeTupleStructBody { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[label(parse_name_label)] | |
| pub name: Span, | |
| #[label(parse_body_label)] | |
| pub body: Span, | |
| #[subdiagnostic] | |
| pub sugg: Option<WhereClauseBeforeTupleStructBodySugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct WhereClauseBeforeTupleStructBodySugg { | |
| #[suggestion_part(code = "{snippet}")] | |
| pub left: Span, | |
| pub snippet: String, | |
| #[suggestion_part(code = "")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_async_fn_in_2015, code = E0670)] | |
| pub(crate) struct AsyncFnIn2015 { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub help: HelpUseLatestEdition, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[label(parse_async_block_in_2015)] | |
| pub(crate) struct AsyncBlockIn2015 { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_async_move_block_in_2015)] | |
| pub(crate) struct AsyncMoveBlockIn2015 { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_async_use_block_in_2015)] | |
| pub(crate) struct AsyncUseBlockIn2015 { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_async_bound_modifier_in_2015)] | |
| pub(crate) struct AsyncBoundModifierIn2015 { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub help: HelpUseLatestEdition, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_let_chain_pre_2024)] | |
| pub(crate) struct LetChainPre2024 { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_self_argument_pointer)] | |
| pub(crate) struct SelfArgumentPointer { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_token_after_dot)] | |
| pub(crate) struct UnexpectedTokenAfterDot { | |
| #[primary_span] | |
| pub span: Span, | |
| pub actual: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_visibility_not_followed_by_item)] | |
| #[help] | |
| pub(crate) struct VisibilityNotFollowedByItem { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| pub vis: Visibility, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_default_not_followed_by_item)] | |
| #[note] | |
| pub(crate) struct DefaultNotFollowedByItem { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| pub(crate) enum MissingKeywordForItemDefinition { | |
| #[diag(parse_missing_enum_for_enum_definition)] | |
| Enum { | |
| #[primary_span] | |
| span: Span, | |
| #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "enum ")] | |
| insert_span: Span, | |
| ident: Ident, | |
| }, | |
| #[diag(parse_missing_enum_or_struct_for_item_definition)] | |
| EnumOrStruct { | |
| #[primary_span] | |
| span: Span, | |
| }, | |
| #[diag(parse_missing_struct_for_struct_definition)] | |
| Struct { | |
| #[primary_span] | |
| span: Span, | |
| #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "struct ")] | |
| insert_span: Span, | |
| ident: Ident, | |
| }, | |
| #[diag(parse_missing_fn_for_function_definition)] | |
| Function { | |
| #[primary_span] | |
| span: Span, | |
| #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "fn ")] | |
| insert_span: Span, | |
| ident: Ident, | |
| }, | |
| #[diag(parse_missing_fn_for_method_definition)] | |
| Method { | |
| #[primary_span] | |
| span: Span, | |
| #[suggestion(style = "verbose", applicability = "maybe-incorrect", code = "fn ")] | |
| insert_span: Span, | |
| ident: Ident, | |
| }, | |
| #[diag(parse_missing_fn_or_struct_for_item_definition)] | |
| Ambiguous { | |
| #[primary_span] | |
| span: Span, | |
| #[subdiagnostic] | |
| subdiag: Option<AmbiguousMissingKwForItemSub>, | |
| }, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum AmbiguousMissingKwForItemSub { | |
| #[suggestion( | |
| parse_suggestion, | |
| applicability = "maybe-incorrect", | |
| code = "{snippet}!", | |
| style = "verbose" | |
| )] | |
| SuggestMacro { | |
| #[primary_span] | |
| span: Span, | |
| snippet: String, | |
| }, | |
| #[help(parse_help)] | |
| HelpMacro, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_fn_params)] | |
| pub(crate) struct MissingFnParams { | |
| #[primary_span] | |
| #[suggestion(code = "()", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_path_sep_in_fn_definition)] | |
| pub(crate) struct InvalidPathSepInFnDefinition { | |
| #[primary_span] | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_trait_in_trait_impl)] | |
| pub(crate) struct MissingTraitInTraitImpl { | |
| #[primary_span] | |
| #[suggestion( | |
| parse_suggestion_add_trait, | |
| code = " Trait ", | |
| applicability = "has-placeholders", | |
| style = "verbose" | |
| )] | |
| pub span: Span, | |
| #[suggestion( | |
| parse_suggestion_remove_for, | |
| code = "", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| pub for_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_for_in_trait_impl)] | |
| pub(crate) struct MissingForInTraitImpl { | |
| #[primary_span] | |
| #[suggestion(style = "verbose", code = " for ", applicability = "machine-applicable")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_trait_in_trait_impl_found_type)] | |
| pub(crate) struct ExpectedTraitInTraitImplFoundType { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_extra_impl_keyword_in_trait_impl)] | |
| pub(crate) struct ExtraImplKeywordInTraitImpl { | |
| #[primary_span] | |
| #[suggestion(code = "", applicability = "maybe-incorrect", style = "short")] | |
| pub extra_impl_kw: Span, | |
| #[note] | |
| pub impl_trait_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_bounds_not_allowed_on_trait_aliases)] | |
| pub(crate) struct BoundsNotAllowedOnTraitAliases { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_trait_alias_cannot_be_auto)] | |
| pub(crate) struct TraitAliasCannotBeAuto { | |
| #[primary_span] | |
| #[label(parse_trait_alias_cannot_be_auto)] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_trait_alias_cannot_be_unsafe)] | |
| pub(crate) struct TraitAliasCannotBeUnsafe { | |
| #[primary_span] | |
| #[label(parse_trait_alias_cannot_be_unsafe)] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_associated_static_item_not_allowed)] | |
| pub(crate) struct AssociatedStaticItemNotAllowed { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_extern_crate_name_with_dashes)] | |
| pub(crate) struct ExternCrateNameWithDashes { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: ExternCrateNameWithDashesSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct ExternCrateNameWithDashesSugg { | |
| #[suggestion_part(code = "_")] | |
| pub dashes: Vec<Span>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_extern_item_cannot_be_const)] | |
| #[note] | |
| pub(crate) struct ExternItemCannotBeConst { | |
| #[primary_span] | |
| pub ident_span: Span, | |
| #[suggestion(code = "static ", applicability = "machine-applicable", style = "verbose")] | |
| pub const_span: Option<Span>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_const_global_cannot_be_mutable)] | |
| pub(crate) struct ConstGlobalCannotBeMutable { | |
| #[primary_span] | |
| #[label] | |
| pub ident_span: Span, | |
| #[suggestion(code = "static", style = "verbose", applicability = "maybe-incorrect")] | |
| pub const_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_const_type)] | |
| pub(crate) struct MissingConstType { | |
| #[primary_span] | |
| #[suggestion(code = "{colon} <type>", style = "verbose", applicability = "has-placeholders")] | |
| pub span: Span, | |
| pub kind: &'static str, | |
| pub colon: &'static str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_enum_struct_mutually_exclusive)] | |
| pub(crate) struct EnumStructMutuallyExclusive { | |
| #[primary_span] | |
| #[suggestion(code = "enum", style = "verbose", applicability = "machine-applicable")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| pub(crate) enum UnexpectedTokenAfterStructName { | |
| #[diag(parse_unexpected_token_after_struct_name_found_reserved_identifier)] | |
| ReservedIdentifier { | |
| #[primary_span] | |
| #[label(parse_unexpected_token_after_struct_name)] | |
| span: Span, | |
| token: Token, | |
| }, | |
| #[diag(parse_unexpected_token_after_struct_name_found_keyword)] | |
| Keyword { | |
| #[primary_span] | |
| #[label(parse_unexpected_token_after_struct_name)] | |
| span: Span, | |
| token: Token, | |
| }, | |
| #[diag(parse_unexpected_token_after_struct_name_found_reserved_keyword)] | |
| ReservedKeyword { | |
| #[primary_span] | |
| #[label(parse_unexpected_token_after_struct_name)] | |
| span: Span, | |
| token: Token, | |
| }, | |
| #[diag(parse_unexpected_token_after_struct_name_found_doc_comment)] | |
| DocComment { | |
| #[primary_span] | |
| #[label(parse_unexpected_token_after_struct_name)] | |
| span: Span, | |
| token: Token, | |
| }, | |
| #[diag(parse_unexpected_token_after_struct_name_found_metavar)] | |
| MetaVar { | |
| #[primary_span] | |
| #[label(parse_unexpected_token_after_struct_name)] | |
| span: Span, | |
| }, | |
| #[diag(parse_unexpected_token_after_struct_name_found_other)] | |
| Other { | |
| #[primary_span] | |
| #[label(parse_unexpected_token_after_struct_name)] | |
| span: Span, | |
| token: Token, | |
| }, | |
| } | |
| impl UnexpectedTokenAfterStructName { | |
| pub(crate) fn new(span: Span, token: Token) -> Self { | |
| match TokenDescription::from_token(&token) { | |
| Some(TokenDescription::ReservedIdentifier) => Self::ReservedIdentifier { span, token }, | |
| Some(TokenDescription::Keyword) => Self::Keyword { span, token }, | |
| Some(TokenDescription::ReservedKeyword) => Self::ReservedKeyword { span, token }, | |
| Some(TokenDescription::DocComment) => Self::DocComment { span, token }, | |
| Some(TokenDescription::MetaVar(_)) => Self::MetaVar { span }, | |
| None => Self::Other { span, token }, | |
| } | |
| } | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_self_in_generic_parameters)] | |
| #[note] | |
| pub(crate) struct UnexpectedSelfInGenericParameters { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_default_value_for_lifetime_in_generic_parameters)] | |
| pub(crate) struct UnexpectedDefaultValueForLifetimeInGenericParameters { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_multiple_where_clauses)] | |
| pub(crate) struct MultipleWhereClauses { | |
| #[primary_span] | |
| pub span: Span, | |
| #[label] | |
| pub previous: Span, | |
| #[suggestion(style = "verbose", code = ",", applicability = "maybe-incorrect")] | |
| pub between: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| pub(crate) enum UnexpectedNonterminal { | |
| #[diag(parse_nonterminal_expected_item_keyword)] | |
| Item(#[primary_span] Span), | |
| #[diag(parse_nonterminal_expected_statement)] | |
| Statement(#[primary_span] Span), | |
| #[diag(parse_nonterminal_expected_ident)] | |
| Ident { | |
| #[primary_span] | |
| span: Span, | |
| token: Token, | |
| }, | |
| #[diag(parse_nonterminal_expected_lifetime)] | |
| Lifetime { | |
| #[primary_span] | |
| span: Span, | |
| token: Token, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| pub(crate) enum TopLevelOrPatternNotAllowed { | |
| #[diag(parse_or_pattern_not_allowed_in_let_binding)] | |
| LetBinding { | |
| #[primary_span] | |
| span: Span, | |
| #[subdiagnostic] | |
| sub: Option<TopLevelOrPatternNotAllowedSugg>, | |
| }, | |
| #[diag(parse_or_pattern_not_allowed_in_fn_parameters)] | |
| FunctionParameter { | |
| #[primary_span] | |
| span: Span, | |
| #[subdiagnostic] | |
| sub: Option<TopLevelOrPatternNotAllowedSugg>, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_cannot_be_raw_ident)] | |
| pub(crate) struct CannotBeRawIdent { | |
| #[primary_span] | |
| pub span: Span, | |
| pub ident: Symbol, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_cannot_be_raw_lifetime)] | |
| pub(crate) struct CannotBeRawLifetime { | |
| #[primary_span] | |
| pub span: Span, | |
| pub ident: Symbol, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_keyword_lifetime)] | |
| pub(crate) struct KeywordLifetime { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_keyword_label)] | |
| pub(crate) struct KeywordLabel { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_cr_doc_comment)] | |
| pub(crate) struct CrDocComment { | |
| #[primary_span] | |
| pub span: Span, | |
| pub block: bool, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_no_digits_literal, code = E0768)] | |
| pub(crate) struct NoDigitsLiteral { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_digit_literal)] | |
| pub(crate) struct InvalidDigitLiteral { | |
| #[primary_span] | |
| pub span: Span, | |
| pub base: u32, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_empty_exponent_float)] | |
| pub(crate) struct EmptyExponentFloat { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_float_literal_unsupported_base)] | |
| pub(crate) struct FloatLiteralUnsupportedBase { | |
| #[primary_span] | |
| pub span: Span, | |
| pub base: &'static str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unknown_prefix)] | |
| #[note] | |
| pub(crate) struct UnknownPrefix<'a> { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| pub prefix: &'a str, | |
| #[subdiagnostic] | |
| pub sugg: Option<UnknownPrefixSugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[note(parse_macro_expands_to_adt_field)] | |
| pub(crate) struct MacroExpandsToAdtField<'a> { | |
| pub adt_ty: &'a str, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum UnknownPrefixSugg { | |
| #[suggestion( | |
| parse_suggestion_br, | |
| code = "br", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| UseBr(#[primary_span] Span), | |
| #[suggestion( | |
| parse_suggestion_cr, | |
| code = "cr", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| UseCr(#[primary_span] Span), | |
| #[suggestion( | |
| parse_suggestion_whitespace, | |
| code = " ", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| Whitespace(#[primary_span] Span), | |
| #[multipart_suggestion( | |
| parse_suggestion_str, | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| MeantStr { | |
| #[suggestion_part(code = "\"")] | |
| start: Span, | |
| #[suggestion_part(code = "\"")] | |
| end: Span, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_reserved_multihash)] | |
| #[note] | |
| pub(crate) struct ReservedMultihash { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: Option<GuardedStringSugg>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_reserved_string)] | |
| #[note] | |
| pub(crate) struct ReservedString { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: Option<GuardedStringSugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[suggestion( | |
| parse_suggestion_whitespace, | |
| code = " ", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| pub(crate) struct GuardedStringSugg(#[primary_span] pub Span); | |
| #[derive(Diagnostic)] | |
| #[diag(parse_too_many_hashes)] | |
| pub(crate) struct TooManyHashes { | |
| #[primary_span] | |
| pub span: Span, | |
| pub num: u32, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unknown_start_of_token)] | |
| pub(crate) struct UnknownTokenStart { | |
| #[primary_span] | |
| pub span: Span, | |
| pub escaped: String, | |
| #[subdiagnostic] | |
| pub sugg: Option<TokenSubstitution>, | |
| #[subdiagnostic] | |
| pub null: Option<UnknownTokenNull>, | |
| #[subdiagnostic] | |
| pub repeat: Option<UnknownTokenRepeat>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum TokenSubstitution { | |
| #[suggestion( | |
| parse_sugg_quotes, | |
| code = "{suggestion}", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| DirectedQuotes { | |
| #[primary_span] | |
| span: Span, | |
| suggestion: String, | |
| ascii_str: &'static str, | |
| ascii_name: &'static str, | |
| }, | |
| #[suggestion( | |
| parse_sugg_other, | |
| code = "{suggestion}", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| Other { | |
| #[primary_span] | |
| span: Span, | |
| suggestion: String, | |
| ch: String, | |
| u_name: &'static str, | |
| ascii_str: &'static str, | |
| ascii_name: &'static str, | |
| }, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[note(parse_note_repeats)] | |
| pub(crate) struct UnknownTokenRepeat { | |
| pub repeats: usize, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[help(parse_help_null)] | |
| pub(crate) struct UnknownTokenNull; | |
| #[derive(Diagnostic)] | |
| pub(crate) enum UnescapeError { | |
| #[diag(parse_invalid_unicode_escape)] | |
| #[help] | |
| InvalidUnicodeEscape { | |
| #[primary_span] | |
| #[label] | |
| span: Span, | |
| surrogate: bool, | |
| }, | |
| #[diag(parse_escape_only_char)] | |
| EscapeOnlyChar { | |
| #[primary_span] | |
| span: Span, | |
| #[suggestion( | |
| parse_escape, | |
| applicability = "machine-applicable", | |
| code = "{escaped_sugg}", | |
| style = "verbose" | |
| )] | |
| char_span: Span, | |
| escaped_sugg: String, | |
| escaped_msg: String, | |
| byte: bool, | |
| }, | |
| #[diag(parse_bare_cr)] | |
| BareCr { | |
| #[primary_span] | |
| #[suggestion( | |
| parse_escape, | |
| applicability = "machine-applicable", | |
| code = "\\r", | |
| style = "verbose" | |
| )] | |
| span: Span, | |
| double_quotes: bool, | |
| }, | |
| #[diag(parse_bare_cr_in_raw_string)] | |
| BareCrRawString(#[primary_span] Span), | |
| #[diag(parse_too_short_hex_escape)] | |
| TooShortHexEscape(#[primary_span] Span), | |
| #[diag(parse_invalid_char_in_escape)] | |
| InvalidCharInEscape { | |
| #[primary_span] | |
| #[label] | |
| span: Span, | |
| is_hex: bool, | |
| ch: String, | |
| }, | |
| #[diag(parse_leading_underscore_unicode_escape)] | |
| LeadingUnderscoreUnicodeEscape { | |
| #[primary_span] | |
| #[label(parse_leading_underscore_unicode_escape_label)] | |
| span: Span, | |
| ch: String, | |
| }, | |
| #[diag(parse_overlong_unicode_escape)] | |
| OverlongUnicodeEscape( | |
| #[primary_span] | |
| #[label] | |
| Span, | |
| ), | |
| #[diag(parse_unclosed_unicode_escape)] | |
| UnclosedUnicodeEscape( | |
| #[primary_span] | |
| #[label] | |
| Span, | |
| #[suggestion( | |
| parse_terminate, | |
| code = "}}", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| Span, | |
| ), | |
| #[diag(parse_no_brace_unicode_escape)] | |
| NoBraceInUnicodeEscape { | |
| #[primary_span] | |
| span: Span, | |
| #[label] | |
| label: Option<Span>, | |
| #[subdiagnostic] | |
| sub: NoBraceUnicodeSub, | |
| }, | |
| #[diag(parse_unicode_escape_in_byte)] | |
| #[help] | |
| UnicodeEscapeInByte( | |
| #[primary_span] | |
| #[label] | |
| Span, | |
| ), | |
| #[diag(parse_empty_unicode_escape)] | |
| EmptyUnicodeEscape( | |
| #[primary_span] | |
| #[label] | |
| Span, | |
| ), | |
| #[diag(parse_zero_chars)] | |
| ZeroChars( | |
| #[primary_span] | |
| #[label] | |
| Span, | |
| ), | |
| #[diag(parse_lone_slash)] | |
| LoneSlash( | |
| #[primary_span] | |
| #[label] | |
| Span, | |
| ), | |
| #[diag(parse_unskipped_whitespace)] | |
| UnskippedWhitespace { | |
| #[primary_span] | |
| span: Span, | |
| #[label] | |
| char_span: Span, | |
| ch: String, | |
| }, | |
| #[diag(parse_multiple_skipped_lines)] | |
| MultipleSkippedLinesWarning( | |
| #[primary_span] | |
| #[label] | |
| Span, | |
| ), | |
| #[diag(parse_more_than_one_char)] | |
| MoreThanOneChar { | |
| #[primary_span] | |
| span: Span, | |
| #[subdiagnostic] | |
| note: Option<MoreThanOneCharNote>, | |
| #[subdiagnostic] | |
| suggestion: MoreThanOneCharSugg, | |
| }, | |
| #[diag(parse_nul_in_c_str)] | |
| NulInCStr { | |
| #[primary_span] | |
| span: Span, | |
| }, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum MoreThanOneCharSugg { | |
| #[suggestion( | |
| parse_consider_normalized, | |
| code = "{normalized}", | |
| applicability = "machine-applicable", | |
| style = "verbose" | |
| )] | |
| NormalizedForm { | |
| #[primary_span] | |
| span: Span, | |
| ch: String, | |
| normalized: String, | |
| }, | |
| #[suggestion( | |
| parse_remove_non, | |
| code = "{ch}", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| RemoveNonPrinting { | |
| #[primary_span] | |
| span: Span, | |
| ch: String, | |
| }, | |
| #[suggestion( | |
| parse_use_double_quotes, | |
| code = "{sugg}", | |
| applicability = "machine-applicable", | |
| style = "verbose" | |
| )] | |
| QuotesFull { | |
| #[primary_span] | |
| span: Span, | |
| is_byte: bool, | |
| sugg: String, | |
| }, | |
| #[multipart_suggestion(parse_use_double_quotes, applicability = "machine-applicable")] | |
| Quotes { | |
| #[suggestion_part(code = "{prefix}\"")] | |
| start: Span, | |
| #[suggestion_part(code = "\"")] | |
| end: Span, | |
| is_byte: bool, | |
| prefix: &'static str, | |
| }, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum MoreThanOneCharNote { | |
| #[note(parse_followed_by)] | |
| AllCombining { | |
| #[primary_span] | |
| span: Span, | |
| chr: String, | |
| len: usize, | |
| escaped_marks: String, | |
| }, | |
| #[note(parse_non_printing)] | |
| NonPrinting { | |
| #[primary_span] | |
| span: Span, | |
| escaped: String, | |
| }, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum NoBraceUnicodeSub { | |
| #[suggestion( | |
| parse_use_braces, | |
| code = "{suggestion}", | |
| applicability = "maybe-incorrect", | |
| style = "verbose" | |
| )] | |
| Suggestion { | |
| #[primary_span] | |
| span: Span, | |
| suggestion: String, | |
| }, | |
| #[help(parse_format_of_unicode)] | |
| Help, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_sugg_wrap_pattern_in_parens, applicability = "machine-applicable")] | |
| pub(crate) struct WrapInParens { | |
| #[suggestion_part(code = "(")] | |
| pub(crate) lo: Span, | |
| #[suggestion_part(code = ")")] | |
| pub(crate) hi: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum TopLevelOrPatternNotAllowedSugg { | |
| #[suggestion( | |
| parse_sugg_remove_leading_vert_in_pattern, | |
| code = "", | |
| applicability = "machine-applicable", | |
| style = "tool-only" | |
| )] | |
| RemoveLeadingVert { | |
| #[primary_span] | |
| span: Span, | |
| }, | |
| WrapInParens { | |
| #[primary_span] | |
| span: Span, | |
| #[subdiagnostic] | |
| suggestion: WrapInParens, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_vert_vert_before_function_parameter)] | |
| #[note(parse_note_pattern_alternatives_use_single_vert)] | |
| pub(crate) struct UnexpectedVertVertBeforeFunctionParam { | |
| #[primary_span] | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_vert_vert_in_pattern)] | |
| pub(crate) struct UnexpectedVertVertInPattern { | |
| #[primary_span] | |
| #[suggestion(code = "|", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| #[label(parse_label_while_parsing_or_pattern_here)] | |
| pub start: Option<Span>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[suggestion( | |
| parse_trailing_vert_not_allowed, | |
| code = "", | |
| applicability = "machine-applicable", | |
| style = "tool-only" | |
| )] | |
| pub(crate) struct TrailingVertSuggestion { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_trailing_vert_not_allowed)] | |
| pub(crate) struct TrailingVertNotAllowed { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub suggestion: TrailingVertSuggestion, | |
| #[label(parse_label_while_parsing_or_pattern_here)] | |
| pub start: Option<Span>, | |
| pub token: Token, | |
| #[note(parse_note_pattern_alternatives_use_single_vert)] | |
| pub note_double_vert: bool, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_dotdotdot_rest_pattern)] | |
| pub(crate) struct DotDotDotRestPattern { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[suggestion(style = "verbose", code = "", applicability = "machine-applicable")] | |
| pub suggestion: Option<Span>, | |
| #[note] | |
| pub var_args: Option<()>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_pattern_on_wrong_side_of_at)] | |
| pub(crate) struct PatternOnWrongSideOfAt { | |
| #[primary_span] | |
| #[suggestion(code = "{whole_pat}", applicability = "machine-applicable", style = "verbose")] | |
| pub whole_span: Span, | |
| pub whole_pat: String, | |
| #[label(parse_label_pattern)] | |
| pub pattern: Span, | |
| #[label(parse_label_binding)] | |
| pub binding: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_binding_left_of_at)] | |
| #[note] | |
| pub(crate) struct ExpectedBindingLeftOfAt { | |
| #[primary_span] | |
| pub whole_span: Span, | |
| #[label(parse_label_lhs)] | |
| pub lhs: Span, | |
| #[label(parse_label_rhs)] | |
| pub rhs: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion( | |
| parse_ambiguous_range_pattern_suggestion, | |
| applicability = "machine-applicable" | |
| )] | |
| pub(crate) struct ParenRangeSuggestion { | |
| #[suggestion_part(code = "(")] | |
| pub lo: Span, | |
| #[suggestion_part(code = ")")] | |
| pub hi: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_ambiguous_range_pattern)] | |
| pub(crate) struct AmbiguousRangePattern { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub suggestion: ParenRangeSuggestion, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_lifetime_in_pattern)] | |
| pub(crate) struct UnexpectedLifetimeInPattern { | |
| #[primary_span] | |
| pub span: Span, | |
| pub symbol: Symbol, | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| pub(crate) enum InvalidMutInPattern { | |
| #[diag(parse_mut_on_nested_ident_pattern)] | |
| #[note(parse_note_mut_pattern_usage)] | |
| NestedIdent { | |
| #[primary_span] | |
| #[suggestion(code = "{pat}", applicability = "machine-applicable", style = "verbose")] | |
| span: Span, | |
| pat: String, | |
| }, | |
| #[diag(parse_mut_on_non_ident_pattern)] | |
| #[note(parse_note_mut_pattern_usage)] | |
| NonIdent { | |
| #[primary_span] | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| span: Span, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_repeated_mut_in_pattern)] | |
| pub(crate) struct RepeatedMutInPattern { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_dot_dot_dot_range_to_pattern_not_allowed)] | |
| pub(crate) struct DotDotDotRangeToPatternNotAllowed { | |
| #[primary_span] | |
| #[suggestion(style = "verbose", code = "..=", applicability = "machine-applicable")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_enum_pattern_instead_of_identifier)] | |
| pub(crate) struct EnumPatternInsteadOfIdentifier { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_at_dot_dot_in_struct_pattern)] | |
| pub(crate) struct AtDotDotInStructPattern { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "", style = "verbose", applicability = "machine-applicable")] | |
| pub remove: Span, | |
| pub ident: Ident, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_at_in_struct_pattern)] | |
| #[note] | |
| #[help] | |
| pub(crate) struct AtInStructPattern { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_dot_dot_dot_for_remaining_fields)] | |
| pub(crate) struct DotDotDotForRemainingFields { | |
| #[primary_span] | |
| #[suggestion(code = "..", style = "verbose", applicability = "machine-applicable")] | |
| pub span: Span, | |
| pub token_str: Cow<'static, str>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_comma_after_pattern_field)] | |
| pub(crate) struct ExpectedCommaAfterPatternField { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_expr_in_pat)] | |
| #[note] | |
| pub(crate) struct UnexpectedExpressionInPattern { | |
| /// The unexpected expr's span. | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| /// Was a `RangePatternBound` expected? | |
| pub is_bound: bool, | |
| /// The unexpected expr's precedence (used in match arm guard suggestions). | |
| pub expr_precedence: ExprPrecedence, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum UnexpectedExpressionInPatternSugg { | |
| #[multipart_suggestion( | |
| parse_unexpected_expr_in_pat_create_guard_sugg, | |
| applicability = "maybe-incorrect" | |
| )] | |
| CreateGuard { | |
| /// Where to put the suggested identifier. | |
| #[suggestion_part(code = "{ident}")] | |
| ident_span: Span, | |
| /// Where to put the match arm. | |
| #[suggestion_part(code = " if {ident} == {expr}")] | |
| pat_hi: Span, | |
| /// The suggested identifier. | |
| ident: String, | |
| /// The unexpected expression. | |
| expr: String, | |
| }, | |
| #[multipart_suggestion( | |
| parse_unexpected_expr_in_pat_update_guard_sugg, | |
| applicability = "maybe-incorrect" | |
| )] | |
| UpdateGuard { | |
| /// Where to put the suggested identifier. | |
| #[suggestion_part(code = "{ident}")] | |
| ident_span: Span, | |
| /// The beginning of the match arm guard's expression (insert a `(` if `Some`). | |
| #[suggestion_part(code = "(")] | |
| guard_lo: Option<Span>, | |
| /// The end of the match arm guard's expression. | |
| #[suggestion_part(code = "{guard_hi_paren} && {ident} == {expr}")] | |
| guard_hi: Span, | |
| /// Either `")"` or `""`. | |
| guard_hi_paren: &'static str, | |
| /// The suggested identifier. | |
| ident: String, | |
| /// The unexpected expression. | |
| expr: String, | |
| }, | |
| #[multipart_suggestion( | |
| parse_unexpected_expr_in_pat_const_sugg, | |
| applicability = "has-placeholders" | |
| )] | |
| Const { | |
| /// Where to put the extracted constant declaration. | |
| #[suggestion_part(code = "{indentation}const {ident}: /* Type */ = {expr};\n")] | |
| stmt_lo: Span, | |
| /// Where to put the suggested identifier. | |
| #[suggestion_part(code = "{ident}")] | |
| ident_span: Span, | |
| /// The suggested identifier. | |
| ident: String, | |
| /// The unexpected expression. | |
| expr: String, | |
| /// The statement's block's indentation. | |
| indentation: String, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unexpected_paren_in_range_pat)] | |
| pub(crate) struct UnexpectedParenInRangePat { | |
| #[primary_span] | |
| pub span: Vec<Span>, | |
| #[subdiagnostic] | |
| pub sugg: UnexpectedParenInRangePatSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion( | |
| parse_unexpected_paren_in_range_pat_sugg, | |
| applicability = "machine-applicable" | |
| )] | |
| pub(crate) struct UnexpectedParenInRangePatSugg { | |
| #[suggestion_part(code = "")] | |
| pub start_span: Span, | |
| #[suggestion_part(code = "")] | |
| pub end_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_return_types_use_thin_arrow)] | |
| pub(crate) struct ReturnTypesUseThinArrow { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(style = "verbose", code = " -> ", applicability = "machine-applicable")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_need_plus_after_trait_object_lifetime)] | |
| pub(crate) struct NeedPlusAfterTraitObjectLifetime { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = " + /* Trait */", applicability = "has-placeholders")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_mut_or_const_in_raw_pointer_type)] | |
| pub(crate) struct ExpectedMutOrConstInRawPointerType { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code("mut ", "const "), applicability = "has-placeholders", style = "verbose")] | |
| pub after_asterisk: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_lifetime_after_mut)] | |
| pub(crate) struct LifetimeAfterMut { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "&{snippet} mut", applicability = "maybe-incorrect", style = "verbose")] | |
| pub suggest_lifetime: Option<Span>, | |
| pub snippet: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_dyn_after_mut)] | |
| pub(crate) struct DynAfterMut { | |
| #[primary_span] | |
| #[suggestion(code = "&mut dyn", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_fn_pointer_cannot_be_const)] | |
| #[note] | |
| pub(crate) struct FnPointerCannotBeConst { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_fn_pointer_cannot_be_async)] | |
| #[note] | |
| pub(crate) struct FnPointerCannotBeAsync { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_nested_c_variadic_type, code = E0743)] | |
| pub(crate) struct NestedCVariadicType { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_dotdotdot_rest_type)] | |
| #[note] | |
| pub(crate) struct InvalidCVariadicType { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_dyn_keyword)] | |
| #[help] | |
| pub(crate) struct InvalidDynKeyword { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub(crate) enum HelpUseLatestEdition { | |
| #[help(parse_help_set_edition_cargo)] | |
| #[note(parse_note_edition_guide)] | |
| Cargo { edition: Edition }, | |
| #[help(parse_help_set_edition_standalone)] | |
| #[note(parse_note_edition_guide)] | |
| Standalone { edition: Edition }, | |
| } | |
| impl HelpUseLatestEdition { | |
| pub(crate) fn new() -> Self { | |
| let edition = LATEST_STABLE_EDITION; | |
| if rustc_session::utils::was_invoked_from_cargo() { | |
| Self::Cargo { edition } | |
| } else { | |
| Self::Standalone { edition } | |
| } | |
| } | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_box_syntax_removed)] | |
| pub(crate) struct BoxSyntaxRemoved { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: AddBoxNew, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion( | |
| parse_box_syntax_removed_suggestion, | |
| applicability = "machine-applicable", | |
| style = "verbose" | |
| )] | |
| pub(crate) struct AddBoxNew { | |
| #[suggestion_part(code = "Box::new(")] | |
| pub box_kw_and_lo: Span, | |
| #[suggestion_part(code = ")")] | |
| pub hi: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_bad_return_type_notation_output)] | |
| pub(crate) struct BadReturnTypeNotationOutput { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")] | |
| pub suggestion: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_bad_assoc_type_bounds)] | |
| pub(crate) struct BadAssocTypeBounds { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_attr_after_generic)] | |
| pub(crate) struct AttrAfterGeneric { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_attr_without_generics)] | |
| pub(crate) struct AttrWithoutGenerics { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_where_generics)] | |
| pub(crate) struct WhereOnGenerics { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_generics_in_path)] | |
| pub(crate) struct GenericsInPath { | |
| #[primary_span] | |
| pub span: Vec<Span>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_lifetime_in_eq_constraint)] | |
| #[help] | |
| pub(crate) struct LifetimeInEqConstraint { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| pub lifetime: Ident, | |
| #[label(parse_context_label)] | |
| pub binding_label: Span, | |
| #[suggestion( | |
| parse_colon_sugg, | |
| style = "verbose", | |
| applicability = "maybe-incorrect", | |
| code = ": " | |
| )] | |
| pub colon_sugg: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_modifier_lifetime)] | |
| pub(crate) struct ModifierLifetime { | |
| #[primary_span] | |
| #[suggestion(style = "tool-only", applicability = "maybe-incorrect", code = "")] | |
| pub span: Span, | |
| pub modifier: &'static str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_underscore_literal_suffix)] | |
| pub(crate) struct UnderscoreLiteralSuffix { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expect_label_found_ident)] | |
| pub(crate) struct ExpectedLabelFoundIdent { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "'", applicability = "machine-applicable", style = "verbose")] | |
| pub start: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_inappropriate_default)] | |
| #[note] | |
| pub(crate) struct InappropriateDefault { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| pub article: &'static str, | |
| pub descr: &'static str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_recover_import_as_use)] | |
| pub(crate) struct RecoverImportAsUse { | |
| #[primary_span] | |
| #[suggestion(code = "use", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| pub token_name: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_single_colon_import_path)] | |
| #[note] | |
| pub(crate) struct SingleColonImportPath { | |
| #[primary_span] | |
| #[suggestion(code = "::", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_bad_item_kind)] | |
| pub(crate) struct BadItemKind { | |
| #[primary_span] | |
| pub span: Span, | |
| pub descr: &'static str, | |
| pub ctx: &'static str, | |
| #[help] | |
| pub help: bool, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_macro_rules_missing_bang)] | |
| pub(crate) struct MacroRulesMissingBang { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "!", applicability = "machine-applicable", style = "verbose")] | |
| pub hi: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_macro_name_remove_bang)] | |
| pub(crate) struct MacroNameRemoveBang { | |
| #[primary_span] | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "short")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_macro_rules_visibility)] | |
| pub(crate) struct MacroRulesVisibility<'a> { | |
| #[primary_span] | |
| #[suggestion(code = "#[macro_export]", applicability = "maybe-incorrect", style = "verbose")] | |
| pub span: Span, | |
| pub vis: &'a str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_macro_invocation_visibility)] | |
| #[help] | |
| pub(crate) struct MacroInvocationVisibility<'a> { | |
| #[primary_span] | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| pub vis: &'a str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_nested_adt)] | |
| pub(crate) struct NestedAdt<'a> { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = "", applicability = "maybe-incorrect", style = "verbose")] | |
| pub item: Span, | |
| pub keyword: &'a str, | |
| pub kw_str: Cow<'a, str>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_function_body_equals_expr)] | |
| pub(crate) struct FunctionBodyEqualsExpr { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub sugg: FunctionBodyEqualsExprSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct FunctionBodyEqualsExprSugg { | |
| #[suggestion_part(code = "{{")] | |
| pub eq: Span, | |
| #[suggestion_part(code = " }}")] | |
| pub semi: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_box_not_pat)] | |
| pub(crate) struct BoxNotPat { | |
| #[primary_span] | |
| pub span: Span, | |
| #[note] | |
| pub kw: Span, | |
| #[suggestion(code = "r#", applicability = "maybe-incorrect", style = "verbose")] | |
| pub lo: Span, | |
| pub descr: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unmatched_angle)] | |
| pub(crate) struct UnmatchedAngle { | |
| #[primary_span] | |
| #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")] | |
| pub span: Span, | |
| pub plural: bool, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_missing_plus_in_bounds)] | |
| pub(crate) struct MissingPlusBounds { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion(code = " +", applicability = "maybe-incorrect", style = "verbose")] | |
| pub hi: Span, | |
| pub sym: Symbol, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_incorrect_parens_trait_bounds)] | |
| pub(crate) struct IncorrectParensTraitBounds { | |
| #[primary_span] | |
| pub span: Vec<Span>, | |
| #[subdiagnostic] | |
| pub sugg: IncorrectParensTraitBoundsSugg, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion( | |
| parse_incorrect_parens_trait_bounds_sugg, | |
| applicability = "machine-applicable" | |
| )] | |
| pub(crate) struct IncorrectParensTraitBoundsSugg { | |
| #[suggestion_part(code = " ")] | |
| pub wrong_span: Span, | |
| #[suggestion_part(code = "(")] | |
| pub new_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_kw_bad_case)] | |
| pub(crate) struct KwBadCase<'a> { | |
| #[primary_span] | |
| #[suggestion(code = "{kw}", style = "verbose", applicability = "machine-applicable")] | |
| pub span: Span, | |
| pub kw: &'a str, | |
| pub case: Case, | |
| } | |
| pub(crate) enum Case { | |
| Upper, | |
| Lower, | |
| Mixed, | |
| } | |
| impl IntoDiagArg for Case { | |
| fn into_diag_arg(self, path: &mut Option<PathBuf>) -> DiagArgValue { | |
| match self { | |
| Case::Upper => "uppercase", | |
| Case::Lower => "lowercase", | |
| Case::Mixed => "the correct case", | |
| } | |
| .into_diag_arg(path) | |
| } | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_unknown_builtin_construct)] | |
| pub(crate) struct UnknownBuiltinConstruct { | |
| #[primary_span] | |
| pub span: Span, | |
| pub name: Ident, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expected_builtin_ident)] | |
| pub(crate) struct ExpectedBuiltinIdent { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_static_with_generics)] | |
| pub(crate) struct StaticWithGenerics { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_where_clause_before_const_body)] | |
| pub(crate) struct WhereClauseBeforeConstBody { | |
| #[primary_span] | |
| #[label] | |
| pub span: Span, | |
| #[label(parse_name_label)] | |
| pub name: Span, | |
| #[label(parse_body_label)] | |
| pub body: Span, | |
| #[subdiagnostic] | |
| pub sugg: Option<WhereClauseBeforeConstBodySugg>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct WhereClauseBeforeConstBodySugg { | |
| #[suggestion_part(code = "= {snippet} ")] | |
| pub left: Span, | |
| pub snippet: String, | |
| #[suggestion_part(code = "")] | |
| pub right: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_generic_args_in_pat_require_turbofish_syntax)] | |
| pub(crate) struct GenericArgsInPatRequireTurbofishSyntax { | |
| #[primary_span] | |
| pub span: Span, | |
| #[suggestion( | |
| parse_sugg_turbofish_syntax, | |
| style = "verbose", | |
| code = "::", | |
| applicability = "maybe-incorrect" | |
| )] | |
| pub suggest_turbofish: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_transpose_dyn_or_impl)] | |
| pub(crate) struct TransposeDynOrImpl<'a> { | |
| #[primary_span] | |
| pub span: Span, | |
| pub kw: &'a str, | |
| #[subdiagnostic] | |
| pub sugg: TransposeDynOrImplSugg<'a>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct TransposeDynOrImplSugg<'a> { | |
| #[suggestion_part(code = "")] | |
| pub removal_span: Span, | |
| #[suggestion_part(code = "{kw} ")] | |
| pub insertion_span: Span, | |
| pub kw: &'a str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_array_index_offset_of)] | |
| pub(crate) struct ArrayIndexInOffsetOf(#[primary_span] pub Span); | |
| #[derive(Diagnostic)] | |
| #[diag(parse_invalid_offset_of)] | |
| pub(crate) struct InvalidOffsetOf(#[primary_span] pub Span); | |
| #[derive(Diagnostic)] | |
| #[diag(parse_async_impl)] | |
| pub(crate) struct AsyncImpl { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_expr_rarrow_call)] | |
| #[help] | |
| pub(crate) struct ExprRArrowCall { | |
| #[primary_span] | |
| #[suggestion(style = "verbose", applicability = "machine-applicable", code = ".")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_dot_dot_range_attribute)] | |
| pub(crate) struct DotDotRangeAttribute { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_binder_before_modifiers)] | |
| pub(crate) struct BinderBeforeModifiers { | |
| #[primary_span] | |
| pub binder_span: Span, | |
| #[label] | |
| pub modifiers_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_binder_and_polarity)] | |
| pub(crate) struct BinderAndPolarity { | |
| #[primary_span] | |
| pub polarity_span: Span, | |
| #[label] | |
| pub binder_span: Span, | |
| pub polarity: &'static str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_modifiers_and_polarity)] | |
| pub(crate) struct PolarityAndModifiers { | |
| #[primary_span] | |
| pub polarity_span: Span, | |
| #[label] | |
| pub modifiers_span: Span, | |
| pub polarity: &'static str, | |
| pub modifiers_concatenated: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_incorrect_type_on_self)] | |
| pub(crate) struct IncorrectTypeOnSelf { | |
| #[primary_span] | |
| pub span: Span, | |
| #[subdiagnostic] | |
| pub move_self_modifier: MoveSelfModifier, | |
| } | |
| #[derive(Subdiagnostic)] | |
| #[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")] | |
| pub(crate) struct MoveSelfModifier { | |
| #[suggestion_part(code = "")] | |
| pub removal_span: Span, | |
| #[suggestion_part(code = "{modifier}")] | |
| pub insertion_span: Span, | |
| pub modifier: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_unsupported_operand)] | |
| pub(crate) struct AsmUnsupportedOperand<'a> { | |
| #[primary_span] | |
| #[label] | |
| pub(crate) span: Span, | |
| pub(crate) symbol: &'a str, | |
| pub(crate) macro_name: &'static str, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_underscore_input)] | |
| pub(crate) struct AsmUnderscoreInput { | |
| #[primary_span] | |
| pub(crate) span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_sym_no_path)] | |
| pub(crate) struct AsmSymNoPath { | |
| #[primary_span] | |
| pub(crate) span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_requires_template)] | |
| pub(crate) struct AsmRequiresTemplate { | |
| #[primary_span] | |
| pub(crate) span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_expected_comma)] | |
| pub(crate) struct AsmExpectedComma { | |
| #[primary_span] | |
| #[label] | |
| pub(crate) span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_expected_other)] | |
| pub(crate) struct AsmExpectedOther { | |
| #[primary_span] | |
| #[label(parse_asm_expected_other)] | |
| pub(crate) span: Span, | |
| pub(crate) is_inline_asm: bool, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_non_abi)] | |
| pub(crate) struct NonABI { | |
| #[primary_span] | |
| pub(crate) span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_expected_string_literal)] | |
| pub(crate) struct AsmExpectedStringLiteral { | |
| #[primary_span] | |
| #[label] | |
| pub(crate) span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_asm_expected_register_class_or_explicit_register)] | |
| pub(crate) struct ExpectedRegisterClassOrExplicitRegister { | |
| #[primary_span] | |
| pub(crate) span: Span, | |
| } | |
| #[derive(LintDiagnostic)] | |
| #[diag(parse_hidden_unicode_codepoints)] | |
| #[note] | |
| pub(crate) struct HiddenUnicodeCodepointsDiag { | |
| pub label: String, | |
| pub count: usize, | |
| #[label] | |
| pub span_label: Span, | |
| #[subdiagnostic] | |
| pub labels: Option<HiddenUnicodeCodepointsDiagLabels>, | |
| #[subdiagnostic] | |
| pub sub: HiddenUnicodeCodepointsDiagSub, | |
| } | |
| pub(crate) struct HiddenUnicodeCodepointsDiagLabels { | |
| pub spans: Vec<(char, Span)>, | |
| } | |
| impl Subdiagnostic for HiddenUnicodeCodepointsDiagLabels { | |
| fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) { | |
| for (c, span) in self.spans { | |
| diag.span_label(span, format!("{c:?}")); | |
| } | |
| } | |
| } | |
| pub(crate) enum HiddenUnicodeCodepointsDiagSub { | |
| Escape { spans: Vec<(char, Span)> }, | |
| NoEscape { spans: Vec<(char, Span)> }, | |
| } | |
| // Used because of multiple multipart_suggestion and note | |
| impl Subdiagnostic for HiddenUnicodeCodepointsDiagSub { | |
| fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) { | |
| match self { | |
| HiddenUnicodeCodepointsDiagSub::Escape { spans } => { | |
| diag.multipart_suggestion_with_style( | |
| fluent::parse_suggestion_remove, | |
| spans.iter().map(|(_, span)| (*span, "".to_string())).collect(), | |
| Applicability::MachineApplicable, | |
| SuggestionStyle::HideCodeAlways, | |
| ); | |
| diag.multipart_suggestion( | |
| fluent::parse_suggestion_escape, | |
| spans | |
| .into_iter() | |
| .map(|(c, span)| { | |
| let c = format!("{c:?}"); | |
| (span, c[1..c.len() - 1].to_string()) | |
| }) | |
| .collect(), | |
| Applicability::MachineApplicable, | |
| ); | |
| } | |
| HiddenUnicodeCodepointsDiagSub::NoEscape { spans } => { | |
| // FIXME: in other suggestions we've reversed the inner spans of doc comments. We | |
| // should do the same here to provide the same good suggestions as we do for | |
| // literals above. | |
| diag.arg( | |
| "escaped", | |
| spans | |
| .into_iter() | |
| .map(|(c, _)| format!("{c:?}")) | |
| .collect::<Vec<String>>() | |
| .join(", "), | |
| ); | |
| diag.note(fluent::parse_suggestion_remove); | |
| diag.note(fluent::parse_no_suggestion_note_escape); | |
| } | |
| } | |
| } | |
| } | |
| #[derive(LintDiagnostic)] | |
| #[diag(parse_varargs_without_pattern)] | |
| pub(crate) struct VarargsWithoutPattern { | |
| #[suggestion(code = "_: ...", applicability = "machine-applicable")] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag(parse_delegation_non_trait_impl_reuse)] | |
| pub(crate) struct ImplReuseInherentImpl { | |
| #[primary_span] | |
| pub span: Span, | |
| } |