fix errors

This commit is contained in:
microproofs 2024-04-09 23:34:36 -04:00 committed by Kasey
parent 5c59b816ea
commit ebe415cfc9
4 changed files with 89 additions and 141 deletions

View File

@ -1119,6 +1119,9 @@ impl Annotation {
elems.iter().find_map(|arg| arg.find_node(byte_index))
}
Annotation::Var { .. } | Annotation::Hole { .. } => None,
Annotation::Pair { fst, snd, .. } => fst
.find_node(byte_index)
.or_else(|| snd.find_node(byte_index)),
};
located.or(Some(Located::Annotation(self)))

View File

@ -372,42 +372,32 @@ impl<'a> CodeGenerator<'a> {
},
..
} => {
if tipo.is_pair() {
assert!(args.len() == 2);
let data_type = lookup_data_type_by_tipo(&self.data_types, tipo)
.expect("Creating a record with no record definition.");
let arg1 = self.build(&args[0].value, module_build_name, &[]);
let (constr_index, _) = data_type
.constructors
.iter()
.enumerate()
.find(|(_, dt)| &dt.name == constr_name)
.unwrap();
let arg2 = self.build(&args[1].value, module_build_name, &[]);
let constr_args = args
.iter()
.zip(constr_tipo.arg_types().unwrap())
.map(|(arg, tipo)| {
if tipo.is_data() {
AirTree::cast_to_data(
self.build(&arg.value, module_build_name, &[]),
arg.value.tipo(),
)
} else {
self.build(&arg.value, module_build_name, &[])
}
})
.collect_vec();
AirTree::pair(arg1, arg2, tipo.clone())
} else {
let data_type = lookup_data_type_by_tipo(&self.data_types, tipo)
.expect("Creating a record with no record definition.");
let (constr_index, _) = data_type
.constructors
.iter()
.enumerate()
.find(|(_, dt)| &dt.name == constr_name)
.unwrap();
let constr_args = args
.iter()
.zip(constr_tipo.arg_types().unwrap())
.map(|(arg, tipo)| {
if tipo.is_data() {
AirTree::cast_to_data(
self.build(&arg.value, module_build_name, &[]),
arg.value.tipo(),
)
} else {
self.build(&arg.value, module_build_name, &[])
}
})
.collect_vec();
AirTree::create_constr(constr_index, constr_tipo.clone(), constr_args)
}
AirTree::create_constr(constr_index, constr_tipo.clone(), constr_args)
}
TypedExpr::Var {
@ -659,12 +649,6 @@ impl<'a> CodeGenerator<'a> {
} => {
if check_replaceable_opaque_type(&record.tipo(), &self.data_types) {
self.build(record, module_build_name, &[])
} else if record.tipo().is_pair() {
AirTree::pair_index(
*index,
tipo.clone(),
self.build(record, module_build_name, &[]),
)
} else {
let function_name = format!("__access_index_{}", *index);
@ -714,19 +698,7 @@ impl<'a> CodeGenerator<'a> {
field_map,
..
} => {
let val_constructor = if tipo.is_pair() {
ValueConstructor::public(
tipo.clone(),
ValueConstructorVariant::Record {
module: "".into(),
name: name.clone(),
field_map: field_map.clone(),
arity: 2,
location: Span::empty(),
constructors_count: 1,
},
)
} else {
let val_constructor = {
let data_type = lookup_data_type_by_tipo(&self.data_types, tipo);
ValueConstructor::public(
@ -792,35 +764,43 @@ impl<'a> CodeGenerator<'a> {
TypedExpr::TupleIndex {
index, tuple, tipo, ..
} => {
let function_name = format!("__access_index_{}", *index);
if tuple.tipo().is_pair() {
AirTree::pair_index(
*index,
tipo.clone(),
self.build(tuple, module_build_name, &[]),
)
} else {
let function_name = format!("__access_index_{}", *index);
if self.code_gen_functions.get(&function_name).is_none() {
let mut body = AirTree::local_var("__fields", list(data()));
if self.code_gen_functions.get(&function_name).is_none() {
let mut body = AirTree::local_var("__fields", list(data()));
for _ in 0..*index {
body = AirTree::builtin(
DefaultFunction::TailList,
list(data()),
vec![body],
)
for _ in 0..*index {
body = AirTree::builtin(
DefaultFunction::TailList,
list(data()),
vec![body],
)
}
body = AirTree::builtin(DefaultFunction::HeadList, data(), vec![body]);
self.code_gen_functions.insert(
function_name.clone(),
CodeGenFunction::Function {
body,
params: vec!["__fields".to_string()],
},
);
}
body = AirTree::builtin(DefaultFunction::HeadList, data(), vec![body]);
self.code_gen_functions.insert(
function_name.clone(),
CodeGenFunction::Function {
body,
params: vec!["__fields".to_string()],
},
);
AirTree::index_access(
function_name,
tipo.clone(),
self.build(tuple, module_build_name, &[]),
)
}
AirTree::index_access(
function_name,
tipo.clone(),
self.build(tuple, module_build_name, &[]),
)
}
TypedExpr::ErrorTerm { tipo, .. } => AirTree::error(tipo.clone(), false),
@ -828,66 +808,32 @@ impl<'a> CodeGenerator<'a> {
TypedExpr::RecordUpdate {
tipo, spread, args, ..
} => {
if tipo.is_pair() {
assert!(args.len() == 1);
let mut index_types = vec![];
let mut update_args = vec![];
let Some(arg) = args.first() else {
unreachable!("Pair update with no arguments")
};
let mut highest_index = 0;
for arg in args
.iter()
.sorted_by(|arg1, arg2| arg1.index.cmp(&arg2.index))
{
let arg_val = self.build(&arg.value, module_build_name, &[]);
let other_pair = self.build(spread, module_build_name, &[]);
if arg.index == 0 {
AirTree::pair(
arg_val,
AirTree::pair_index(
1,
tipo.get_inner_types()[1].clone(),
other_pair,
),
tipo.clone(),
)
} else {
AirTree::pair(
AirTree::pair_index(
0,
tipo.get_inner_types()[0].clone(),
other_pair,
),
arg_val,
tipo.clone(),
)
}
} else {
let mut index_types = vec![];
let mut update_args = vec![];
let mut highest_index = 0;
for arg in args
.iter()
.sorted_by(|arg1, arg2| arg1.index.cmp(&arg2.index))
{
let arg_val = self.build(&arg.value, module_build_name, &[]);
if arg.index > highest_index {
highest_index = arg.index;
}
index_types.push((arg.index, arg.value.tipo()));
update_args.push(arg_val);
if arg.index > highest_index {
highest_index = arg.index;
}
AirTree::record_update(
index_types,
highest_index,
tipo.clone(),
self.build(spread, module_build_name, &[]),
update_args,
)
index_types.push((arg.index, arg.value.tipo()));
update_args.push(arg_val);
}
AirTree::record_update(
index_types,
highest_index,
tipo.clone(),
self.build(spread, module_build_name, &[]),
update_args,
)
}
TypedExpr::UnOp { value, op, .. } => {
AirTree::unop(*op, self.build(value, module_build_name, &[]))
@ -4521,8 +4467,9 @@ impl<'a> CodeGenerator<'a> {
arg_vec.push(arg_stack.pop().unwrap());
}
let tipo = match tipo.as_ref() {
let ret_tipo = match tipo.as_ref() {
Type::Fn { ret, .. } => ret,
// In this case the Air Opcode only holds the return type and not the function type
_ => &tipo,
};
@ -4537,11 +4484,11 @@ impl<'a> CodeGenerator<'a> {
}
DefaultFunction::FstPair | DefaultFunction::SndPair => {
builder::undata_builtin(&func, count, tipo, arg_vec)
builder::undata_builtin(&func, count, ret_tipo, arg_vec)
}
DefaultFunction::HeadList if !tipo.is_pair() => {
builder::undata_builtin(&func, count, tipo, arg_vec)
builder::undata_builtin(&func, count, ret_tipo, arg_vec)
}
DefaultFunction::MkCons | DefaultFunction::MkPairData => {

View File

@ -937,7 +937,7 @@ impl AirTree {
}
}
pub fn pair_index(index: u64, tipo: Rc<Type>, tuple: AirTree) -> AirTree {
pub fn pair_index(index: usize, tipo: Rc<Type>, tuple: AirTree) -> AirTree {
AirTree::cast_from_data(
AirTree::builtin(
if index == 0 {

View File

@ -2117,7 +2117,7 @@ fn acceptance_test_22_filter_map() {
fn acceptance_test_23_to_list() {
let src = r#"
pub type Map<key, value> =
List<Pair<key, value>>
List<Pair<key, value>>
pub opaque type AssocList<key, value> {
inner: Map<key, value>,
@ -2143,11 +2143,11 @@ fn acceptance_test_23_to_list() {
when elems is {
[] ->
[Pair(k, v)]
[Pair { fst: k2, snd: v2 }, ..rest] ->
[Pair(k2, v2), ..rest] ->
if k == k2 {
[Pair(k, v), ..rest]
[Pair(k, v), ..rest]
} else {
[Pair(k2, v2), ..do_insert(rest, k, v)]
[Pair(k2, v2), ..do_insert(rest, k, v)]
}
}
}
@ -2159,7 +2159,7 @@ fn acceptance_test_23_to_list() {
}
test to_list_2() {
to_list(fixture_1()) == [Pair("foo", 42), Pair("bar", 14)]
to_list(fixture_1()) == [Pair("foo", 42).2nd, Pair("bar", 14)]
}
"#;
@ -2996,8 +2996,6 @@ fn acceptance_test_28_unique_list() {
#[test]
fn acceptance_test_29_union_pair() {
let src = r#"
type Map<a,b> = List<Pair<a,b>>
pub opaque type AssocList<key, value> {
inner: Map<key, value>,
}
@ -3054,7 +3052,7 @@ fn acceptance_test_29_union_pair() {
when left is {
[] ->
right
[Pair{fst: k, snd: v}, ..rest] ->
[Pair(k, v), ..rest] ->
do_union(rest, do_insert(right, k, v))
}
}