From cb90a4f30c9f34b0f2b9c55daedb4fa832bbcf70 Mon Sep 17 00:00:00 2001 From: David Wood Date: Wed, 22 Jun 2022 13:31:24 +0100 Subject: [PATCH] privacy: port "item is private" diag Signed-off-by: David Wood --- .../rustc_error_messages/locales/en-US/privacy.ftl | 3 +++ compiler/rustc_privacy/src/errors.rs | 10 ++++++++++ compiler/rustc_privacy/src/lib.rs | 12 ++++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_error_messages/locales/en-US/privacy.ftl b/compiler/rustc_error_messages/locales/en-US/privacy.ftl index 737aee5e364..6f558d1c6cc 100644 --- a/compiler/rustc_error_messages/locales/en-US/privacy.ftl +++ b/compiler/rustc_error_messages/locales/en-US/privacy.ftl @@ -1,3 +1,6 @@ privacy-field-is-private = field `{$field_name}` of {$variant_descr} `{$def_path_str}` is private privacy-field-is-private-is-update-syntax-label = field `{$field_name}` is private privacy-field-is-private-label = private field + +privacy-item-is-private = {$kind} `{$descr}` is private + .label = private {$kind} diff --git a/compiler/rustc_privacy/src/errors.rs b/compiler/rustc_privacy/src/errors.rs index b101fae0f94..a3072ded5a3 100644 --- a/compiler/rustc_privacy/src/errors.rs +++ b/compiler/rustc_privacy/src/errors.rs @@ -27,3 +27,13 @@ pub enum FieldIsPrivateLabel { span: Span, }, } + +#[derive(SessionDiagnostic)] +#[error(privacy::item_is_private)] +pub struct ItemIsPrivate<'a> { + #[primary_span] + #[label] + pub span: Span, + pub kind: &'a str, + pub descr: String, +} diff --git a/compiler/rustc_privacy/src/lib.rs b/compiler/rustc_privacy/src/lib.rs index efe1e4bad36..2ff1d031783 100644 --- a/compiler/rustc_privacy/src/lib.rs +++ b/compiler/rustc_privacy/src/lib.rs @@ -36,7 +36,7 @@ use std::marker::PhantomData; use std::ops::ControlFlow; use std::{cmp, fmt, mem}; -use errors::{FieldIsPrivate, FieldIsPrivateLabel}; +use errors::{FieldIsPrivate, FieldIsPrivateLabel, ItemIsPrivate}; //////////////////////////////////////////////////////////////////////////////// /// Generic infrastructure used to implement specific visitors below. @@ -1073,11 +1073,11 @@ impl<'tcx> TypePrivacyVisitor<'tcx> { fn check_def_id(&mut self, def_id: DefId, kind: &str, descr: &dyn fmt::Display) -> bool { let is_error = !self.item_is_accessible(def_id); if is_error { - self.tcx - .sess - .struct_span_err(self.span, &format!("{} `{}` is private", kind, descr)) - .span_label(self.span, &format!("private {}", kind)) - .emit(); + self.tcx.sess.emit_err(ItemIsPrivate { + span: self.span, + kind, + descr: descr.to_string(), + }); } is_error }