Migrate lint reports in typeck::check_unused to LintDiagnostic

This commit is contained in:
PragmaTwice 2022-08-17 17:47:44 +08:00
parent 86c6ebee8f
commit 98fb65eff9
3 changed files with 53 additions and 36 deletions

View File

@ -123,3 +123,11 @@ typeck_manual_implementation =
.help = add `#![feature(unboxed_closures)]` to the crate attributes to enable .help = add `#![feature(unboxed_closures)]` to the crate attributes to enable
typeck_substs_on_overridden_impl = could not resolve substs on overridden impl typeck_substs_on_overridden_impl = could not resolve substs on overridden impl
typeck_unused_extern_crate =
unused extern crate
.suggestion = remove it
typeck_extern_crate_not_idiomatic =
`extern crate` is not idiomatic in the new edition
.suggestion = convert it to a `{$msg_code}`

View File

@ -1,5 +1,5 @@
use crate::errors::{ExternCrateNotIdiomatic, UnusedExternCrate};
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_errors::Applicability;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::def_id::{DefId, LocalDefId};
@ -108,9 +108,8 @@ fn unused_crates_lint(tcx: TyCtxt<'_>) {
// We do this in any edition. // We do this in any edition.
if extern_crate.warn_if_unused { if extern_crate.warn_if_unused {
if let Some(&span) = unused_extern_crates.get(&def_id) { if let Some(&span) = unused_extern_crates.get(&def_id) {
let id = tcx.hir().local_def_id_to_hir_id(def_id);
tcx.struct_span_lint_hir(lint, id, span, |lint| {
// Removal suggestion span needs to include attributes (Issue #54400) // Removal suggestion span needs to include attributes (Issue #54400)
let id = tcx.hir().local_def_id_to_hir_id(def_id);
let span_with_attrs = tcx let span_with_attrs = tcx
.hir() .hir()
.attrs(id) .attrs(id)
@ -118,15 +117,7 @@ fn unused_crates_lint(tcx: TyCtxt<'_>) {
.map(|attr| attr.span) .map(|attr| attr.span)
.fold(span, |acc, attr_span| acc.to(attr_span)); .fold(span, |acc, attr_span| acc.to(attr_span));
lint.build("unused extern crate") tcx.emit_spanned_lint(lint, id, span, UnusedExternCrate { span: span_with_attrs });
.span_suggestion_short(
span_with_attrs,
"remove it",
"",
Applicability::MachineApplicable,
)
.emit();
});
continue; continue;
} }
} }
@ -158,23 +149,23 @@ fn unused_crates_lint(tcx: TyCtxt<'_>) {
if !tcx.hir().attrs(id).is_empty() { if !tcx.hir().attrs(id).is_empty() {
continue; continue;
} }
tcx.struct_span_lint_hir(lint, id, extern_crate.span, |lint| {
// Otherwise, we can convert it into a `use` of some kind.
let base_replacement = match extern_crate.orig_name { let base_replacement = match extern_crate.orig_name {
Some(orig_name) => format!("use {} as {};", orig_name, item.ident.name), Some(orig_name) => format!("use {} as {};", orig_name, item.ident.name),
None => format!("use {};", item.ident.name), None => format!("use {};", item.ident.name),
}; };
let vis = tcx.sess.source_map().span_to_snippet(item.vis_span).unwrap_or_default(); let vis = tcx.sess.source_map().span_to_snippet(item.vis_span).unwrap_or_default();
let add_vis = |to| if vis.is_empty() { to } else { format!("{} {}", vis, to) }; let add_vis = |to| if vis.is_empty() { to } else { format!("{} {}", vis, to) };
lint.build("`extern crate` is not idiomatic in the new edition") tcx.emit_spanned_lint(
.span_suggestion_short( lint,
id,
extern_crate.span, extern_crate.span,
&format!("convert it to a `{}`", add_vis("use".to_string())), ExternCrateNotIdiomatic {
add_vis(base_replacement), span: extern_crate.span,
Applicability::MachineApplicable, msg_code: add_vis("use".to_string()),
) suggestion_code: add_vis(base_replacement),
.emit(); },
}) );
} }
} }

View File

@ -1,6 +1,6 @@
//! Errors emitted by typeck. //! Errors emitted by typeck.
use rustc_errors::{error_code, Applicability, DiagnosticBuilder, ErrorGuaranteed}; use rustc_errors::{error_code, Applicability, DiagnosticBuilder, ErrorGuaranteed};
use rustc_macros::{SessionDiagnostic, SessionSubdiagnostic}; use rustc_macros::{LintDiagnostic, SessionDiagnostic, SessionSubdiagnostic};
use rustc_middle::ty::Ty; use rustc_middle::ty::Ty;
use rustc_session::{parse::ParseSess, SessionDiagnostic}; use rustc_session::{parse::ParseSess, SessionDiagnostic};
use rustc_span::{symbol::Ident, Span, Symbol}; use rustc_span::{symbol::Ident, Span, Symbol};
@ -324,3 +324,21 @@ pub struct SubstsOnOverriddenImpl {
#[primary_span] #[primary_span]
pub span: Span, pub span: Span,
} }
#[derive(LintDiagnostic)]
#[lint(typeck::unused_extern_crate)]
pub struct UnusedExternCrate {
#[primary_span]
#[suggestion(applicability = "machine-applicable", code = "")]
pub span: Span,
}
#[derive(LintDiagnostic)]
#[lint(typeck::extern_crate_not_idiomatic)]
pub struct ExternCrateNotIdiomatic {
#[primary_span]
#[suggestion(applicability = "machine-applicable", code = "{suggestion_code}")]
pub span: Span,
pub msg_code: String,
pub suggestion_code: String,
}