mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 13:29:12 +00:00
Add boolean flag to Expr::If for indented else statement
This commit is contained in:
parent
00572cbc83
commit
a7afac7ac7
8 changed files with 136 additions and 47 deletions
|
@ -1341,12 +1341,16 @@ pub fn desugar_expr<'a>(
|
|||
region: loc_expr.region,
|
||||
})
|
||||
}
|
||||
If(if_thens, final_else_branch) => {
|
||||
If {
|
||||
if_thens,
|
||||
final_else,
|
||||
indented_else,
|
||||
} => {
|
||||
// If does not get desugared into `when` so we can give more targeted error messages during type checking.
|
||||
let desugared_final_else = &*arena.alloc(desugar_expr(
|
||||
arena,
|
||||
var_store,
|
||||
final_else_branch,
|
||||
final_else,
|
||||
src,
|
||||
line_info,
|
||||
module_path,
|
||||
|
@ -1379,7 +1383,11 @@ pub fn desugar_expr<'a>(
|
|||
}
|
||||
|
||||
arena.alloc(Loc {
|
||||
value: If(desugared_if_thens.into_bump_slice(), desugared_final_else),
|
||||
value: If {
|
||||
if_thens: desugared_if_thens.into_bump_slice(),
|
||||
final_else: desugared_final_else,
|
||||
indented_else: *indented_else,
|
||||
},
|
||||
region: loc_expr.region,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1249,7 +1249,11 @@ pub fn canonicalize_expr<'a>(
|
|||
output,
|
||||
)
|
||||
}
|
||||
ast::Expr::If(if_thens, final_else_branch) => {
|
||||
ast::Expr::If {
|
||||
if_thens,
|
||||
final_else: final_else_branch,
|
||||
..
|
||||
} => {
|
||||
let mut branches = Vec::with_capacity(if_thens.len());
|
||||
let mut output = Output::default();
|
||||
|
||||
|
@ -2560,7 +2564,11 @@ pub fn is_valid_interpolation(expr: &ast::Expr<'_>) -> bool {
|
|||
.iter()
|
||||
.all(|(loc_expr, _binop)| is_valid_interpolation(&loc_expr.value))
|
||||
}
|
||||
ast::Expr::If(branches, final_branch) => {
|
||||
ast::Expr::If {
|
||||
if_thens: branches,
|
||||
final_else: final_branch,
|
||||
..
|
||||
} => {
|
||||
is_valid_interpolation(&final_branch.value)
|
||||
&& branches.iter().all(|(loc_before, loc_after)| {
|
||||
is_valid_interpolation(&loc_before.value)
|
||||
|
|
|
@ -131,7 +131,7 @@ pub fn unwrap_suffixed_expression<'a>(
|
|||
|
||||
Expr::When(..) => unwrap_suffixed_expression_when_help(arena, loc_expr, maybe_def_pat),
|
||||
|
||||
Expr::If(..) => {
|
||||
Expr::If { .. } => {
|
||||
unwrap_suffixed_expression_if_then_else_help(arena, loc_expr, maybe_def_pat)
|
||||
}
|
||||
|
||||
|
@ -357,7 +357,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
maybe_def_pat: Option<&'a Loc<Pattern<'a>>>,
|
||||
) -> Result<&'a Loc<Expr<'a>>, EUnwrapped<'a>> {
|
||||
match loc_expr.value {
|
||||
Expr::If(if_thens, final_else_branch) => {
|
||||
Expr::If {
|
||||
if_thens,
|
||||
final_else: final_else_branch,
|
||||
indented_else,
|
||||
} => {
|
||||
for (index, if_then) in if_thens.iter().enumerate() {
|
||||
let (current_if_then_statement, current_if_then_expression) = if_then;
|
||||
|
||||
|
@ -376,10 +380,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
|
||||
let new_if = arena.alloc(Loc::at(
|
||||
loc_expr.region,
|
||||
Expr::If(
|
||||
arena.alloc_slice_copy(new_if_thens.as_slice()),
|
||||
final_else_branch,
|
||||
),
|
||||
Expr::If {
|
||||
if_thens: arena.alloc_slice_copy(new_if_thens.as_slice()),
|
||||
final_else: final_else_branch,
|
||||
indented_else,
|
||||
},
|
||||
));
|
||||
|
||||
return unwrap_suffixed_expression(arena, new_if, maybe_def_pat);
|
||||
|
@ -411,10 +416,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
|
||||
let new_if = arena.alloc(Loc::at(
|
||||
loc_expr.region,
|
||||
Expr::If(
|
||||
arena.alloc_slice_copy(new_if_thens.as_slice()),
|
||||
final_else_branch,
|
||||
),
|
||||
Expr::If {
|
||||
if_thens: arena.alloc_slice_copy(new_if_thens.as_slice()),
|
||||
final_else: final_else_branch,
|
||||
indented_else,
|
||||
},
|
||||
));
|
||||
|
||||
return unwrap_suffixed_expression(arena, new_if, maybe_def_pat);
|
||||
|
@ -439,10 +445,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
|
||||
let new_if = arena.alloc(Loc::at(
|
||||
loc_expr.region,
|
||||
Expr::If(
|
||||
arena.alloc_slice_copy(new_if_thens.as_slice()),
|
||||
final_else_branch,
|
||||
),
|
||||
Expr::If {
|
||||
if_thens: arena.alloc_slice_copy(new_if_thens.as_slice()),
|
||||
final_else: final_else_branch,
|
||||
indented_else,
|
||||
},
|
||||
));
|
||||
|
||||
return unwrap_suffixed_expression(arena, new_if, maybe_def_pat);
|
||||
|
@ -465,10 +472,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
|
||||
let new_if = arena.alloc(Loc::at(
|
||||
loc_expr.region,
|
||||
Expr::If(
|
||||
arena.alloc_slice_copy(new_if_thens.as_slice()),
|
||||
final_else_branch,
|
||||
),
|
||||
Expr::If {
|
||||
if_thens: arena.alloc_slice_copy(new_if_thens.as_slice()),
|
||||
final_else: final_else_branch,
|
||||
indented_else,
|
||||
},
|
||||
));
|
||||
|
||||
let unwrapped_if_then = apply_try_function(
|
||||
|
@ -494,10 +502,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
|
||||
let after_if = arena.alloc(Loc::at(
|
||||
loc_expr.region,
|
||||
Expr::If(
|
||||
arena.alloc_slice_copy(after_if_thens.as_slice()),
|
||||
final_else_branch,
|
||||
),
|
||||
Expr::If {
|
||||
if_thens: arena.alloc_slice_copy(after_if_thens.as_slice()),
|
||||
final_else: final_else_branch,
|
||||
indented_else,
|
||||
},
|
||||
));
|
||||
|
||||
let after_if_then = apply_try_function(
|
||||
|
@ -512,7 +521,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
|
||||
let before_if_then = arena.alloc(Loc::at(
|
||||
loc_expr.region,
|
||||
Expr::If(before, after_if_then),
|
||||
Expr::If {
|
||||
if_thens: before,
|
||||
final_else: after_if_then,
|
||||
indented_else: false,
|
||||
},
|
||||
));
|
||||
|
||||
return unwrap_suffixed_expression(
|
||||
|
@ -532,7 +545,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
Ok(unwrapped_final_else) => {
|
||||
return Ok(arena.alloc(Loc::at(
|
||||
loc_expr.region,
|
||||
Expr::If(if_thens, unwrapped_final_else),
|
||||
Expr::If {
|
||||
if_thens,
|
||||
final_else: unwrapped_final_else,
|
||||
indented_else,
|
||||
},
|
||||
)));
|
||||
}
|
||||
Err(EUnwrapped::UnwrappedDefExpr { .. }) => {
|
||||
|
@ -556,7 +573,11 @@ pub fn unwrap_suffixed_expression_if_then_else_help<'a>(
|
|||
|
||||
let new_if = arena.alloc(Loc::at(
|
||||
loc_expr.region,
|
||||
Expr::If(if_thens, unwrapped_final_else),
|
||||
Expr::If {
|
||||
if_thens,
|
||||
final_else: unwrapped_final_else,
|
||||
indented_else,
|
||||
},
|
||||
));
|
||||
|
||||
return unwrap_suffixed_expression(arena, new_if, maybe_def_pat);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue