1 //! FIXME: write short doc here
5 use crate::db::HirDatabase;
7 pub struct HirFormatter<'a, 'b, DB> {
9 fmt: &'a mut fmt::Formatter<'b>,
12 max_size: Option<usize>,
15 pub trait HirDisplay {
16 fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result;
18 fn display<'a, DB>(&'a self, db: &'a DB) -> HirDisplayWrapper<'a, DB, Self>
22 HirDisplayWrapper(db, self, None)
25 fn display_truncated<'a, DB>(
28 max_size: Option<usize>,
29 ) -> HirDisplayWrapper<'a, DB, Self>
33 HirDisplayWrapper(db, self, max_size)
37 impl<'a, 'b, DB> HirFormatter<'a, 'b, DB>
41 pub fn write_joined<T: HirDisplay>(
43 iter: impl IntoIterator<Item = T>,
49 write!(self, "{}", sep)?;
57 /// This allows using the `write!` macro directly with a `HirFormatter`.
58 pub fn write_fmt(&mut self, args: fmt::Arguments) -> fmt::Result {
59 // We write to a buffer first to track output size
61 fmt::write(&mut self.buf, args)?;
62 self.curr_size += self.buf.len();
64 // Then we write to the internal formatter from the buffer
65 self.fmt.write_str(&self.buf)
68 pub fn should_truncate(&self) -> bool {
69 if let Some(max_size) = self.max_size {
70 self.curr_size >= max_size
77 pub struct HirDisplayWrapper<'a, DB, T>(&'a DB, &'a T, Option<usize>);
79 impl<'a, DB, T> fmt::Display for HirDisplayWrapper<'a, DB, T>
84 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
85 self.1.hir_fmt(&mut HirFormatter {
88 buf: String::with_capacity(20),