Skip to content

Commit 1d36cb4

Browse files
committed
Pretty print record and tuple patterns
1 parent 9359fbb commit 1d36cb4

File tree

1 file changed

+72
-45
lines changed

1 file changed

+72
-45
lines changed

fathom/src/surface/pretty.rs

Lines changed: 72 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,20 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
9494
true => self.text("true"),
9595
false => self.text("false"),
9696
},
97-
Pattern::RecordLiteral(_, _) => todo!(),
98-
Pattern::Tuple(_, _) => todo!(),
97+
Pattern::RecordLiteral(_, pattern_fields) => {
98+
self.pretty_record(pattern_fields, |field| {
99+
self.concat([
100+
self.string_id(field.label.1),
101+
self.space(),
102+
self.text("="),
103+
self.space(),
104+
self.pattern(&field.pattern),
105+
])
106+
})
107+
}
108+
Pattern::Tuple(_, patterns) => {
109+
self.pretty_tuple(patterns, |pattern| self.pattern(pattern))
110+
}
99111
}
100112
}
101113

@@ -262,49 +274,25 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
262274
),
263275
]),
264276
),
265-
Term::RecordType(_, type_fields) => self.sequence(
266-
true,
267-
self.text("{"),
268-
type_fields.iter().map(|field| {
269-
self.concat([
270-
self.string_id(field.label.1),
271-
self.space(),
272-
self.text(":"),
273-
self.space(),
274-
self.term_prec(Prec::Top, &field.type_),
275-
])
276-
}),
277-
self.text(","),
278-
self.text("}"),
279-
),
280-
Term::RecordLiteral(_, expr_fields) => self.sequence(
281-
true,
282-
self.text("{"),
283-
expr_fields.iter().map(|field| {
284-
self.concat([
285-
self.string_id(field.label.1),
286-
self.space(),
287-
self.text("="),
288-
self.space(),
289-
self.term_prec(Prec::Top, &field.expr),
290-
])
291-
}),
292-
self.text(","),
293-
self.text("}"),
294-
),
295-
Term::Tuple(_, terms) if terms.len() == 1 => self.concat([
296-
self.text("("),
297-
self.term(&terms[0]),
298-
self.text(","),
299-
self.text(")"),
300-
]),
301-
Term::Tuple(_, terms) => self.sequence(
302-
false,
303-
self.text("("),
304-
terms.iter().map(|term| self.term(term)),
305-
self.text(","),
306-
self.text(")"),
307-
),
277+
Term::RecordType(_, type_fields) => self.pretty_record(type_fields, |field| {
278+
self.concat([
279+
self.string_id(field.label.1),
280+
self.space(),
281+
self.text(":"),
282+
self.space(),
283+
self.term_prec(Prec::Top, &field.type_),
284+
])
285+
}),
286+
Term::RecordLiteral(_, expr_fields) => self.pretty_record(expr_fields, |field| {
287+
self.concat([
288+
self.string_id(field.label.1),
289+
self.space(),
290+
self.text("="),
291+
self.space(),
292+
self.term_prec(Prec::Top, &field.expr),
293+
])
294+
}),
295+
Term::Tuple(_, terms) => self.pretty_tuple(terms, |term| self.term(term)),
308296
Term::Proj(_, head_expr, labels) => self.concat([
309297
self.term_prec(Prec::Atomic, head_expr),
310298
self.concat(
@@ -583,6 +571,45 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
583571
self.paren(prec > Prec::Let, DocBuilder::flat_alt(multi, single))
584572
.group()
585573
}
574+
575+
fn pretty_tuple<T>(
576+
&'arena self,
577+
terms: &[T],
578+
pretty: impl Fn(&T) -> DocBuilder<'arena, Self>,
579+
) -> DocBuilder<'arena, Self> {
580+
if terms.len() == 1 {
581+
self.concat([
582+
self.text("("),
583+
pretty(&terms[0]),
584+
self.text(","),
585+
self.text(")"),
586+
])
587+
} else {
588+
#[allow(clippy::redundant_closure)]
589+
self.sequence(
590+
false,
591+
self.text("("),
592+
terms.iter().map(|term| pretty(term)),
593+
self.text(","),
594+
self.text(")"),
595+
)
596+
}
597+
}
598+
599+
fn pretty_record<T>(
600+
&'arena self,
601+
fields: &[T],
602+
pretty: impl Fn(&T) -> DocBuilder<'arena, Self>,
603+
) -> DocBuilder<'arena, Self> {
604+
#[allow(clippy::redundant_closure)]
605+
self.sequence(
606+
true,
607+
self.text("{"),
608+
fields.iter().map(|field| pretty(field)),
609+
self.text(","),
610+
self.text("}"),
611+
)
612+
}
586613
}
587614

588615
macro_rules! borrowed_text {

0 commit comments

Comments
 (0)