mirror of
https://github.com/roc-lang/roc.git
synced 2024-09-20 15:27:45 +03:00
fix single tag multiple arguments case
This commit is contained in:
parent
22366e457e
commit
a94fcdb768
@ -113,13 +113,7 @@ fn jit_to_ast_help<'a>(
|
|||||||
|
|
||||||
let (tag_name, payload_vars) = tags.iter().next().unwrap();
|
let (tag_name, payload_vars) = tags.iter().next().unwrap();
|
||||||
|
|
||||||
// We expect anything with payload vars
|
single_tag_union_to_ast(env, ptr, field_layouts, tag_name.clone(), payload_vars)
|
||||||
// that is a single Tag TagUnion
|
|
||||||
// has a Record content so the above case
|
|
||||||
// should match instead
|
|
||||||
debug_assert_eq!(payload_vars.len(), 0);
|
|
||||||
|
|
||||||
single_tag_union_to_ast(env, field_layouts, tag_name.clone(), payload_vars)
|
|
||||||
}
|
}
|
||||||
other => {
|
other => {
|
||||||
unreachable!(
|
unreachable!(
|
||||||
@ -312,7 +306,8 @@ fn list_to_ast<'a>(
|
|||||||
|
|
||||||
fn single_tag_union_to_ast<'a>(
|
fn single_tag_union_to_ast<'a>(
|
||||||
env: &Env<'a, '_>,
|
env: &Env<'a, '_>,
|
||||||
field_layouts: &[Layout<'a>],
|
ptr: *const libc::c_void,
|
||||||
|
field_layouts: &'a [Layout<'a>],
|
||||||
tag_name: TagName,
|
tag_name: TagName,
|
||||||
payload_vars: &[Variable],
|
payload_vars: &[Variable],
|
||||||
) -> Expr<'a> {
|
) -> Expr<'a> {
|
||||||
@ -320,22 +315,14 @@ fn single_tag_union_to_ast<'a>(
|
|||||||
|
|
||||||
let arena = env.arena;
|
let arena = env.arena;
|
||||||
|
|
||||||
let tag_expr = match tag_name {
|
let tag_expr = tag_name_to_expr(env, &tag_name);
|
||||||
TagName::Global(_) => {
|
|
||||||
Expr::GlobalTag(arena.alloc_str(&tag_name.as_string(env.interns, env.home)))
|
|
||||||
}
|
|
||||||
TagName::Private(_) => {
|
|
||||||
Expr::PrivateTag(arena.alloc_str(&tag_name.as_string(env.interns, env.home)))
|
|
||||||
}
|
|
||||||
TagName::Closure(_) => unreachable!("User cannot type this"),
|
|
||||||
};
|
|
||||||
|
|
||||||
let loc_tag_expr = &*arena.alloc(Located {
|
let loc_tag_expr = &*arena.alloc(Located::at_zero(tag_expr));
|
||||||
value: tag_expr,
|
|
||||||
region: Region::zero(),
|
|
||||||
});
|
|
||||||
|
|
||||||
Expr::Apply(loc_tag_expr, &[], CalledVia::Space)
|
let it = payload_vars.iter().copied().zip(field_layouts);
|
||||||
|
let output = sequence_of_expr(env, ptr as *const u8, it).into_bump_slice();
|
||||||
|
|
||||||
|
Expr::Apply(loc_tag_expr, output, CalledVia::Space)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sequence_of_expr<'a, I>(
|
fn sequence_of_expr<'a, I>(
|
||||||
|
@ -119,6 +119,12 @@ mod repl_eval {
|
|||||||
expect_success("False", "False : [ False ]*");
|
expect_success("False", "False : [ False ]*");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn single_element_tag_union() {
|
||||||
|
expect_success("True 1", "True 1 : [ True (Num *) ]*");
|
||||||
|
expect_success("Foo 1 3.14", "Foo 1 3.14 : [ Foo (Num *) Float ]*");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn tag_with_arguments() {
|
fn tag_with_arguments() {
|
||||||
expect_success("True 1", "True 1 : [ True (Num *) ]*");
|
expect_success("True 1", "True 1 : [ True (Num *) ]*");
|
||||||
|
Loading…
Reference in New Issue
Block a user