mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-28 11:17:26 +03:00
52d4ef12a8
T-lang came back on the stabilization PR asking for CR to be disallowed to leave room for all stray CRs to be rejected in the future. At that point, the test can remain but the implementation can be removed. If that plan does not go through, we'll need to re-evaluate - whether this is more lint-like and should defer to the calling tool that is managing the frontmatter - how much Rust should treat the frontmatter as Rust and apply the same grammar restrictions of "no stray CR" (like raw string literals)
3713 lines
96 KiB
Rust
3713 lines
96 KiB
Rust
// 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_bare_cr_in_frontmatter)]
|
|
pub(crate) struct BareCrFrontmatter {
|
|
#[primary_span]
|
|
pub span: Span,
|
|
}
|
|
|
|
#[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>,
|
|
#[subdiagnostic]
|
|
pub invisible: Option<InvisibleCharacter>,
|
|
}
|
|
|
|
#[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_invisible_char)]
|
|
pub(crate) struct InvisibleCharacter;
|
|
|
|
#[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,
|
|
}
|
|
|
|
#[derive(Diagnostic)]
|
|
#[diag(parse_struct_literal_placeholder_path)]
|
|
pub(crate) struct StructLiteralPlaceholderPath {
|
|
#[primary_span]
|
|
#[label]
|
|
#[suggestion(applicability = "has-placeholders", code = "/* Type */", style = "verbose")]
|
|
pub span: Span,
|
|
}
|
|
|
|
#[derive(Diagnostic)]
|
|
#[diag(parse_struct_literal_body_without_path_late)]
|
|
pub(crate) struct StructLiteralWithoutPathLate {
|
|
#[primary_span]
|
|
#[label]
|
|
pub span: Span,
|
|
#[suggestion(applicability = "has-placeholders", code = "/* Type */ ", style = "verbose")]
|
|
pub suggestion_span: Span,
|
|
}
|