mirror of
https://github.com/roc-lang/roc.git
synced 2024-09-22 08:17:40 +03:00
all gen tests are passing
This commit is contained in:
parent
db0bed2fe7
commit
40b68f7e99
@ -201,7 +201,10 @@ mod gen_records {
|
|||||||
5,
|
5,
|
||||||
i64
|
i64
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn when_on_record_with_guard_pattern() {
|
||||||
assert_evals_to_ir!(
|
assert_evals_to_ir!(
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
@ -212,7 +215,10 @@ mod gen_records {
|
|||||||
5,
|
5,
|
||||||
i64
|
i64
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn let_with_record_pattern() {
|
||||||
assert_evals_to_ir!(
|
assert_evals_to_ir!(
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
|
@ -663,13 +663,6 @@ impl<'a> Stmt<'a> {
|
|||||||
/*
|
/*
|
||||||
Inc(Symbol, &'a Stmt<'a>),
|
Inc(Symbol, &'a Stmt<'a>),
|
||||||
Dec(Symbol, &'a Stmt<'a>),
|
Dec(Symbol, &'a Stmt<'a>),
|
||||||
Join {
|
|
||||||
id: JoinPointId,
|
|
||||||
arguments: &'a [Symbol],
|
|
||||||
result: &'a Stmt<'a>,
|
|
||||||
continuation: &'a Stmt<'a>,
|
|
||||||
},
|
|
||||||
Jump(JoinPointId, &'a [Symbol]),
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1037,7 +1030,16 @@ pub fn with_hole<'a>(
|
|||||||
// A bit ugly, but it does the job
|
// A bit ugly, but it does the job
|
||||||
match hole {
|
match hole {
|
||||||
Stmt::Jump(id, _) => Stmt::Jump(*id, env.arena.alloc([symbol])),
|
Stmt::Jump(id, _) => Stmt::Jump(*id, env.arena.alloc([symbol])),
|
||||||
_ => Stmt::Ret(symbol),
|
Stmt::Ret(s) => {
|
||||||
|
//
|
||||||
|
dbg!(symbol, assigned);
|
||||||
|
Stmt::Ret(symbol)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
// if you see this, there is variable aliasing going on
|
||||||
|
dbg!(hole);
|
||||||
|
Stmt::Ret(symbol)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Var(symbol) => panic!("reached Var {}", symbol),
|
// Var(symbol) => panic!("reached Var {}", symbol),
|
||||||
@ -1337,14 +1339,18 @@ pub fn with_hole<'a>(
|
|||||||
Some(id),
|
Some(id),
|
||||||
);
|
);
|
||||||
|
|
||||||
// TODO define condition
|
|
||||||
|
|
||||||
// define the `when` condition
|
// define the `when` condition
|
||||||
if let roc_can::expr::Expr::Var(_) = loc_cond.value {
|
if let roc_can::expr::Expr::Var(_) = loc_cond.value {
|
||||||
// do nothing
|
// do nothing
|
||||||
} else {
|
} else {
|
||||||
let hole = env.arena.alloc(stmt);
|
stmt = with_hole(
|
||||||
stmt = with_hole(env, loc_cond.value, procs, layout_cache, cond_symbol, hole);
|
env,
|
||||||
|
loc_cond.value,
|
||||||
|
procs,
|
||||||
|
layout_cache,
|
||||||
|
cond_symbol,
|
||||||
|
env.arena.alloc(stmt),
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
let layout = layout_cache
|
let layout = layout_cache
|
||||||
@ -1355,7 +1361,7 @@ pub fn with_hole<'a>(
|
|||||||
id,
|
id,
|
||||||
arguments: bumpalo::vec![in env.arena; (assigned, layout)].into_bump_slice(),
|
arguments: bumpalo::vec![in env.arena; (assigned, layout)].into_bump_slice(),
|
||||||
remainder: env.arena.alloc(stmt),
|
remainder: env.arena.alloc(stmt),
|
||||||
continuation: hole,
|
continuation: env.arena.alloc(hole),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1670,7 +1676,40 @@ pub fn from_can<'a>(
|
|||||||
use roc_can::expr::Expr::*;
|
use roc_can::expr::Expr::*;
|
||||||
|
|
||||||
match can_expr {
|
match can_expr {
|
||||||
LetNonRec(def, cont, _, _) => {
|
LetRec(defs, cont, _, _) => {
|
||||||
|
// because Roc is strict, only functions can be recursive!
|
||||||
|
for def in defs.into_iter() {
|
||||||
|
if let roc_can::pattern::Pattern::Identifier(symbol) = &def.loc_pattern.value {
|
||||||
|
// Now that we know for sure it's a closure, get an owned
|
||||||
|
// version of these variant args so we can use them properly.
|
||||||
|
match def.loc_expr.value {
|
||||||
|
Closure(ann, _, _, loc_args, boxed_body) => {
|
||||||
|
// Extract Procs, but discard the resulting Expr::Load.
|
||||||
|
// That Load looks up the pointer, which we won't use here!
|
||||||
|
|
||||||
|
let (loc_body, ret_var) = *boxed_body;
|
||||||
|
|
||||||
|
procs.insert_named(
|
||||||
|
env,
|
||||||
|
layout_cache,
|
||||||
|
*symbol,
|
||||||
|
ann,
|
||||||
|
loc_args,
|
||||||
|
loc_body,
|
||||||
|
ret_var,
|
||||||
|
);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
_ => unreachable!("recursive value is not a function"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unreachable!("recursive value does not have Identifier pattern")
|
||||||
|
}
|
||||||
|
|
||||||
|
from_can(env, cont.value, procs, layout_cache)
|
||||||
|
}
|
||||||
|
LetNonRec(def, cont, xvar, _) => {
|
||||||
if let roc_can::pattern::Pattern::Identifier(symbol) = &def.loc_pattern.value {
|
if let roc_can::pattern::Pattern::Identifier(symbol) = &def.loc_pattern.value {
|
||||||
if let Closure(_, _, _, _, _) = &def.loc_expr.value {
|
if let Closure(_, _, _, _, _) = &def.loc_expr.value {
|
||||||
// Now that we know for sure it's a closure, get an owned
|
// Now that we know for sure it's a closure, get an owned
|
||||||
@ -1709,7 +1748,9 @@ pub fn from_can<'a>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let (symbol, can_expr) =
|
let (symbol, can_expr) =
|
||||||
pattern_to_when(env, def.expr_var, def.loc_pattern, def.expr_var, *cont);
|
pattern_to_when(env, def.expr_var, def.loc_pattern, xvar, *cont);
|
||||||
|
|
||||||
|
dbg!(symbol, &can_expr);
|
||||||
|
|
||||||
let stmt = from_can(env, can_expr.value, procs, layout_cache);
|
let stmt = from_can(env, can_expr.value, procs, layout_cache);
|
||||||
|
|
||||||
|
@ -1642,4 +1642,26 @@ mod test_mono {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn let_with_record_pattern() {
|
||||||
|
compiles_to_ir(
|
||||||
|
r#"
|
||||||
|
{ x } = { x: 0x2, y: 3.14 }
|
||||||
|
|
||||||
|
x
|
||||||
|
"#,
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
let Test.6 = 2i64;
|
||||||
|
let Test.7 = 3.14f64;
|
||||||
|
let Test.1 = Struct {Test.6, Test.7};
|
||||||
|
let Test.0 = Index 0 Test.1;
|
||||||
|
jump Test.3 Test.0;
|
||||||
|
joinpoint Test.3 Test.2:
|
||||||
|
ret Test.2;
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -525,6 +525,9 @@ fn pretty_runtime_error<'b>(
|
|||||||
alloc.reflow("Only variables can be updated with record update syntax."),
|
alloc.reflow("Only variables can be updated with record update syntax."),
|
||||||
]),
|
]),
|
||||||
RuntimeError::NoImplementation => todo!("no implementation, unreachable"),
|
RuntimeError::NoImplementation => todo!("no implementation, unreachable"),
|
||||||
|
RuntimeError::NonExhaustivePattern => {
|
||||||
|
unreachable!("not currently reported (but can blow up at runtime)")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user