Skip to content

Commit b0a4a64

Browse files
authored
Merge pull request #7548 from smores56/fix-pnc-try
Fix PNC + ? suffix interaction
2 parents cf1cfef + c7da4f7 commit b0a4a64

File tree

2 files changed

+36
-21
lines changed

2 files changed

+36
-21
lines changed

crates/check/can_solo/src/desugar.rs

+13-21
Original file line numberDiff line numberDiff line change
@@ -93,49 +93,41 @@ fn new_op_call_expr<'a>(
9393
),
9494
);
9595
}
96-
TrySuffix(fn_expr) => {
97-
let loc_fn = env.arena.alloc(Loc::at(right.region, **fn_expr));
98-
let function = desugar_expr(env, scope, loc_fn);
96+
TrySuffix(PncApply(loc_fn_expr, loc_args)) => {
97+
let function = desugar_expr(env, scope, loc_fn_expr);
98+
99+
let mut desugared_args = Vec::with_capacity_in(loc_args.len(), env.arena);
100+
desugared_args.push(desugar_expr(env, scope, left));
101+
for loc_arg in loc_args.iter() {
102+
desugared_args.push(desugar_expr(env, scope, loc_arg));
103+
}
99104

100105
return Loc::at(
101106
region,
102107
LowLevelTry(
103108
env.arena.alloc(Loc::at(
104109
region,
105-
Expr::Apply(
110+
Expr::PncApply(
106111
function,
107-
env.arena.alloc([desugar_expr(env, scope, left)]),
108-
CalledVia::Try,
112+
Collection::with_items(desugared_args.into_bump_slice()),
109113
),
110114
)),
111115
ResultTryKind::OperatorSuffix,
112116
),
113117
);
114118
}
115-
PncApply(
116-
&Loc {
117-
value: TrySuffix(fn_expr),
118-
region: fn_region,
119-
},
120-
loc_args,
121-
) => {
122-
let loc_fn = env.arena.alloc(Loc::at(fn_region, *fn_expr));
119+
TrySuffix(fn_expr) => {
120+
let loc_fn = env.arena.alloc(Loc::at(right.region, **fn_expr));
123121
let function = desugar_expr(env, scope, loc_fn);
124122

125-
let mut desugared_args = Vec::with_capacity_in(loc_args.len() + 1, env.arena);
126-
desugared_args.push(desugar_expr(env, scope, left));
127-
for loc_arg in loc_args.items {
128-
desugared_args.push(desugar_expr(env, scope, loc_arg));
129-
}
130-
131123
return Loc::at(
132124
region,
133125
LowLevelTry(
134126
env.arena.alloc(Loc::at(
135127
region,
136128
Expr::Apply(
137129
function,
138-
desugared_args.into_bump_slice(),
130+
env.arena.alloc([desugar_expr(env, scope, left)]),
139131
CalledVia::Try,
140132
),
141133
)),

crates/compiler/can/tests/test_can.rs

+23
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,29 @@ mod test_can {
971971
assert_str_value(&cond_args[0].1.value, "123");
972972
}
973973

974+
#[test]
975+
fn try_desugar_pipe_suffix_pnc() {
976+
let src = indoc!(
977+
r#"
978+
"123" |> Str.to_u64()?
979+
"#
980+
);
981+
let arena = Bump::new();
982+
let out = can_expr_with(&arena, test_home(), src);
983+
984+
assert_eq!(out.problems, Vec::new());
985+
986+
// Assert that we desugar to:
987+
//
988+
// Try(Str.to_u64 "123")
989+
990+
let cond_expr = assert_try_expr(&out.loc_expr.value);
991+
let cond_args = assert_func_call(cond_expr, "to_u64", CalledVia::Space, &out.interns);
992+
993+
assert_eq!(cond_args.len(), 1);
994+
assert_str_value(&cond_args[0].1.value, "123");
995+
}
996+
974997
#[test]
975998
fn try_desugar_works_elsewhere() {
976999
let src = indoc!(

0 commit comments

Comments
 (0)