Pretty print program elements

This commit is contained in:
Joscha 2022-11-20 21:10:19 +01:00
parent 200b653e61
commit 23796e53a9
3 changed files with 48 additions and 2 deletions

View file

@ -1 +1,2 @@
mod basic;
mod program;

38
src/pretty/basic.rs Normal file
View file

@ -0,0 +1,38 @@
use pretty::RcDoc;
use crate::ast::Separated;
impl<E, S1, S2> Separated<E, S1, S2> {
pub fn to_doc<FE, FS1, FS2>(
&self,
elem_to_doc: FE,
separator_to_doc: FS1,
trailing_separator_to_doc: FS2,
) -> RcDoc
where
FE: Fn(&E) -> RcDoc,
FS1: Fn(&S1) -> RcDoc,
FS2: Fn(&S2) -> RcDoc,
{
match self {
Separated::Empty(_) => RcDoc::nil(),
Separated::NonEmpty {
first_elem,
last_elems,
trailing,
span: _span,
} => elem_to_doc(first_elem)
.append(RcDoc::concat(
last_elems
.iter()
.map(|(s, e)| separator_to_doc(s).append(elem_to_doc(e))),
))
.append(
trailing
.as_ref()
.map(trailing_separator_to_doc)
.unwrap_or_else(RcDoc::nil),
),
}
}
}

View file

@ -10,14 +10,21 @@ impl Program {
expr,
s1,
span: _,
} => RcDoc::nil(),
} => RcDoc::text("<expr>"),
Program::Module {
s0,
s1,
elems,
s2,
span: _,
} => RcDoc::text("module"),
} => RcDoc::text("module")
.append(RcDoc::line())
.append(RcDoc::line())
.append(elems.to_doc(
|e| RcDoc::text("<elem>"),
|(s0, s1)| RcDoc::text(",").append(RcDoc::line()),
|s| RcDoc::text(","),
)),
}
}
}