feat(rustc_lint): make CheckLintName
respect lint level
This commit is contained in:
parent
cdbad43aba
commit
a11805ae46
24 changed files with 201 additions and 181 deletions
|
@ -1,7 +1,5 @@
|
|||
use crate::fluent_generated as fluent;
|
||||
use rustc_errors::{
|
||||
AddToDiagnostic, Diagnostic, ErrorGuaranteed, Handler, IntoDiagnostic, SubdiagnosticMessage,
|
||||
};
|
||||
use rustc_errors::{AddToDiagnostic, Diagnostic, SubdiagnosticMessage};
|
||||
use rustc_macros::{Diagnostic, Subdiagnostic};
|
||||
use rustc_session::lint::Level;
|
||||
use rustc_span::{Span, Symbol};
|
||||
|
@ -102,29 +100,6 @@ pub struct UnsupportedGroup {
|
|||
pub lint_group: String,
|
||||
}
|
||||
|
||||
pub struct CheckNameUnknown<'a> {
|
||||
pub lint_name: &'a str,
|
||||
pub suggestion: Option<Symbol>,
|
||||
pub sub: RequestedLevel<'a>,
|
||||
}
|
||||
|
||||
impl IntoDiagnostic<'_> for CheckNameUnknown<'_> {
|
||||
fn into_diagnostic(
|
||||
self,
|
||||
handler: &Handler,
|
||||
) -> rustc_errors::DiagnosticBuilder<'_, ErrorGuaranteed> {
|
||||
let mut diag = handler.struct_err(fluent::lint_check_name_unknown);
|
||||
diag.code(rustc_errors::error_code!(E0602));
|
||||
if let Some(suggestion) = self.suggestion {
|
||||
diag.help(fluent::lint_help);
|
||||
diag.set_arg("suggestion", suggestion);
|
||||
}
|
||||
diag.set_arg("lint_name", self.lint_name);
|
||||
diag.subdiagnostic(self.sub);
|
||||
diag
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(lint_check_name_unknown_tool, code = "E0602")]
|
||||
pub struct CheckNameUnknownTool<'a> {
|
||||
|
@ -132,30 +107,3 @@ pub struct CheckNameUnknownTool<'a> {
|
|||
#[subdiagnostic]
|
||||
pub sub: RequestedLevel<'a>,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(lint_check_name_renamed)]
|
||||
pub struct CheckNameRenamed<'a> {
|
||||
pub lint_name: &'a str,
|
||||
pub replace: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub sub: RequestedLevel<'a>,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(lint_check_name_removed)]
|
||||
pub struct CheckNameRemoved<'a> {
|
||||
pub lint_name: &'a str,
|
||||
pub reason: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub sub: RequestedLevel<'a>,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(lint_check_name_deprecated)]
|
||||
pub struct CheckNameDeprecated<'a> {
|
||||
pub lint_name: &'a str,
|
||||
pub new_name: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub sub: RequestedLevel<'a>,
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
use crate::errors::{
|
||||
CheckNameDeprecated, CheckNameRemoved, CheckNameRenamed, CheckNameUnknown,
|
||||
CheckNameUnknownTool, RequestedLevel, UnsupportedGroup,
|
||||
use crate::errors::{CheckNameUnknownTool, RequestedLevel, UnsupportedGroup};
|
||||
use crate::lints::{
|
||||
DeprecatedLintNameFromCommandLine, RemovedLintFromCommandLine, RenamedLintFromCommandLine,
|
||||
UnknownLintFromCommandLine,
|
||||
};
|
||||
use crate::{
|
||||
builtin::MISSING_DOCS,
|
||||
|
@ -564,33 +565,32 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
self.sess.emit_err(UnsupportedGroup { lint_group: crate::WARNINGS.name_lower() });
|
||||
}
|
||||
match self.store.check_lint_name(lint_name_only, tool_name, self.registered_tools) {
|
||||
CheckLintNameResult::Renamed(replace) => {
|
||||
self.sess.emit_warning(CheckNameRenamed {
|
||||
lint_name,
|
||||
replace: &replace,
|
||||
sub: RequestedLevel { level, lint_name },
|
||||
});
|
||||
CheckLintNameResult::Renamed(ref replace) => {
|
||||
let name = lint_name.as_str();
|
||||
let suggestion = RenamedLintSuggestion::WithoutSpan { replace };
|
||||
let requested_level = RequestedLevel { level, lint_name };
|
||||
let lint = RenamedLintFromCommandLine { name, suggestion, requested_level };
|
||||
self.emit_lint(RENAMED_AND_REMOVED_LINTS, lint);
|
||||
}
|
||||
CheckLintNameResult::Removed(reason) => {
|
||||
self.sess.emit_warning(CheckNameRemoved {
|
||||
lint_name,
|
||||
reason: &reason,
|
||||
sub: RequestedLevel { level, lint_name },
|
||||
});
|
||||
CheckLintNameResult::Removed(ref reason) => {
|
||||
let name = lint_name.as_str();
|
||||
let requested_level = RequestedLevel { level, lint_name };
|
||||
let lint = RemovedLintFromCommandLine { name, reason, requested_level };
|
||||
self.emit_lint(RENAMED_AND_REMOVED_LINTS, lint);
|
||||
}
|
||||
CheckLintNameResult::NoLint(suggestion) => {
|
||||
self.sess.emit_err(CheckNameUnknown {
|
||||
lint_name,
|
||||
suggestion,
|
||||
sub: RequestedLevel { level, lint_name },
|
||||
});
|
||||
let name = lint_name.clone();
|
||||
let suggestion =
|
||||
suggestion.map(|replace| UnknownLintSuggestion::WithoutSpan { replace });
|
||||
let requested_level = RequestedLevel { level, lint_name };
|
||||
let lint = UnknownLintFromCommandLine { name, suggestion, requested_level };
|
||||
self.emit_lint(UNKNOWN_LINTS, lint);
|
||||
}
|
||||
CheckLintNameResult::Tool(Err((Some(_), new_name))) => {
|
||||
self.sess.emit_warning(CheckNameDeprecated {
|
||||
lint_name,
|
||||
new_name: &new_name,
|
||||
sub: RequestedLevel { level, lint_name },
|
||||
});
|
||||
CheckLintNameResult::Tool(Err((Some(_), ref replace))) => {
|
||||
let name = lint_name.clone();
|
||||
let requested_level = RequestedLevel { level, lint_name };
|
||||
let lint = DeprecatedLintNameFromCommandLine { name, replace, requested_level };
|
||||
self.emit_lint(RENAMED_AND_REMOVED_LINTS, lint);
|
||||
}
|
||||
CheckLintNameResult::NoTool => {
|
||||
self.sess.emit_err(CheckNameUnknownTool {
|
||||
|
@ -963,24 +963,18 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
|
||||
_ if !self.warn_about_weird_lints => {}
|
||||
|
||||
CheckLintNameResult::Renamed(new_name) => {
|
||||
CheckLintNameResult::Renamed(ref replace) => {
|
||||
let suggestion =
|
||||
RenamedLintSuggestion { suggestion: sp, replace: new_name.as_str() };
|
||||
RenamedLintSuggestion::WithSpan { suggestion: sp, replace };
|
||||
let name = tool_ident.map(|tool| format!("{tool}::{name}")).unwrap_or(name);
|
||||
self.emit_spanned_lint(
|
||||
RENAMED_AND_REMOVED_LINTS,
|
||||
sp.into(),
|
||||
RenamedLint { name: name.as_str(), suggestion },
|
||||
);
|
||||
let lint = RenamedLint { name: name.as_str(), suggestion };
|
||||
self.emit_spanned_lint(RENAMED_AND_REMOVED_LINTS, sp.into(), lint);
|
||||
}
|
||||
|
||||
CheckLintNameResult::Removed(reason) => {
|
||||
CheckLintNameResult::Removed(ref reason) => {
|
||||
let name = tool_ident.map(|tool| format!("{tool}::{name}")).unwrap_or(name);
|
||||
self.emit_spanned_lint(
|
||||
RENAMED_AND_REMOVED_LINTS,
|
||||
sp.into(),
|
||||
RemovedLint { name: name.as_str(), reason: reason.as_str() },
|
||||
);
|
||||
let lint = RemovedLint { name: name.as_str(), reason };
|
||||
self.emit_spanned_lint(RENAMED_AND_REMOVED_LINTS, sp.into(), lint);
|
||||
}
|
||||
|
||||
CheckLintNameResult::NoLint(suggestion) => {
|
||||
|
@ -989,13 +983,11 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
} else {
|
||||
name.to_string()
|
||||
};
|
||||
let suggestion = suggestion
|
||||
.map(|replace| UnknownLintSuggestion { suggestion: sp, replace });
|
||||
self.emit_spanned_lint(
|
||||
UNKNOWN_LINTS,
|
||||
sp.into(),
|
||||
UnknownLint { name, suggestion },
|
||||
);
|
||||
let suggestion = suggestion.map(|replace| {
|
||||
UnknownLintSuggestion::WithSpan { suggestion: sp, replace }
|
||||
});
|
||||
let lint = UnknownLint { name, suggestion };
|
||||
self.emit_spanned_lint(UNKNOWN_LINTS, sp.into(), lint);
|
||||
}
|
||||
}
|
||||
// If this lint was renamed, apply the new lint instead of ignoring the attribute.
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#![allow(rustc::diagnostic_outside_of_impl)]
|
||||
use std::num::NonZeroU32;
|
||||
|
||||
use crate::errors::RequestedLevel;
|
||||
use crate::fluent_generated as fluent;
|
||||
use rustc_errors::{
|
||||
AddToDiagnostic, Applicability, DecorateLint, DiagnosticMessage, DiagnosticStyledString,
|
||||
|
@ -1012,6 +1013,16 @@ pub struct DeprecatedLintName<'a> {
|
|||
pub replace: &'a str,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_deprecated_lint_name)]
|
||||
#[help]
|
||||
pub struct DeprecatedLintNameFromCommandLine<'a> {
|
||||
pub name: String,
|
||||
pub replace: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub requested_level: RequestedLevel<'a>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_renamed_lint)]
|
||||
pub struct RenamedLint<'a> {
|
||||
|
@ -1021,11 +1032,25 @@ pub struct RenamedLint<'a> {
|
|||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[suggestion(lint_suggestion, code = "{replace}", applicability = "machine-applicable")]
|
||||
pub struct RenamedLintSuggestion<'a> {
|
||||
#[primary_span]
|
||||
pub suggestion: Span,
|
||||
pub replace: &'a str,
|
||||
pub enum RenamedLintSuggestion<'a> {
|
||||
#[suggestion(lint_suggestion, code = "{replace}", applicability = "machine-applicable")]
|
||||
WithSpan {
|
||||
#[primary_span]
|
||||
suggestion: Span,
|
||||
replace: &'a str,
|
||||
},
|
||||
#[help(lint_help)]
|
||||
WithoutSpan { replace: &'a str },
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_renamed_lint)]
|
||||
pub struct RenamedLintFromCommandLine<'a> {
|
||||
pub name: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub suggestion: RenamedLintSuggestion<'a>,
|
||||
#[subdiagnostic]
|
||||
pub requested_level: RequestedLevel<'a>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
|
@ -1035,6 +1060,15 @@ pub struct RemovedLint<'a> {
|
|||
pub reason: &'a str,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_removed_lint)]
|
||||
pub struct RemovedLintFromCommandLine<'a> {
|
||||
pub name: &'a str,
|
||||
pub reason: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub requested_level: RequestedLevel<'a>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_unknown_lint)]
|
||||
pub struct UnknownLint {
|
||||
|
@ -1044,11 +1078,25 @@ pub struct UnknownLint {
|
|||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[suggestion(lint_suggestion, code = "{replace}", applicability = "maybe-incorrect")]
|
||||
pub struct UnknownLintSuggestion {
|
||||
#[primary_span]
|
||||
pub suggestion: Span,
|
||||
pub replace: Symbol,
|
||||
pub enum UnknownLintSuggestion {
|
||||
#[suggestion(lint_suggestion, code = "{replace}", applicability = "maybe-incorrect")]
|
||||
WithSpan {
|
||||
#[primary_span]
|
||||
suggestion: Span,
|
||||
replace: Symbol,
|
||||
},
|
||||
#[help(lint_help)]
|
||||
WithoutSpan { replace: Symbol },
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_unknown_lint, code = "E0602")]
|
||||
pub struct UnknownLintFromCommandLine<'a> {
|
||||
pub name: String,
|
||||
#[subdiagnostic]
|
||||
pub suggestion: Option<UnknownLintSuggestion>,
|
||||
#[subdiagnostic]
|
||||
pub requested_level: RequestedLevel<'a>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue