Use Option<Symbol> in DuplicateLangItem.

For the the symbols that might not be present, instead of `kw::Empty`.
This commit is contained in:
Nicholas Nethercote 2025-03-25 11:10:45 +11:00
parent 3f32a321bc
commit e576d8850d
2 changed files with 20 additions and 14 deletions

View file

@ -1348,12 +1348,12 @@ pub(crate) struct DuplicateLangItem {
pub local_span: Option<Span>,
pub lang_item_name: Symbol,
pub crate_name: Symbol,
pub dependency_of: Symbol,
pub dependency_of: Option<Symbol>,
pub is_local: bool,
pub path: String,
pub first_defined_span: Option<Span>,
pub orig_crate_name: Symbol,
pub orig_dependency_of: Symbol,
pub orig_crate_name: Option<Symbol>,
pub orig_dependency_of: Option<Symbol>,
pub orig_is_local: bool,
pub orig_path: String,
pub(crate) duplicate: Duplicate,
@ -1374,10 +1374,16 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for DuplicateLangItem {
diag.code(E0152);
diag.arg("lang_item_name", self.lang_item_name);
diag.arg("crate_name", self.crate_name);
diag.arg("dependency_of", self.dependency_of);
if let Some(dependency_of) = self.dependency_of {
diag.arg("dependency_of", dependency_of);
}
diag.arg("path", self.path);
diag.arg("orig_crate_name", self.orig_crate_name);
diag.arg("orig_dependency_of", self.orig_dependency_of);
if let Some(orig_crate_name) = self.orig_crate_name {
diag.arg("orig_crate_name", orig_crate_name);
}
if let Some(orig_dependency_of) = self.orig_dependency_of {
diag.arg("orig_dependency_of", orig_dependency_of);
}
diag.arg("orig_path", self.orig_path);
if let Some(span) = self.local_span {
diag.span(span);
@ -1385,7 +1391,7 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for DuplicateLangItem {
if let Some(span) = self.first_defined_span {
diag.span_note(span, fluent::passes_first_defined_span);
} else {
if self.orig_dependency_of.is_empty() {
if self.orig_dependency_of.is_none() {
diag.note(fluent::passes_first_defined_crate);
} else {
diag.note(fluent::passes_first_defined_crate_depends);

View file

@ -16,7 +16,7 @@ use rustc_hir::{LangItem, LanguageItems, MethodKind, Target};
use rustc_middle::query::Providers;
use rustc_middle::ty::{ResolverAstLowering, TyCtxt};
use rustc_session::cstore::ExternCrate;
use rustc_span::{Span, kw};
use rustc_span::Span;
use crate::errors::{
DuplicateLangItem, IncorrectTarget, LangItemOnIncorrectTarget, UnknownLangItem,
@ -98,7 +98,7 @@ impl<'ast, 'tcx> LanguageItemCollector<'ast, 'tcx> {
{
let lang_item_name = lang_item.name();
let crate_name = self.tcx.crate_name(item_def_id.krate);
let mut dependency_of = kw::Empty;
let mut dependency_of = None;
let is_local = item_def_id.is_local();
let path = if is_local {
String::new()
@ -112,8 +112,8 @@ impl<'ast, 'tcx> LanguageItemCollector<'ast, 'tcx> {
};
let first_defined_span = self.item_spans.get(&original_def_id).copied();
let mut orig_crate_name = kw::Empty;
let mut orig_dependency_of = kw::Empty;
let mut orig_crate_name = None;
let mut orig_dependency_of = None;
let orig_is_local = original_def_id.is_local();
let orig_path = if orig_is_local {
String::new()
@ -127,11 +127,11 @@ impl<'ast, 'tcx> LanguageItemCollector<'ast, 'tcx> {
};
if first_defined_span.is_none() {
orig_crate_name = self.tcx.crate_name(original_def_id.krate);
orig_crate_name = Some(self.tcx.crate_name(original_def_id.krate));
if let Some(ExternCrate { dependency_of: inner_dependency_of, .. }) =
self.tcx.extern_crate(original_def_id.krate)
{
orig_dependency_of = self.tcx.crate_name(*inner_dependency_of);
orig_dependency_of = Some(self.tcx.crate_name(*inner_dependency_of));
}
}
@ -140,7 +140,7 @@ impl<'ast, 'tcx> LanguageItemCollector<'ast, 'tcx> {
} else {
match self.tcx.extern_crate(item_def_id.krate) {
Some(ExternCrate { dependency_of: inner_dependency_of, .. }) => {
dependency_of = self.tcx.crate_name(*inner_dependency_of);
dependency_of = Some(self.tcx.crate_name(*inner_dependency_of));
Duplicate::CrateDepends
}
_ => Duplicate::Crate,