Add internal lint for detecting non-glob imports of rustc_type_ir::inherent
This commit is contained in:
parent
44fb8575de
commit
2507301de0
9 changed files with 168 additions and 2 deletions
|
@ -3,7 +3,8 @@
|
|||
|
||||
use crate::lints::{
|
||||
BadOptAccessDiag, DefaultHashTypesDiag, DiagOutOfImpl, LintPassByHand, NonExistentDocKeyword,
|
||||
QueryInstability, SpanUseEqCtxtDiag, TyQualified, TykindDiag, TykindKind, UntranslatableDiag,
|
||||
NonGlobImportTypeIrInherent, QueryInstability, SpanUseEqCtxtDiag, TyQualified, TykindDiag,
|
||||
TykindKind, UntranslatableDiag,
|
||||
};
|
||||
use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext};
|
||||
use rustc_ast as ast;
|
||||
|
@ -263,6 +264,49 @@ fn gen_args(segment: &PathSegment<'_>) -> String {
|
|||
String::new()
|
||||
}
|
||||
|
||||
declare_tool_lint! {
|
||||
/// The `non_glob_import_of_type_ir_inherent_item` lint detects
|
||||
/// non-glob imports of module `rustc_type_ir::inherent`.
|
||||
pub rustc::NON_GLOB_IMPORT_OF_TYPE_IR_INHERENT,
|
||||
Allow,
|
||||
"non-glob import of `rustc_type_ir::inherent`",
|
||||
report_in_external_macro: true
|
||||
}
|
||||
|
||||
declare_lint_pass!(TypeIr => [NON_GLOB_IMPORT_OF_TYPE_IR_INHERENT]);
|
||||
|
||||
impl<'tcx> LateLintPass<'tcx> for TypeIr {
|
||||
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'tcx>) {
|
||||
let rustc_hir::ItemKind::Use(path, kind) = item.kind else { return };
|
||||
|
||||
let is_mod_inherent = |def_id| cx.tcx.is_diagnostic_item(sym::type_ir_inherent, def_id);
|
||||
let (lo, hi, snippet) = match path.segments {
|
||||
[.., penultimate, segment]
|
||||
if penultimate.res.opt_def_id().is_some_and(is_mod_inherent) =>
|
||||
{
|
||||
(segment.ident.span, item.ident.span, "*")
|
||||
}
|
||||
[.., segment]
|
||||
if path.res.iter().flat_map(Res::opt_def_id).any(is_mod_inherent)
|
||||
&& let rustc_hir::UseKind::Single = kind =>
|
||||
{
|
||||
let (lo, snippet) =
|
||||
match cx.tcx.sess.source_map().span_to_snippet(path.span).as_deref() {
|
||||
Ok("self") => (path.span, "*"),
|
||||
_ => (segment.ident.span.shrink_to_hi(), "::*"),
|
||||
};
|
||||
(lo, if segment.ident == item.ident { lo } else { item.ident.span }, snippet)
|
||||
}
|
||||
_ => return,
|
||||
};
|
||||
cx.emit_span_lint(
|
||||
NON_GLOB_IMPORT_OF_TYPE_IR_INHERENT,
|
||||
path.span,
|
||||
NonGlobImportTypeIrInherent { suggestion: lo.eq_ctxt(hi).then(|| lo.to(hi)), snippet },
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
declare_tool_lint! {
|
||||
/// The `lint_pass_impl_without_macro` detects manual implementations of a lint
|
||||
/// pass, without using [`declare_lint_pass`] or [`impl_lint_pass`].
|
||||
|
|
|
@ -573,6 +573,8 @@ fn register_internals(store: &mut LintStore) {
|
|||
store.register_late_mod_pass(|_| Box::new(ExistingDocKeyword));
|
||||
store.register_lints(&TyTyKind::get_lints());
|
||||
store.register_late_mod_pass(|_| Box::new(TyTyKind));
|
||||
store.register_lints(&TypeIr::get_lints());
|
||||
store.register_late_mod_pass(|_| Box::new(TypeIr));
|
||||
store.register_lints(&Diagnostics::get_lints());
|
||||
store.register_late_mod_pass(|_| Box::new(Diagnostics));
|
||||
store.register_lints(&BadOptAccess::get_lints());
|
||||
|
@ -596,6 +598,7 @@ fn register_internals(store: &mut LintStore) {
|
|||
LintId::of(PASS_BY_VALUE),
|
||||
LintId::of(LINT_PASS_IMPL_WITHOUT_MACRO),
|
||||
LintId::of(USAGE_OF_QUALIFIED_TY),
|
||||
LintId::of(NON_GLOB_IMPORT_OF_TYPE_IR_INHERENT),
|
||||
LintId::of(EXISTING_DOC_KEYWORD),
|
||||
LintId::of(BAD_OPT_ACCESS),
|
||||
LintId::of(SPAN_USE_EQ_CTXT),
|
||||
|
|
|
@ -926,6 +926,14 @@ pub struct TyQualified {
|
|||
pub suggestion: Span,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_non_glob_import_type_ir_inherent)]
|
||||
pub struct NonGlobImportTypeIrInherent {
|
||||
#[suggestion(code = "{snippet}", applicability = "maybe-incorrect")]
|
||||
pub suggestion: Option<Span>,
|
||||
pub snippet: &'static str,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_lintpass_by_hand)]
|
||||
#[help]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue