Skip to content

Commit 429a925

Browse files
committed
Refactor projection debug.
1 parent f222a2d commit 429a925

File tree

1 file changed

+69
-55
lines changed
  • compiler/rustc_middle/src/mir

1 file changed

+69
-55
lines changed

compiler/rustc_middle/src/mir/mod.rs

+69-55
Original file line numberDiff line numberDiff line change
@@ -1575,7 +1575,7 @@ impl<V, T> ProjectionElem<V, T> {
15751575
/// need neither the `V` parameter for `Index` nor the `T` for `Field`.
15761576
pub type ProjectionKind = ProjectionElem<(), ()>;
15771577

1578-
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
1578+
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
15791579
pub struct PlaceRef<'tcx> {
15801580
pub local: Local,
15811581
pub projection: &'tcx [PlaceElem<'tcx>],
@@ -1753,67 +1753,81 @@ impl<'tcx> PlaceRef<'tcx> {
17531753

17541754
impl Debug for Place<'_> {
17551755
fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
1756-
for elem in self.projection.iter().rev() {
1757-
match elem {
1758-
ProjectionElem::OpaqueCast(_)
1759-
| ProjectionElem::Downcast(_, _)
1760-
| ProjectionElem::Field(_, _) => {
1761-
write!(fmt, "(").unwrap();
1762-
}
1763-
ProjectionElem::Deref => {
1764-
write!(fmt, "(*").unwrap();
1765-
}
1766-
ProjectionElem::Index(_)
1767-
| ProjectionElem::ConstantIndex { .. }
1768-
| ProjectionElem::Subslice { .. } => {}
1769-
}
1770-
}
1756+
self.as_ref().fmt(fmt)
1757+
}
1758+
}
17711759

1760+
impl Debug for PlaceRef<'_> {
1761+
fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
1762+
pre_fmt_projection(self.projection, fmt)?;
17721763
write!(fmt, "{:?}", self.local)?;
1764+
post_fmt_projection(self.projection, fmt)
1765+
}
1766+
}
17731767

1774-
for elem in self.projection.iter() {
1775-
match elem {
1776-
ProjectionElem::OpaqueCast(ty) => {
1777-
write!(fmt, " as {ty})")?;
1778-
}
1779-
ProjectionElem::Downcast(Some(name), _index) => {
1780-
write!(fmt, " as {name})")?;
1781-
}
1782-
ProjectionElem::Downcast(None, index) => {
1783-
write!(fmt, " as variant#{index:?})")?;
1784-
}
1785-
ProjectionElem::Deref => {
1786-
write!(fmt, ")")?;
1787-
}
1788-
ProjectionElem::Field(field, ty) => {
1789-
write!(fmt, ".{:?}: {:?})", field.index(), ty)?;
1790-
}
1791-
ProjectionElem::Index(ref index) => {
1792-
write!(fmt, "[{index:?}]")?;
1793-
}
1794-
ProjectionElem::ConstantIndex { offset, min_length, from_end: false } => {
1795-
write!(fmt, "[{offset:?} of {min_length:?}]")?;
1796-
}
1797-
ProjectionElem::ConstantIndex { offset, min_length, from_end: true } => {
1798-
write!(fmt, "[-{offset:?} of {min_length:?}]")?;
1799-
}
1800-
ProjectionElem::Subslice { from, to, from_end: true } if to == 0 => {
1801-
write!(fmt, "[{from:?}:]")?;
1802-
}
1803-
ProjectionElem::Subslice { from, to, from_end: true } if from == 0 => {
1804-
write!(fmt, "[:-{to:?}]")?;
1805-
}
1806-
ProjectionElem::Subslice { from, to, from_end: true } => {
1807-
write!(fmt, "[{from:?}:-{to:?}]")?;
1808-
}
1809-
ProjectionElem::Subslice { from, to, from_end: false } => {
1810-
write!(fmt, "[{from:?}..{to:?}]")?;
1811-
}
1768+
fn pre_fmt_projection(projection: &[PlaceElem<'_>], fmt: &mut Formatter<'_>) -> fmt::Result {
1769+
for &elem in projection.iter().rev() {
1770+
match elem {
1771+
ProjectionElem::OpaqueCast(_)
1772+
| ProjectionElem::Downcast(_, _)
1773+
| ProjectionElem::Field(_, _) => {
1774+
write!(fmt, "(").unwrap();
1775+
}
1776+
ProjectionElem::Deref => {
1777+
write!(fmt, "(*").unwrap();
18121778
}
1779+
ProjectionElem::Index(_)
1780+
| ProjectionElem::ConstantIndex { .. }
1781+
| ProjectionElem::Subslice { .. } => {}
18131782
}
1783+
}
18141784

1815-
Ok(())
1785+
Ok(())
1786+
}
1787+
1788+
fn post_fmt_projection(projection: &[PlaceElem<'_>], fmt: &mut Formatter<'_>) -> fmt::Result {
1789+
for &elem in projection.iter() {
1790+
match elem {
1791+
ProjectionElem::OpaqueCast(ty) => {
1792+
write!(fmt, " as {ty})")?;
1793+
}
1794+
ProjectionElem::Downcast(Some(name), _index) => {
1795+
write!(fmt, " as {name})")?;
1796+
}
1797+
ProjectionElem::Downcast(None, index) => {
1798+
write!(fmt, " as variant#{index:?})")?;
1799+
}
1800+
ProjectionElem::Deref => {
1801+
write!(fmt, ")")?;
1802+
}
1803+
ProjectionElem::Field(field, ty) => {
1804+
write!(fmt, ".{:?}: {:?})", field.index(), ty)?;
1805+
}
1806+
ProjectionElem::Index(ref index) => {
1807+
write!(fmt, "[{index:?}]")?;
1808+
}
1809+
ProjectionElem::ConstantIndex { offset, min_length, from_end: false } => {
1810+
write!(fmt, "[{offset:?} of {min_length:?}]")?;
1811+
}
1812+
ProjectionElem::ConstantIndex { offset, min_length, from_end: true } => {
1813+
write!(fmt, "[-{offset:?} of {min_length:?}]")?;
1814+
}
1815+
ProjectionElem::Subslice { from, to, from_end: true } if to == 0 => {
1816+
write!(fmt, "[{from:?}:]")?;
1817+
}
1818+
ProjectionElem::Subslice { from, to, from_end: true } if from == 0 => {
1819+
write!(fmt, "[:-{to:?}]")?;
1820+
}
1821+
ProjectionElem::Subslice { from, to, from_end: true } => {
1822+
write!(fmt, "[{from:?}:-{to:?}]")?;
1823+
}
1824+
ProjectionElem::Subslice { from, to, from_end: false } => {
1825+
write!(fmt, "[{from:?}..{to:?}]")?;
1826+
}
1827+
}
18161828
}
1829+
1830+
Ok(())
18171831
}
18181832

18191833
///////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)