Remove more BuiltinLintDiag in rustc_resolve

This commit is contained in:
Guillaume Gomez
2026-03-23 21:14:54 +01:00
parent 45027f1788
commit 5d7f89417c
7 changed files with 143 additions and 201 deletions
@@ -87,18 +87,6 @@ fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
}
.into_diag(dcx, level)
}
BuiltinLintDiag::RedundantImport(spans, ident) => {
let subs = spans
.into_iter()
.map(|(span, is_imported)| match (span.is_dummy(), is_imported) {
(false, true) => lints::RedundantImportSub::ImportedHere { span, ident },
(false, false) => lints::RedundantImportSub::DefinedHere { span, ident },
(true, true) => lints::RedundantImportSub::ImportedPrelude { span, ident },
(true, false) => lints::RedundantImportSub::DefinedPrelude { span, ident },
})
.collect();
lints::RedundantImport { subs, ident }.into_diag(dcx, level)
}
BuiltinLintDiag::SingleUseLifetime {
param_span,
use_span,
@@ -164,49 +152,6 @@ fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
}
.into_diag(dcx, level)
}
BuiltinLintDiag::AmbiguousGlobReexports {
name,
namespace,
first_reexport_span,
duplicate_reexport_span,
} => lints::AmbiguousGlobReexports {
first_reexport: first_reexport_span,
duplicate_reexport: duplicate_reexport_span,
name,
namespace,
}
.into_diag(dcx, level),
BuiltinLintDiag::HiddenGlobReexports {
name,
namespace,
glob_reexport_span,
private_item_span,
} => lints::HiddenGlobReexports {
glob_reexport: glob_reexport_span,
private_item: private_item_span,
name,
namespace,
}
.into_diag(dcx, level),
BuiltinLintDiag::UnusedQualifications { removal_span } => {
lints::UnusedQualifications { removal_span }.into_diag(dcx, level)
}
BuiltinLintDiag::AssociatedConstElidedLifetime {
elided,
span: lt_span,
lifetimes_in_scope,
} => {
let lt_span = if elided { lt_span.shrink_to_hi() } else { lt_span };
let code = if elided { "'static " } else { "'static" };
lints::AssociatedConstElidedLifetime {
span: lt_span,
code,
elided,
lifetimes_in_scope,
}
.into_diag(dcx, level)
}
BuiltinLintDiag::UnusedCrateDependency { extern_crate, local_crate } => {
lints::UnusedCrateDependency { extern_crate, local_crate }.into_diag(dcx, level)
+1 -98
View File
@@ -6,8 +6,7 @@
use rustc_errors::formatting::DiagMessageAddArg;
use rustc_errors::{
Applicability, Diag, DiagArgValue, DiagCtxtHandle, DiagMessage, DiagStyledString, Diagnostic,
ElidedLifetimeInPathSubdiag, EmissionGuarantee, Level, MultiSpan, Subdiagnostic,
SuggestionStyle, msg,
ElidedLifetimeInPathSubdiag, EmissionGuarantee, Level, Subdiagnostic, SuggestionStyle, msg,
};
use rustc_hir as hir;
use rustc_hir::def_id::DefId;
@@ -3089,42 +3088,6 @@ pub(crate) enum UnusedImportsSugg {
},
}
#[derive(Diagnostic)]
#[diag("the item `{$ident}` is imported redundantly")]
pub(crate) struct RedundantImport {
#[subdiagnostic]
pub subs: Vec<RedundantImportSub>,
pub ident: Ident,
}
#[derive(Subdiagnostic)]
pub(crate) enum RedundantImportSub {
#[label("the item `{$ident}` is already imported here")]
ImportedHere {
#[primary_span]
span: Span,
ident: Ident,
},
#[label("the item `{$ident}` is already defined here")]
DefinedHere {
#[primary_span]
span: Span,
ident: Ident,
},
#[label("the item `{$ident}` is already imported by the extern prelude")]
ImportedPrelude {
#[primary_span]
span: Span,
ident: Ident,
},
#[label("the item `{$ident}` is already defined by the extern prelude")]
DefinedPrelude {
#[primary_span]
span: Span,
ident: Ident,
},
}
#[derive(Diagnostic)]
#[diag("lifetime parameter `{$ident}` only used once")]
pub(crate) struct SingleUseLifetime {
@@ -3168,66 +3131,6 @@ pub(crate) struct NamedArgumentUsedPositionally {
pub named_arg_name: String,
}
#[derive(Diagnostic)]
#[diag("ambiguous glob re-exports")]
pub(crate) struct AmbiguousGlobReexports {
#[label("the name `{$name}` in the {$namespace} namespace is first re-exported here")]
pub first_reexport: Span,
#[label("but the name `{$name}` in the {$namespace} namespace is also re-exported here")]
pub duplicate_reexport: Span,
pub name: String,
pub namespace: String,
}
#[derive(Diagnostic)]
#[diag("private item shadows public glob re-export")]
pub(crate) struct HiddenGlobReexports {
#[note(
"the name `{$name}` in the {$namespace} namespace is supposed to be publicly re-exported here"
)]
pub glob_reexport: Span,
#[note("but the private item here shadows it")]
pub private_item: Span,
pub name: String,
pub namespace: String,
}
#[derive(Diagnostic)]
#[diag("unnecessary qualification")]
pub(crate) struct UnusedQualifications {
#[suggestion(
"remove the unnecessary path segments",
style = "verbose",
code = "",
applicability = "machine-applicable"
)]
pub removal_span: Span,
}
#[derive(Diagnostic)]
#[diag(
"{$elided ->
[true] `&` without an explicit lifetime name cannot be used here
*[false] `'_` cannot be used here
}"
)]
pub(crate) struct AssociatedConstElidedLifetime {
#[suggestion(
"use the `'static` lifetime",
style = "verbose",
code = "{code}",
applicability = "machine-applicable"
)]
pub span: Span,
pub code: &'static str,
pub elided: bool,
#[note("cannot automatically infer `'static` because of other lifetimes in scope")]
pub lifetimes_in_scope: MultiSpan,
}
#[derive(Diagnostic)]
#[diag("creating a {$shared_label}reference to mutable static")]
pub(crate) struct RefOfMutStatic<'a> {
+1 -31
View File
@@ -7,7 +7,7 @@
use rustc_data_structures::stable_hasher::{
HashStable, StableCompare, StableHasher, ToStableHashKey,
};
use rustc_error_messages::{DiagArgValue, IntoDiagArg, MultiSpan};
use rustc_error_messages::{DiagArgValue, IntoDiagArg};
use rustc_hir_id::{HashStableContext, HirId, ItemLocalId};
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
use rustc_span::def_id::DefPathHash;
@@ -665,7 +665,6 @@ pub enum BuiltinLintDiag {
test_module_span: Option<Span>,
span_snippets: Vec<String>,
},
RedundantImport(Vec<(Span, bool)>, Ident),
SingleUseLifetime {
/// Span of the parameter which declares this lifetime.
param_span: Span,
@@ -691,35 +690,6 @@ pub enum BuiltinLintDiag {
/// Indicates if the named argument is used as a width/precision for formatting
is_formatting_arg: bool,
},
AmbiguousGlobReexports {
/// The name for which collision(s) have occurred.
name: String,
/// The name space for which the collision(s) occurred in.
namespace: String,
/// Span where the name is first re-exported.
first_reexport_span: Span,
/// Span where the same name is also re-exported.
duplicate_reexport_span: Span,
},
HiddenGlobReexports {
/// The name of the local binding which shadows the glob re-export.
name: String,
/// The namespace for which the shadowing occurred in.
namespace: String,
/// The glob reexport that is shadowed by the local binding.
glob_reexport_span: Span,
/// The local binding that shadows the glob reexport.
private_item_span: Span,
},
UnusedQualifications {
/// The span of the unnecessarily-qualified path to remove.
removal_span: Span,
},
AssociatedConstElidedLifetime {
elided: bool,
span: Span,
lifetimes_in_scope: MultiSpan,
},
UnusedCrateDependency {
extern_crate: Symbol,
local_crate: Symbol,
+2 -2
View File
@@ -36,7 +36,7 @@
use rustc_span::{DUMMY_SP, Ident, Span, kw};
use crate::imports::{Import, ImportKind};
use crate::{DeclKind, IdentKey, LateDecl, Resolver, module_to_string};
use crate::{DeclKind, IdentKey, LateDecl, Resolver, errors, module_to_string};
struct UnusedImport {
use_tree: ast::UseTree,
@@ -554,7 +554,7 @@ pub(crate) fn check_unused(&mut self, krate: &ast::Crate) {
UNUSED_QUALIFICATIONS,
unn_qua.node_id,
unn_qua.path_span,
BuiltinLintDiag::UnusedQualifications { removal_span: unn_qua.removal_span },
errors::UnusedQualifications { removal_span: unn_qua.removal_span },
);
}
+96
View File
@@ -1592,3 +1592,99 @@ pub(crate) struct UnusedLifetime {
pub ident: Ident,
}
#[derive(Diagnostic)]
#[diag("ambiguous glob re-exports")]
pub(crate) struct AmbiguousGlobReexports {
#[label("the name `{$name}` in the {$namespace} namespace is first re-exported here")]
pub first_reexport: Span,
#[label("but the name `{$name}` in the {$namespace} namespace is also re-exported here")]
pub duplicate_reexport: Span,
pub name: String,
pub namespace: String,
}
#[derive(Diagnostic)]
#[diag("private item shadows public glob re-export")]
pub(crate) struct HiddenGlobReexports {
#[note(
"the name `{$name}` in the {$namespace} namespace is supposed to be publicly re-exported here"
)]
pub glob_reexport: Span,
#[note("but the private item here shadows it")]
pub private_item: Span,
pub name: String,
pub namespace: String,
}
#[derive(Diagnostic)]
#[diag("the item `{$ident}` is imported redundantly")]
pub(crate) struct RedundantImport {
#[subdiagnostic]
pub subs: Vec<RedundantImportSub>,
pub ident: Ident,
}
#[derive(Subdiagnostic)]
pub(crate) enum RedundantImportSub {
#[label("the item `{$ident}` is already imported here")]
ImportedHere {
#[primary_span]
span: Span,
ident: Ident,
},
#[label("the item `{$ident}` is already defined here")]
DefinedHere {
#[primary_span]
span: Span,
ident: Ident,
},
#[label("the item `{$ident}` is already imported by the extern prelude")]
ImportedPrelude {
#[primary_span]
span: Span,
ident: Ident,
},
#[label("the item `{$ident}` is already defined by the extern prelude")]
DefinedPrelude {
#[primary_span]
span: Span,
ident: Ident,
},
}
#[derive(Diagnostic)]
#[diag("unnecessary qualification")]
pub(crate) struct UnusedQualifications {
#[suggestion(
"remove the unnecessary path segments",
style = "verbose",
code = "",
applicability = "machine-applicable"
)]
pub removal_span: Span,
}
#[derive(Diagnostic)]
#[diag(
"{$elided ->
[true] `&` without an explicit lifetime name cannot be used here
*[false] `'_` cannot be used here
}"
)]
pub(crate) struct AssociatedConstElidedLifetime {
#[suggestion(
"use the `'static` lifetime",
style = "verbose",
code = "{code}",
applicability = "machine-applicable"
)]
pub span: Span,
pub code: &'static str,
pub elided: bool,
#[note("cannot automatically infer `'static` because of other lifetimes in scope")]
pub lifetimes_in_scope: MultiSpan,
}
+33 -13
View File
@@ -6,13 +6,12 @@
use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
use rustc_data_structures::intern::Interned;
use rustc_errors::codes::*;
use rustc_errors::{Applicability, MultiSpan, pluralize, struct_span_code_err};
use rustc_errors::{Applicability, Diagnostic, MultiSpan, pluralize, struct_span_code_err};
use rustc_hir::def::{self, DefKind, PartialRes};
use rustc_hir::def_id::{DefId, LocalDefIdMap};
use rustc_middle::metadata::{AmbigModChild, ModChild, Reexport};
use rustc_middle::span_bug;
use rustc_middle::ty::Visibility;
use rustc_session::lint::BuiltinLintDiag;
use rustc_session::lint::builtin::{
AMBIGUOUS_GLOB_REEXPORTS, EXPORTED_PRIVATE_DEPENDENCIES, HIDDEN_GLOB_REEXPORTS,
PUB_USE_OF_PRIVATE_EXTERN_CRATE, REDUNDANT_IMPORTS, UNUSED_IMPORTS,
@@ -26,9 +25,10 @@
use crate::Namespace::{self, *};
use crate::diagnostics::{DiagMode, Suggestion, import_candidates};
use crate::errors::{
CannotBeReexportedCratePublic, CannotBeReexportedCratePublicNS, CannotBeReexportedPrivate,
CannotBeReexportedPrivateNS, CannotDetermineImportResolution, CannotGlobImportAllCrates,
ConsiderAddingMacroExport, ConsiderMarkingAsPub, ConsiderMarkingAsPubCrate,
self, CannotBeReexportedCratePublic, CannotBeReexportedCratePublicNS,
CannotBeReexportedPrivate, CannotBeReexportedPrivateNS, CannotDetermineImportResolution,
CannotGlobImportAllCrates, ConsiderAddingMacroExport, ConsiderMarkingAsPub,
ConsiderMarkingAsPubCrate,
};
use crate::ref_mut::CmCell;
use crate::{
@@ -721,11 +721,11 @@ pub(crate) fn lint_reexports(&mut self, exported_ambiguities: FxHashSet<Decl<'ra
AMBIGUOUS_GLOB_REEXPORTS,
import.root_id,
import.root_span,
BuiltinLintDiag::AmbiguousGlobReexports {
errors::AmbiguousGlobReexports {
name: key.ident.name.to_string(),
namespace: key.ns.descr().to_string(),
first_reexport_span: import.root_span,
duplicate_reexport_span: amb_binding.span,
first_reexport: import.root_span,
duplicate_reexport: amb_binding.span,
},
);
}
@@ -753,11 +753,11 @@ pub(crate) fn lint_reexports(&mut self, exported_ambiguities: FxHashSet<Decl<'ra
HIDDEN_GLOB_REEXPORTS,
binding_id,
binding.span,
BuiltinLintDiag::HiddenGlobReexports {
errors::HiddenGlobReexports {
name: key.ident.name.to_string(),
namespace: key.ns.descr().to_owned(),
glob_reexport_span: glob_decl.span,
private_item_span: binding.span,
glob_reexport: glob_decl.span,
private_item: binding.span,
},
);
}
@@ -1535,11 +1535,31 @@ pub(crate) fn check_for_redundant_imports(&mut self, import: Import<'ra>) -> boo
let mut redundant_spans: Vec<_> = redundant_span.present_items().collect();
redundant_spans.sort();
redundant_spans.dedup();
self.lint_buffer.buffer_lint(
self.lint_buffer.dyn_buffer_lint(
REDUNDANT_IMPORTS,
id,
import.span,
BuiltinLintDiag::RedundantImport(redundant_spans, source),
move |dcx, level| {
let ident = source;
let subs = redundant_spans
.into_iter()
.map(|(span, is_imported)| match (span.is_dummy(), is_imported) {
(false, true) => {
errors::RedundantImportSub::ImportedHere { span, ident }
}
(false, false) => {
errors::RedundantImportSub::DefinedHere { span, ident }
}
(true, true) => {
errors::RedundantImportSub::ImportedPrelude { span, ident }
}
(true, false) => {
errors::RedundantImportSub::DefinedPrelude { span, ident }
}
})
.collect();
errors::RedundantImport { subs, ident }.into_diag(dcx, level)
},
);
return true;
}
+10 -2
View File
@@ -1882,13 +1882,21 @@ fn resolve_anonymous_lifetime(
);
return;
} else if emit_lint {
let lt_span = if elided {
lifetime.ident.span.shrink_to_hi()
} else {
lifetime.ident.span
};
let code = if elided { "'static " } else { "'static" };
self.r.lint_buffer.buffer_lint(
lint::builtin::ELIDED_LIFETIMES_IN_ASSOCIATED_CONSTANT,
node_id,
lifetime.ident.span,
lint::BuiltinLintDiag::AssociatedConstElidedLifetime {
crate::errors::AssociatedConstElidedLifetime {
elided,
span: lifetime.ident.span,
code,
span: lt_span,
lifetimes_in_scope: lifetimes_in_scope.into(),
},
);