Format impls blocks

This commit is contained in:
Ayaz Hafiz 2022-07-15 11:14:49 -04:00
parent 85599e3a9a
commit 3ada644544
No known key found for this signature in database
GPG Key ID: 0E2A37416A25EF58
2 changed files with 54 additions and 6 deletions

View File

@ -4,8 +4,8 @@ use crate::{
Buf,
};
use roc_parse::ast::{
AssignedField, Collection, Expr, ExtractSpaces, HasAbilities, HasAbility, HasClause, Tag,
TypeAnnotation, TypeHeader,
AssignedField, Collection, Expr, ExtractSpaces, HasAbilities, HasAbility, HasClause, HasImpls,
Tag, TypeAnnotation, TypeHeader,
};
use roc_parse::ident::UppercaseIdent;
use roc_region::all::Loc;
@ -563,12 +563,49 @@ impl<'a> Formattable for HasClause<'a> {
}
}
impl<'a> Formattable for HasImpls<'a> {
fn is_multiline(&self) -> bool {
match self {
HasImpls::SpaceBefore(_, _) | HasImpls::SpaceAfter(_, _) => true,
HasImpls::HasImpls(impls) => impls.is_multiline(),
}
}
fn format_with_options<'buf>(
&self,
buf: &mut Buf<'buf>,
parens: Parens,
newlines: Newlines,
indent: u16,
) {
match self {
HasImpls::HasImpls(impls) => {
if newlines == Newlines::Yes {
buf.newline();
buf.indent(indent);
}
impls.format_with_options(buf, parens, newlines, indent);
}
HasImpls::SpaceBefore(impls, spaces) => {
buf.newline();
buf.indent(indent);
fmt_comments_only(buf, spaces.iter(), NewlineAt::Bottom, indent);
impls.format_with_options(buf, parens, Newlines::No, indent);
}
HasImpls::SpaceAfter(impls, spaces) => {
impls.format_with_options(buf, parens, newlines, indent);
fmt_comments_only(buf, spaces.iter(), NewlineAt::Bottom, indent);
}
}
}
}
impl<'a> Formattable for HasAbility<'a> {
fn is_multiline(&self) -> bool {
match self {
HasAbility::SpaceAfter(..) | HasAbility::SpaceBefore(..) => true,
HasAbility::HasAbility { ability, impls } => {
ability.is_multiline() || impls.is_multiline()
ability.is_multiline() || impls.map(|i| i.is_multiline()).unwrap_or(false)
}
}
}
@ -587,9 +624,9 @@ impl<'a> Formattable for HasAbility<'a> {
buf.indent(indent);
}
ability.format_with_options(buf, parens, newlines, indent);
if !impls.is_empty() {
if let Some(impls) = impls {
buf.spaces(1);
fmt_collection(buf, indent, Braces::Curly, *impls, newlines);
impls.format_with_options(buf, parens, newlines, indent);
}
}
HasAbility::SpaceBefore(ab, spaces) => {

View File

@ -4,7 +4,7 @@ use roc_module::called_via::{BinOp, UnaryOp};
use roc_parse::{
ast::{
AbilityMember, AssignedField, Collection, CommentOrNewline, Defs, Expr, Has, HasAbilities,
HasAbility, HasClause, Module, Pattern, Spaced, StrLiteral, StrSegment, Tag,
HasAbility, HasClause, HasImpls, Module, Pattern, Spaced, StrLiteral, StrSegment, Tag,
TypeAnnotation, TypeDef, TypeHeader, ValueDef, WhenBranch,
},
header::{
@ -801,6 +801,17 @@ impl<'a> RemoveSpaces<'a> for Tag<'a> {
}
}
impl<'a> RemoveSpaces<'a> for HasImpls<'a> {
fn remove_spaces(&self, arena: &'a Bump) -> Self {
match *self {
HasImpls::HasImpls(impls) => HasImpls::HasImpls(impls.remove_spaces(arena)),
HasImpls::SpaceBefore(has, _) | HasImpls::SpaceAfter(has, _) => {
has.remove_spaces(arena)
}
}
}
}
impl<'a> RemoveSpaces<'a> for HasAbility<'a> {
fn remove_spaces(&self, arena: &'a Bump) -> Self {
match *self {