From f8e55da6defaba1dff4d1e11f76dda3b366819be Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Tue, 20 Apr 2021 01:11:12 +0100 Subject: Remove impl Display for FileName and add FileNameDisplay wrapper type --- compiler/rustc_span/src/lib.rs | 51 ++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 12 deletions(-) (limited to 'compiler/rustc_span/src') 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)), + } } } -- cgit 1.4.1-3-g733a5