@@ -16,6 +16,8 @@ use rustc_middle::ty::TyCtxt;
1616use rustc_span:: def_id:: { CrateNum , DefId , LocalDefId , LOCAL_CRATE } ;
1717use rustc_span:: symbol:: { sym, Symbol } ;
1818
19+ use crate :: errors:: { DuplicateDiagnosticItem , DuplicateDiagnosticItemInCrate } ;
20+
1921fn observe_item < ' tcx > (
2022 tcx : TyCtxt < ' tcx > ,
2123 diagnostic_items : & mut DiagnosticItems ,
@@ -33,25 +35,23 @@ fn collect_item(tcx: TyCtxt<'_>, items: &mut DiagnosticItems, name: Symbol, item
3335 items. id_to_name . insert ( item_def_id, name) ;
3436 if let Some ( original_def_id) = items. name_to_id . insert ( name, item_def_id) {
3537 if original_def_id != item_def_id {
36- let mut err = match tcx. hir ( ) . span_if_local ( item_def_id) {
37- Some ( span) => tcx
38- . sess
39- . struct_span_err ( span, & format ! ( "duplicate diagnostic item found: `{name}`." ) ) ,
40- None => tcx. sess . struct_err ( & format ! (
41- "duplicate diagnostic item in crate `{}`: `{}`." ,
42- tcx. crate_name( item_def_id. krate) ,
43- name
44- ) ) ,
45- } ;
46- if let Some ( span) = tcx. hir ( ) . span_if_local ( original_def_id) {
47- err. span_note ( span, "the diagnostic item is first defined here" ) ;
38+ let orig_span = tcx. hir ( ) . span_if_local ( original_def_id) ;
39+ let orig_crate_name = if orig_span. is_some ( ) {
40+ None
4841 } else {
49- err. note ( & format ! (
50- "the diagnostic item is first defined in crate `{}`." ,
51- tcx. crate_name( original_def_id. krate)
52- ) ) ;
53- }
54- err. emit ( ) ;
42+ Some ( tcx. crate_name ( original_def_id. krate ) )
43+ } ;
44+ match tcx. hir ( ) . span_if_local ( item_def_id) {
45+ Some ( span) => tcx. sess . emit_err ( DuplicateDiagnosticItem { span, name } ) ,
46+ None => tcx. sess . emit_err ( DuplicateDiagnosticItemInCrate {
47+ span : orig_span,
48+ // FIXME: We should not provide `name` to `orig_crate_name`. How do you create a blank/empty symbol?
49+ orig_crate_name : orig_crate_name. unwrap_or ( name) ,
50+ have_orig_crate_name : orig_crate_name. map ( |_| ( ) ) ,
51+ crate_name : tcx. crate_name ( item_def_id. krate ) ,
52+ name,
53+ } ) ,
54+ } ;
5555 }
5656 }
5757}
0 commit comments