Reduce HIR debug output

HIR debug output is currently very verbose, especially when used with
the alternate (`#`) flag. This commit reduces the amount of noisy
newlines by forcing a few small key types to stay on one line, which
makes the output easier to read and scroll by.

```
$ rustc +after hello_world.rs -Zunpretty=hir-tree | wc -l
582
$ rustc +before hello_world.rs -Zunpretty=hir-tree | wc -l
932
```
This commit is contained in:
Nilstrieb 2022-12-11 12:10:55 +01:00
parent fb9dfa8cef
commit e1787f5572
4 changed files with 42 additions and 11 deletions

View File

@ -1,6 +1,7 @@
use crate::stable_hasher::{HashStable, StableHasher, StableOrd}; use crate::stable_hasher::{HashStable, StableHasher, StableOrd};
use std::borrow::Borrow; use std::borrow::Borrow;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::fmt::Debug;
use std::mem; use std::mem;
use std::ops::{Bound, Index, IndexMut, RangeBounds}; use std::ops::{Bound, Index, IndexMut, RangeBounds};
@ -16,7 +17,7 @@ pub use index_map::SortedIndexMultiMap;
/// stores data in a more compact way. It also supports accessing contiguous /// stores data in a more compact way. It also supports accessing contiguous
/// ranges of elements as a slice, and slices of already sorted elements can be /// ranges of elements as a slice, and slices of already sorted elements can be
/// inserted efficiently. /// inserted efficiently.
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Encodable, Decodable)] #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Encodable, Decodable)]
pub struct SortedMap<K, V> { pub struct SortedMap<K, V> {
data: Vec<(K, V)>, data: Vec<(K, V)>,
} }
@ -314,5 +315,11 @@ impl<K: HashStable<CTX> + StableOrd, V: HashStable<CTX>, CTX> HashStable<CTX> fo
} }
} }
impl<K: Debug, V: Debug> Debug for SortedMap<K, V> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_map().entries(self.data.iter().map(|(a, b)| (a, b))).finish()
}
}
#[cfg(test)] #[cfg(test)]
mod tests; mod tests;

View File

@ -854,7 +854,11 @@ impl fmt::Debug for OwnerNodes<'_> {
&self &self
.nodes .nodes
.iter_enumerated() .iter_enumerated()
.map(|(id, parented_node)| (id, parented_node.as_ref().map(|node| node.parent))) .map(|(id, parented_node)| {
let parented_node = parented_node.as_ref().map(|node| node.parent);
debug_fn(move |f| write!(f, "({id:?}, {parented_node:?})"))
})
.collect::<Vec<_>>(), .collect::<Vec<_>>(),
) )
.field("bodies", &self.bodies) .field("bodies", &self.bodies)
@ -3615,3 +3619,13 @@ mod size_asserts {
static_assert_size!(TyKind<'_>, 32); static_assert_size!(TyKind<'_>, 32);
// tidy-alphabetical-end // tidy-alphabetical-end
} }
fn debug_fn(f: impl Fn(&mut fmt::Formatter<'_>) -> fmt::Result) -> impl fmt::Debug {
struct DebugFn<F>(F);
impl<F: Fn(&mut fmt::Formatter<'_>) -> fmt::Result> fmt::Debug for DebugFn<F> {
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
(self.0)(fmt)
}
}
DebugFn(f)
}

View File

@ -1,14 +1,21 @@
use crate::def_id::{DefId, DefIndex, LocalDefId, CRATE_DEF_ID}; use crate::def_id::{DefId, DefIndex, LocalDefId, CRATE_DEF_ID};
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, StableOrd, ToStableHashKey}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher, StableOrd, ToStableHashKey};
use rustc_span::{def_id::DefPathHash, HashStableContext}; use rustc_span::{def_id::DefPathHash, HashStableContext};
use std::fmt; use std::fmt::{self, Debug};
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] #[derive(Copy, Clone, PartialEq, Eq, Hash)]
#[derive(Encodable, Decodable)] #[derive(Encodable, Decodable)]
pub struct OwnerId { pub struct OwnerId {
pub def_id: LocalDefId, pub def_id: LocalDefId,
} }
impl Debug for OwnerId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
// Example: DefId(0:1 ~ aa[7697]::{use#0})
Debug::fmt(&self.def_id, f)
}
}
impl From<OwnerId> for HirId { impl From<OwnerId> for HirId {
fn from(owner: OwnerId) -> HirId { fn from(owner: OwnerId) -> HirId {
HirId { owner, local_id: ItemLocalId::from_u32(0) } HirId { owner, local_id: ItemLocalId::from_u32(0) }
@ -60,7 +67,7 @@ impl<CTX: HashStableContext> ToStableHashKey<CTX> for OwnerId {
/// the `local_id` part of the `HirId` changing, which is a very useful property in /// the `local_id` part of the `HirId` changing, which is a very useful property in
/// incremental compilation where we have to persist things through changes to /// incremental compilation where we have to persist things through changes to
/// the code base. /// the code base.
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] #[derive(Copy, Clone, PartialEq, Eq, Hash)]
#[derive(Encodable, Decodable, HashStable_Generic)] #[derive(Encodable, Decodable, HashStable_Generic)]
#[rustc_pass_by_value] #[rustc_pass_by_value]
pub struct HirId { pub struct HirId {
@ -68,6 +75,14 @@ pub struct HirId {
pub local_id: ItemLocalId, pub local_id: ItemLocalId,
} }
impl Debug for HirId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
// Example: HirId(DefId(0:1 ~ aa[7697]::{use#0}).10)
// Don't use debug_tuple to always keep this on one line.
write!(f, "HirId({:?}.{:?})", self.owner, self.local_id)
}
}
impl HirId { impl HirId {
/// Signal local id which should never be used. /// Signal local id which should never be used.
pub const INVALID: HirId = pub const INVALID: HirId =

View File

@ -32,12 +32,7 @@ Thir {
kind: Scope { kind: Scope {
region_scope: Node(2), region_scope: Node(2),
lint_level: Explicit( lint_level: Explicit(
HirId { HirId(DefId(0:3 ~ thir_tree[8f1d]::main).2),
owner: OwnerId {
def_id: DefId(0:3 ~ thir_tree[8f1d]::main),
},
local_id: 2,
},
), ),
value: e0, value: e0,
}, },