fix and clean up tests and handle
one edge case on rearrange clauses
This commit is contained in:
parent
018453f6b1
commit
4e3ced5b75
|
@ -784,10 +784,11 @@ pub fn rearrange_list_clauses(clauses: Vec<TypedClause>) -> Vec<TypedClause> {
|
|||
is_wild_card_elems_clause && !pattern_has_conditions(element);
|
||||
}
|
||||
|
||||
if is_wild_card_elems_clause
|
||||
&& wild_card_clause_elems < elements.len() + usize::from(tail.is_none())
|
||||
{
|
||||
wild_card_clause_elems += 1;
|
||||
if is_wild_card_elems_clause {
|
||||
if wild_card_clause_elems < elements.len() + usize::from(tail.is_none()) {
|
||||
wild_card_clause_elems += 1;
|
||||
}
|
||||
|
||||
if clause.guard.is_none() && tail.is_some() && !elements.is_empty() {
|
||||
last_clause_index = index;
|
||||
last_clause_set = true;
|
||||
|
@ -820,7 +821,9 @@ pub fn rearrange_list_clauses(clauses: Vec<TypedClause>) -> Vec<TypedClause> {
|
|||
|
||||
// Encountered a tail so stop there with that as last clause
|
||||
if last_clause_set {
|
||||
final_clauses = final_clauses[0..last_clause_index].to_vec();
|
||||
for _ in 0..(sorted_clauses.len() - 1 - last_clause_index) {
|
||||
final_clauses.pop();
|
||||
}
|
||||
}
|
||||
|
||||
// insert hole fillers into clauses
|
||||
|
|
|
@ -73,7 +73,6 @@ fn assert_uplc(source_code: &str, expected: Term<Name>, should_fail: bool) {
|
|||
};
|
||||
|
||||
let expected = optimize::aiken_optimize_and_intern(expected);
|
||||
// println!("expected: {}", expected.to_pretty());
|
||||
|
||||
let expected: Program<DeBruijn> = expected.try_into().unwrap();
|
||||
|
||||
|
@ -2858,8 +2857,7 @@ fn when_tuple_deconstruction() {
|
|||
Term::un_i_data().apply(
|
||||
Term::var(CONSTR_GET_FIELD)
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("a")),
|
||||
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("a")),
|
||||
)
|
||||
.apply(Term::integer(0.into())),
|
||||
),
|
||||
|
@ -2897,135 +2895,137 @@ fn when_tuple_deconstruction() {
|
|||
.apply(Term::var("red")),
|
||||
)
|
||||
.delayed_if_else(Term::unit(), Term::Error)
|
||||
.lambda("red")
|
||||
.lambda("_")
|
||||
.apply(
|
||||
Term::var("red").lambda("_").apply(
|
||||
Term::var("expect_RedSpend")
|
||||
.lambda("expect_RedSpend")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("red_constr_fields"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string("List/Tuple/Constr contains more items than expected")),
|
||||
)
|
||||
.lambda("field_1")
|
||||
.apply(Term::un_i_data().apply(
|
||||
Term::head_list().apply(Term::var("red_constr_fields")),
|
||||
))
|
||||
.lambda("red_constr_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("red")),
|
||||
Term::var("expect_RedSpend")
|
||||
.lambda("expect_RedSpend")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("red_constr_fields"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string(
|
||||
"List/Tuple/Constr contains more items than expected",
|
||||
)),
|
||||
)
|
||||
.lambda("field_1")
|
||||
.apply(Term::un_i_data().apply(
|
||||
Term::head_list().apply(Term::var("red_constr_fields")),
|
||||
))
|
||||
.lambda("red_constr_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("red")),
|
||||
),
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(1.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("red"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string(
|
||||
"Expected no fields for Constr",
|
||||
)),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"Constr index did not match any type variant",
|
||||
)),
|
||||
),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red")))
|
||||
.lambda("red"),
|
||||
)
|
||||
.apply(Term::var("red")),
|
||||
)
|
||||
.lambda("red")
|
||||
.apply(Term::var("red"))
|
||||
.lambda("_")
|
||||
.apply(
|
||||
Term::var("expect_Datum")
|
||||
.lambda("expect_Datum")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("dat_constr_fields"))
|
||||
.delayed_choose_list(
|
||||
Term::unit().lambda("_").apply(
|
||||
Term::var("expect_Thing").apply(Term::var("field_1")),
|
||||
),
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(1.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("red"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error
|
||||
.trace(Term::string("Expected no fields for Constr"))
|
||||
),
|
||||
Term::Error.trace(Term::string("Constr index did not match any type variant")),
|
||||
),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red")))
|
||||
.lambda("red"),
|
||||
)
|
||||
.apply(Term::var("red")),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"List/Tuple/Constr contains more items than expected",
|
||||
)),
|
||||
)
|
||||
.lambda("field_1")
|
||||
.apply(Term::head_list().apply(Term::var("dat_constr_fields")))
|
||||
.lambda("dat_constr_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat")),
|
||||
),
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(1.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("dat"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string(
|
||||
"Expected no fields for Constr",
|
||||
)),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"Constr index did not match any type variant",
|
||||
)),
|
||||
),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat")))
|
||||
.lambda("dat"),
|
||||
)
|
||||
.lambda("expect_Thing")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("field_1_constr_fields"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string(
|
||||
"List/Tuple/Constr contains more items than expected",
|
||||
)),
|
||||
)
|
||||
.lambda("idx")
|
||||
.apply(Term::un_i_data().apply(
|
||||
Term::head_list().apply(Term::var("field_1_constr_fields")),
|
||||
))
|
||||
.lambda("field_1_constr_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("field_1")),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"Constr index did not match any type variant",
|
||||
)),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_1")))
|
||||
.lambda("field_1"),
|
||||
)
|
||||
.apply(Term::var("dat")),
|
||||
)
|
||||
.lambda("dat")
|
||||
.apply(
|
||||
Term::var("dat").lambda("_").apply(
|
||||
Term::var("expect_Datum")
|
||||
.lambda("expect_Datum")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("dat_constr_fields"))
|
||||
.delayed_choose_list(
|
||||
Term::unit().lambda("_").apply(
|
||||
Term::var("expect_Thing")
|
||||
.apply(Term::var("field_1")),
|
||||
),
|
||||
Term::Error.trace(Term::string("List/Tuple/Constr contains more items than expected")),
|
||||
)
|
||||
.lambda("field_1")
|
||||
.apply(
|
||||
Term::head_list().apply(Term::var("dat_constr_fields")),
|
||||
)
|
||||
.lambda("dat_constr_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("dat")),
|
||||
),
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(1.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("dat"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error
|
||||
.trace(Term::string("Expected no fields for Constr"))
|
||||
),
|
||||
Term::Error.trace(Term::string("Constr index did not match any type variant")),
|
||||
),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat")))
|
||||
.lambda("dat"),
|
||||
)
|
||||
.lambda("expect_Thing")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("field_1_constr_fields"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string("List/Tuple/Constr contains more items than expected")),
|
||||
)
|
||||
.lambda("idx")
|
||||
.apply(
|
||||
Term::un_i_data().apply(
|
||||
Term::head_list()
|
||||
.apply(Term::var("field_1_constr_fields")),
|
||||
),
|
||||
)
|
||||
.lambda("field_1_constr_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("field_1")),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"Constr index did not match any type variant",
|
||||
)),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(
|
||||
Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_1")),
|
||||
)
|
||||
.lambda("field_1"),
|
||||
)
|
||||
.apply(Term::var("dat")),
|
||||
),
|
||||
)
|
||||
.apply(Term::var("dat"))
|
||||
.lambda("ctx")
|
||||
.lambda("red")
|
||||
.lambda("dat")
|
||||
|
@ -3211,114 +3211,115 @@ fn generic_validator_type_test() {
|
|||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("r")))
|
||||
.delayed_if_else(Term::unit(), Term::Error)
|
||||
.lambda("r")
|
||||
.apply(
|
||||
Term::var("r").lambda("_").apply(
|
||||
Term::var("__expect_A")
|
||||
.lambda("__expect_A")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("r"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string(
|
||||
"Expected no fields for Constr",
|
||||
)),
|
||||
),
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(1.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("tail_1"))
|
||||
.delayed_choose_list(
|
||||
Term::unit().lambda("_").apply(
|
||||
Term::var("__expect_B")
|
||||
.apply(Term::var("field_B")),
|
||||
),
|
||||
Term::Error
|
||||
.trace(Term::string("List/Tuple/Constr contains more items than expected")),
|
||||
)
|
||||
.lambda("field_B")
|
||||
.apply(Term::head_list().apply(Term::var("tail_1")))
|
||||
.lambda("tail_1")
|
||||
.apply(
|
||||
Term::tail_list().apply(Term::var("r_fields")),
|
||||
)
|
||||
.lambda("field_0")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(
|
||||
Term::fst_pair().apply(
|
||||
Term::unconstr_data().apply(
|
||||
Term::head_list().apply(
|
||||
Term::var("r_fields"),
|
||||
),
|
||||
.lambda("_").apply(
|
||||
Term::var("__expect_A")
|
||||
.lambda("__expect_A")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("r"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string(
|
||||
"Expected no fields for Constr",
|
||||
)),
|
||||
),
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(1.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("tail_1"))
|
||||
.delayed_choose_list(
|
||||
Term::unit().lambda("_").apply(
|
||||
Term::var("__expect_B")
|
||||
.apply(Term::var("field_B")),
|
||||
),
|
||||
Term::Error
|
||||
.trace(Term::string("List/Tuple/Constr contains more items than expected")),
|
||||
)
|
||||
.lambda("field_B")
|
||||
.apply(Term::head_list().apply(Term::var("tail_1")))
|
||||
.lambda("tail_1")
|
||||
.apply(
|
||||
Term::tail_list().apply(Term::var("r_fields")),
|
||||
)
|
||||
.lambda("field_0")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(
|
||||
Term::fst_pair().apply(
|
||||
Term::unconstr_data().apply(
|
||||
Term::head_list().apply(
|
||||
Term::var("r_fields"),
|
||||
),
|
||||
),
|
||||
)
|
||||
.delayed_if_else(Term::unit(), Term::Error),
|
||||
)
|
||||
.lambda("r_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("r")),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"Constr index did not match any type variant",
|
||||
)),
|
||||
),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("r")))
|
||||
.lambda("r"),
|
||||
)
|
||||
.lambda("__expect_B")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("B_fields"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string(error_string)),
|
||||
)
|
||||
.lambda("something")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(
|
||||
Term::fst_pair().apply(
|
||||
Term::unconstr_data().apply(
|
||||
Term::head_list()
|
||||
.apply(Term::var("B_fields")),
|
||||
),
|
||||
)
|
||||
.delayed_if_else(Term::unit(), Term::Error),
|
||||
)
|
||||
.lambda("r_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("r")),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"Constr index did not match any type variant",
|
||||
)),
|
||||
),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("r")))
|
||||
.lambda("r"),
|
||||
)
|
||||
.lambda("__expect_B")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(Term::var("subject"))
|
||||
.delayed_if_else(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("B_fields"))
|
||||
.delayed_choose_list(
|
||||
Term::unit(),
|
||||
Term::Error.trace(Term::string(error_string)),
|
||||
)
|
||||
.lambda("something")
|
||||
.apply(
|
||||
Term::equals_integer()
|
||||
.apply(Term::integer(0.into()))
|
||||
.apply(
|
||||
Term::fst_pair().apply(
|
||||
Term::unconstr_data().apply(
|
||||
Term::head_list()
|
||||
.apply(Term::var("B_fields")),
|
||||
),
|
||||
)
|
||||
.delayed_if_else(Term::unit(), Term::Error),
|
||||
)
|
||||
.lambda("B_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("field_B")),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"Constr index did not match any type variant",
|
||||
)),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_B")))
|
||||
.lambda("field_B"),
|
||||
)
|
||||
.apply(Term::var("r")),
|
||||
),
|
||||
),
|
||||
)
|
||||
.delayed_if_else(Term::unit(), Term::Error),
|
||||
)
|
||||
.lambda("B_fields")
|
||||
.apply(
|
||||
Term::var(CONSTR_FIELDS_EXPOSER)
|
||||
.apply(Term::var("field_B")),
|
||||
),
|
||||
Term::Error.trace(Term::string(
|
||||
"Constr index did not match any type variant",
|
||||
)),
|
||||
)
|
||||
.lambda("subject")
|
||||
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_B")))
|
||||
.lambda("field_B"),
|
||||
)
|
||||
.apply(Term::var("r")),
|
||||
)
|
||||
.lambda("r")
|
||||
.apply(
|
||||
Term::var("r"),
|
||||
)
|
||||
.lambda("_ctx")
|
||||
.lambda("r")
|
||||
|
|
Loading…
Reference in New Issue