Start pretty printing comments

This commit is contained in:
Joscha 2022-11-20 20:33:29 +01:00
parent b21619dabd
commit a18532a23a

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

@ -0,0 +1,86 @@
use std::mem;
use pretty::{DocAllocator, DocBuilder, Pretty, RcAllocator, RcDoc};
use crate::ast::{Ident, Line, Space};
pub enum Group<'a> {
EmptyLine,
CommentBlock(Vec<&'a str>),
}
/// Group comments and deduplicate empty lines
fn group_comments(lines: &[Line]) -> Vec<Group> {
let mut result = vec![];
let mut current_block = vec![];
let mut last_line_was_empty = false;
for line in lines {
match line {
Line::Empty if last_line_was_empty => {}
Line::Empty => {
last_line_was_empty = true;
if !current_block.is_empty() {
result.push(Group::CommentBlock(mem::take(&mut current_block)));
}
result.push(Group::EmptyLine);
}
Line::Comment(comment) => {
last_line_was_empty = false;
current_block.push(comment);
}
}
}
if !current_block.is_empty() {
result.push(Group::CommentBlock(current_block));
}
result
}
fn remove_leading_empty_line(groups: &mut Vec<Group>) {
if let Some(Group::EmptyLine) = groups.first() {
groups.remove(0);
}
}
fn remove_trailing_empty_line(groups: &mut Vec<Group>) {
if let Some(Group::EmptyLine) = groups.last() {
groups.pop();
}
}
fn comment_group_to_doc(comment: Vec<&str>) -> RcDoc {
RcAllocator
.concat(comment.into_iter().map(|c| {
RcDoc::text("# ")
.append(RcDoc::text(c))
.append(RcDoc::hardline())
}))
.indent(0)
.into_doc()
}
impl Space {
/// Format as document for inline use, prefering nil if possible.
pub fn to_doc_inline_nospace(&self) -> RcDoc {
RcDoc::nil()
}
/// Format as document, prefering a single space if possible.
pub fn to_doc_inline_space(&self) -> RcDoc {
RcDoc::space()
}
/// Format as document, prefering a newline if possible.
pub fn to_doc_newline(&self) -> RcDoc {
RcDoc::line()
}
}
impl Ident {
pub fn to_doc(&self) -> RcDoc {
RcDoc::text(&self.name)
}
}