mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 13:29:12 +00:00
fix(formatter): fix potential panic when subtracting from usize
This commit is contained in:
parent
477ed3c5e8
commit
1227f9f404
1 changed files with 27 additions and 28 deletions
|
@ -186,35 +186,33 @@ impl<'a> Formattable for Expr<'a> {
|
|||
loc_expr.format_with_options(buf, Parens::InApply, Newlines::Yes, indent);
|
||||
|
||||
let multiline_args = loc_args.iter().any(|loc_arg| loc_arg.is_multiline());
|
||||
let last_arg_index = loc_args.len() - 1;
|
||||
|
||||
let should_outdent_last_arg =
|
||||
loc_args
|
||||
.iter()
|
||||
.enumerate()
|
||||
.fold(false, |found_multiline_expr, val| {
|
||||
let (index, loc_arg) = val;
|
||||
if index == last_arg_index {
|
||||
match loc_arg.value {
|
||||
SpaceBefore(sub_expr, spaces) => match sub_expr {
|
||||
Record { .. } | List { .. } => {
|
||||
let is_only_newlines =
|
||||
spaces.iter().all(|s| s.is_newline());
|
||||
is_only_newlines
|
||||
&& !found_multiline_expr
|
||||
&& sub_expr.is_multiline()
|
||||
}
|
||||
_ => false,
|
||||
},
|
||||
Record { .. } | List { .. } | Closure { .. } => {
|
||||
!found_multiline_expr && loc_arg.is_multiline()
|
||||
}
|
||||
_ => false,
|
||||
let mut found_multiline_expr = false;
|
||||
let mut iter = loc_args.iter().peekable();
|
||||
|
||||
while let Some(loc_arg) = iter.next() {
|
||||
if iter.peek().is_none() {
|
||||
found_multiline_expr = match loc_arg.value {
|
||||
SpaceBefore(sub_expr, spaces) => match sub_expr {
|
||||
Record { .. } | List { .. } => {
|
||||
let is_only_newlines = spaces.iter().all(|s| s.is_newline());
|
||||
is_only_newlines
|
||||
&& !found_multiline_expr
|
||||
&& sub_expr.is_multiline()
|
||||
}
|
||||
} else {
|
||||
loc_arg.is_multiline()
|
||||
_ => false,
|
||||
},
|
||||
Record { .. } | List { .. } | Closure { .. } => {
|
||||
!found_multiline_expr && loc_arg.is_multiline()
|
||||
}
|
||||
});
|
||||
_ => false,
|
||||
}
|
||||
} else {
|
||||
found_multiline_expr = loc_arg.is_multiline();
|
||||
}
|
||||
}
|
||||
|
||||
let should_outdent_last_arg = found_multiline_expr;
|
||||
|
||||
if multiline_args && !should_outdent_last_arg {
|
||||
let arg_indent = indent + INDENT;
|
||||
|
@ -224,10 +222,11 @@ impl<'a> Formattable for Expr<'a> {
|
|||
loc_arg.format_with_options(buf, Parens::InApply, Newlines::No, arg_indent);
|
||||
}
|
||||
} else if multiline_args && should_outdent_last_arg {
|
||||
for (index, loc_arg) in loc_args.iter().enumerate() {
|
||||
let mut iter = loc_args.iter().peekable();
|
||||
while let Some(loc_arg) = iter.next() {
|
||||
buf.spaces(1);
|
||||
|
||||
if index == last_arg_index {
|
||||
if iter.peek().is_none() {
|
||||
match loc_arg.value {
|
||||
SpaceBefore(sub_expr, _) => {
|
||||
sub_expr.format_with_options(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue