Skip to content

Commit

Permalink
fix(format): Preserve comments between let bindings and their bodies
Browse files Browse the repository at this point in the history
And type bindings
  • Loading branch information
Marwes committed Jul 3, 2017
1 parent 7b53849 commit f9836f9
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 19 deletions.
43 changes: 24 additions & 19 deletions base/src/pretty_print.rs
Original file line number Diff line number Diff line change
Expand Up @@ -208,12 +208,33 @@ impl<'a> ExprPrinter<'a> {
arena.concat(repeat(arena.newline()).take(empty_lines))
}

fn comments(&'a self, span: Span<BytePos>) -> DocBuilder<'a, Arena<'a>> {
let arena = &self.arena;
arena
.concat(
self.source
.comments_between(span)
.map(|comment| {
chain![arena;
if comment.is_empty() {
arena.nil()
} else {
arena.text("// ").append(comment)
},
arena.newline()
]
}),
)
}

pub fn pretty_expr<Id>(&'a self, expr: &'a SpannedExpr<Id>) -> DocBuilder<'a, Arena<'a>>
where
Id: AsRef<str>,
{
self.pretty_expr_(BytePos::from(0), expr)
.append(self.comments(Span::new(expr.span.end, BytePos::from(self.source.src().len()))))
}

pub fn pretty_expr_<Id>(
&'a self,
previous_end: BytePos,
Expand Down Expand Up @@ -324,8 +345,7 @@ impl<'a> ExprPrinter<'a> {
arena.concat(prefixes.zip(binds).map(|(prefix, bind)| {
binding(prefix, bind)
}).interleave(newlines_iter!(self, binds.iter().map(|bind| bind.span())))),
self.newlines(binds.last().unwrap().expr.span.end, body.span.start),
pretty(body).group()
self.pretty_expr_(binds.last().unwrap().span().end, body).group()
]
}
Expr::Literal(_) => {
Expand Down Expand Up @@ -413,27 +433,12 @@ impl<'a> ExprPrinter<'a> {
.group()
].group()
}).interleave(newlines_iter!(self, binds.iter().map(|bind| bind.span())))),
self.newlines(binds.last().unwrap().alias.span.end, body.span.start),
pretty(body)
self.pretty_expr_(binds.last().unwrap().alias.span.end, body)
].group()
}
Expr::Error => arena.text("<error>"),
};
arena
.concat(
self.source
.comments_between(Span::new(previous_end, expr.span.start))
.map(|comment| {
chain![arena;
if comment.is_empty() {
arena.nil()
} else {
arena.text("// ").append(comment)
},
arena.newline()
]
}),
)
self.comments(Span::new(previous_end, expr.span.start))
.append(doc)
}

Expand Down
15 changes: 15 additions & 0 deletions parser/tests/pretty_print.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,18 @@ fn dont_lose_information_in_literals() {
"#;
assert_eq!(&format_expr(expr).unwrap(), expr);
}


#[test]
fn preserve_comment_between_let_in() {
let expr = r#"
// test
let x = 1
// test
type Test = Int
// test
1
// test2
"#;
assert_eq!(&format_expr(expr).unwrap(), expr);
}

0 comments on commit f9836f9

Please sign in to comment.