From f8e55da6defaba1dff4d1e11f76dda3b366819be Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Tue, 20 Apr 2021 01:11:12 +0100 Subject: [PATCH] Remove impl Display for FileName and add FileNameDisplay wrapper type --- compiler/rustc_span/src/lib.rs | 51 ++++++++++++++----- .../passes/calculate_doc_coverage.rs | 2 +- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs index e5e6f31886c..141ecfd0baf 100644 --- a/compiler/rustc_span/src/lib.rs +++ b/compiler/rustc_span/src/lib.rs @@ -202,6 +202,23 @@ impl RealFileName { | RealFileName::Remapped { local_path: _, virtual_name: p } => &p, } } + + fn to_string_lossy(&self, prefer_local: bool) -> Cow<'_, str> { + use RealFileName::*; + if prefer_local { + match self { + LocalPath(path) + | Remapped { local_path: None, virtual_name: path } + | Remapped { local_path: Some(path), virtual_name: _ } => path.to_string_lossy(), + } + } else { + match self { + LocalPath(path) | Remapped { local_path: _, virtual_name: path } => { + path.to_string_lossy() + } + } + } + } } /// Differentiates between real files and common virtual files. @@ -228,16 +245,24 @@ pub enum FileName { InlineAsm(u64), } -impl std::fmt::Display for FileName { +impl From for FileName { + fn from(p: PathBuf) -> Self { + assert!(!p.to_string_lossy().ends_with('>')); + FileName::Real(RealFileName::LocalPath(p)) + } +} + +pub struct FileNameDisplay<'a> { + inner: &'a FileName, + prefer_local: bool, +} + +impl fmt::Display for FileNameDisplay<'_> { fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use FileName::*; - match *self { - Real(RealFileName::Named(ref path)) => write!(fmt, "{}", path.display()), - // FIXME: might be nice to display both components of Devirtualized. - // But for now (to backport fix for issue #70924), best to not - // perturb diagnostics so its obvious test suite still works. - Real(RealFileName::Devirtualized { ref local_path, virtual_name: _ }) => { - write!(fmt, "{}", local_path.display()) + match *self.inner { + Real(ref name) => { + write!(fmt, "{}", name.to_string_lossy(self.prefer_local)) } QuoteExpansion(_) => write!(fmt, ""), MacroExpansion(_) => write!(fmt, ""), @@ -252,10 +277,12 @@ impl std::fmt::Display for FileName { } } -impl From for FileName { - fn from(p: PathBuf) -> Self { - assert!(!p.to_string_lossy().ends_with('>')); - FileName::Real(RealFileName::LocalPath(p)) +impl FileNameDisplay<'_> { + pub fn to_string_lossy(&self) -> Cow<'_, str> { + match self.inner { + FileName::Real(ref inner) => inner.to_string_lossy(self.prefer_local), + _ => Cow::from(format!("{}", self)), + } } } diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs index c8b82fb1563..6c3881811b3 100644 --- a/src/librustdoc/passes/calculate_doc_coverage.rs +++ b/src/librustdoc/passes/calculate_doc_coverage.rs @@ -219,7 +219,7 @@ impl<'a, 'b> fold::DocFolder for CoverageCalculator<'a, 'b> { // unless the user had an explicit `allow` let should_have_docs = level != lint::Level::Allow || matches!(source, LintLevelSource::Default); - debug!("counting {:?} {:?} in {}", i.type_(), i.name, filename); + debug!("counting {:?} {:?} in {:?}", i.type_(), i.name, filename); self.items.entry(filename).or_default().count_item( has_docs, has_doc_example,