all but six tests passing
This commit is contained in:
parent
6eeb282dee
commit
72b6f0f847
|
@ -168,7 +168,6 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut air_tree = self.build(test_body);
|
let mut air_tree = self.build(test_body);
|
||||||
|
|
||||||
air_tree = AirTree::no_op().hoist_over(air_tree);
|
air_tree = AirTree::no_op().hoist_over(air_tree);
|
||||||
println!("{:#?}", air_tree.to_vec());
|
|
||||||
|
|
||||||
let full_tree = self.hoist_functions_to_validator(air_tree);
|
let full_tree = self.hoist_functions_to_validator(air_tree);
|
||||||
|
|
||||||
|
@ -810,7 +809,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let names = elems.iter().map(|(name, _)| name.to_string()).collect_vec();
|
let names = elems.iter().map(|(name, _)| name.to_string()).collect_vec();
|
||||||
|
|
||||||
let list_access = if elements.is_empty() {
|
let list_access = if elements.is_empty() {
|
||||||
AirTree::let_assignment("_", AirTree::list_empty(value))
|
AirTree::list_empty(value)
|
||||||
} else {
|
} else {
|
||||||
AirTree::list_access(names, tipo.clone(), tail.is_some(), tail.is_none(), value)
|
AirTree::list_access(names, tipo.clone(), tail.is_some(), tail.is_none(), value)
|
||||||
};
|
};
|
||||||
|
@ -1366,7 +1365,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
tipo.clone(),
|
tipo.clone(),
|
||||||
));
|
));
|
||||||
|
|
||||||
assigns.insert(0, AirTree::let_assignment("_", empty));
|
assigns.insert(0, empty);
|
||||||
} else {
|
} else {
|
||||||
let expose = AirTree::fields_expose(
|
let expose = AirTree::fields_expose(
|
||||||
indices,
|
indices,
|
||||||
|
@ -3130,6 +3129,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
} => {
|
} => {
|
||||||
let value = arg_stack.pop().unwrap();
|
let value = arg_stack.pop().unwrap();
|
||||||
let mut term = arg_stack.pop().unwrap();
|
let mut term = arg_stack.pop().unwrap();
|
||||||
|
|
||||||
let list_id = self.id_gen.next();
|
let list_id = self.id_gen.next();
|
||||||
|
|
||||||
let mut id_list = vec![];
|
let mut id_list = vec![];
|
||||||
|
@ -3146,6 +3146,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
.take(names.len())
|
.take(names.len())
|
||||||
.collect_vec();
|
.collect_vec();
|
||||||
|
|
||||||
|
if !names.is_empty() {
|
||||||
term = builder::list_access_to_uplc(
|
term = builder::list_access_to_uplc(
|
||||||
&names,
|
&names,
|
||||||
&id_list,
|
&id_list,
|
||||||
|
@ -3160,6 +3161,19 @@ impl<'a> CodeGenerator<'a> {
|
||||||
.apply(value);
|
.apply(value);
|
||||||
|
|
||||||
arg_stack.push(term);
|
arg_stack.push(term);
|
||||||
|
} else if check_last_item {
|
||||||
|
let trace_term = if self.tracing {
|
||||||
|
Term::Error.trace(Term::string("Expected no items for List"))
|
||||||
|
} else {
|
||||||
|
Term::Error
|
||||||
|
};
|
||||||
|
|
||||||
|
term = value.delayed_choose_list(term, trace_term);
|
||||||
|
|
||||||
|
arg_stack.push(term);
|
||||||
|
} else {
|
||||||
|
arg_stack.push(term);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Air::ListExpose {
|
Air::ListExpose {
|
||||||
tail_head_names,
|
tail_head_names,
|
||||||
|
@ -3170,13 +3184,13 @@ impl<'a> CodeGenerator<'a> {
|
||||||
} => {
|
} => {
|
||||||
let mut term = arg_stack.pop().unwrap();
|
let mut term = arg_stack.pop().unwrap();
|
||||||
|
|
||||||
if let Some((tail_var, tail_name)) = tail {
|
if let Some((tail_var, tail_name)) = &tail {
|
||||||
term = term
|
term = term
|
||||||
.lambda(tail_name)
|
.lambda(tail_name)
|
||||||
.apply(Term::tail_list().apply(Term::var(tail_var)));
|
.apply(Term::tail_list().apply(Term::var(tail_var)));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (tail_var, head_name) in tail_head_names.into_iter().rev() {
|
for (tail_var, head_name) in tail_head_names.iter().rev() {
|
||||||
let head_list = if tipo.is_map() {
|
let head_list = if tipo.is_map() {
|
||||||
Term::head_list().apply(Term::var(tail_var))
|
Term::head_list().apply(Term::var(tail_var))
|
||||||
} else {
|
} else {
|
||||||
|
@ -3679,8 +3693,8 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::WrapClause => {
|
Air::WrapClause => {
|
||||||
// no longer need to pop off discard
|
// no longer need to pop off discard
|
||||||
let mut term = arg_stack.pop().unwrap();
|
|
||||||
let arg = arg_stack.pop().unwrap();
|
let arg = arg_stack.pop().unwrap();
|
||||||
|
let mut term = arg_stack.pop().unwrap();
|
||||||
|
|
||||||
term = term.lambda("__other_clauses_delayed").apply(arg.delay());
|
term = term.lambda("__other_clauses_delayed").apply(arg.delay());
|
||||||
|
|
||||||
|
@ -3919,6 +3933,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
} => {
|
} => {
|
||||||
self.needs_field_access = true;
|
self.needs_field_access = true;
|
||||||
let mut id_list = vec![];
|
let mut id_list = vec![];
|
||||||
|
|
||||||
let value = arg_stack.pop().unwrap();
|
let value = arg_stack.pop().unwrap();
|
||||||
let mut term = arg_stack.pop().unwrap();
|
let mut term = arg_stack.pop().unwrap();
|
||||||
let list_id = self.id_gen.next();
|
let list_id = self.id_gen.next();
|
||||||
|
@ -3934,8 +3949,8 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let names = indices.iter().cloned().map(|item| item.1).collect_vec();
|
let names = indices.iter().cloned().map(|item| item.1).collect_vec();
|
||||||
let inner_types = indices.iter().cloned().map(|item| item.2).collect_vec();
|
let inner_types = indices.iter().cloned().map(|item| item.2).collect_vec();
|
||||||
|
|
||||||
term = if !indices.is_empty() {
|
if !indices.is_empty() {
|
||||||
builder::list_access_to_uplc(
|
term = builder::list_access_to_uplc(
|
||||||
&names,
|
&names,
|
||||||
&id_list,
|
&id_list,
|
||||||
false,
|
false,
|
||||||
|
@ -3945,14 +3960,26 @@ impl<'a> CodeGenerator<'a> {
|
||||||
check_last_item,
|
check_last_item,
|
||||||
false,
|
false,
|
||||||
self.tracing,
|
self.tracing,
|
||||||
)
|
);
|
||||||
} else {
|
|
||||||
term
|
|
||||||
};
|
|
||||||
|
|
||||||
term = term.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(value));
|
term = term.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(value));
|
||||||
|
|
||||||
arg_stack.push(term);
|
arg_stack.push(term);
|
||||||
|
} else if check_last_item {
|
||||||
|
let trace_term = if self.tracing {
|
||||||
|
Term::Error.trace(Term::string("Expected no fields for Constr"))
|
||||||
|
} else {
|
||||||
|
Term::Error
|
||||||
|
};
|
||||||
|
|
||||||
|
term = Term::var(CONSTR_FIELDS_EXPOSER)
|
||||||
|
.apply(value)
|
||||||
|
.delayed_choose_list(term, trace_term);
|
||||||
|
|
||||||
|
arg_stack.push(term);
|
||||||
|
} else {
|
||||||
|
arg_stack.push(term);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
Air::FieldsEmpty => {
|
Air::FieldsEmpty => {
|
||||||
self.needs_field_access = true;
|
self.needs_field_access = true;
|
||||||
|
@ -4209,7 +4236,9 @@ impl<'a> CodeGenerator<'a> {
|
||||||
))
|
))
|
||||||
.lambda(format!("__tuple_{list_id}"))
|
.lambda(format!("__tuple_{list_id}"))
|
||||||
.apply(value);
|
.apply(value);
|
||||||
} else {
|
|
||||||
|
arg_stack.push(term);
|
||||||
|
} else if !names.is_empty() {
|
||||||
let mut id_list = vec![];
|
let mut id_list = vec![];
|
||||||
id_list.push(list_id);
|
id_list.push(list_id);
|
||||||
|
|
||||||
|
@ -4229,9 +4258,21 @@ impl<'a> CodeGenerator<'a> {
|
||||||
self.tracing,
|
self.tracing,
|
||||||
)
|
)
|
||||||
.apply(value);
|
.apply(value);
|
||||||
}
|
|
||||||
|
|
||||||
arg_stack.push(term);
|
arg_stack.push(term);
|
||||||
|
} else if check_last_item {
|
||||||
|
let trace_term = if self.tracing {
|
||||||
|
Term::Error.trace(Term::string("Expected no items for Tuple"))
|
||||||
|
} else {
|
||||||
|
Term::Error
|
||||||
|
};
|
||||||
|
|
||||||
|
term = value.delayed_choose_list(term, trace_term);
|
||||||
|
|
||||||
|
arg_stack.push(term);
|
||||||
|
} else {
|
||||||
|
arg_stack.push(term);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Air::Trace { .. } => {
|
Air::Trace { .. } => {
|
||||||
let text = arg_stack.pop().unwrap();
|
let text = arg_stack.pop().unwrap();
|
||||||
|
|
|
@ -185,6 +185,12 @@ pub enum AirStatement {
|
||||||
tuple: Box<AirTree>,
|
tuple: Box<AirTree>,
|
||||||
},
|
},
|
||||||
// Misc.
|
// Misc.
|
||||||
|
FieldsEmpty {
|
||||||
|
constr: Box<AirTree>,
|
||||||
|
},
|
||||||
|
ListEmpty {
|
||||||
|
list: Box<AirTree>,
|
||||||
|
},
|
||||||
NoOp,
|
NoOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,12 +345,6 @@ pub enum AirExpression {
|
||||||
msg: Box<AirTree>,
|
msg: Box<AirTree>,
|
||||||
then: Box<AirTree>,
|
then: Box<AirTree>,
|
||||||
},
|
},
|
||||||
FieldsEmpty {
|
|
||||||
constr: Box<AirTree>,
|
|
||||||
},
|
|
||||||
ListEmpty {
|
|
||||||
list: Box<AirTree>,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AirTree {
|
impl AirTree {
|
||||||
|
@ -769,12 +769,18 @@ impl AirTree {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn fields_empty(constr: AirTree) -> AirTree {
|
pub fn fields_empty(constr: AirTree) -> AirTree {
|
||||||
AirTree::Expression(AirExpression::FieldsEmpty {
|
AirTree::Statement {
|
||||||
|
statement: AirStatement::FieldsEmpty {
|
||||||
constr: constr.into(),
|
constr: constr.into(),
|
||||||
})
|
},
|
||||||
|
hoisted_over: None,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pub fn list_empty(list: AirTree) -> AirTree {
|
pub fn list_empty(list: AirTree) -> AirTree {
|
||||||
AirTree::Expression(AirExpression::ListEmpty { list: list.into() })
|
AirTree::Statement {
|
||||||
|
statement: AirStatement::ListEmpty { list: list.into() },
|
||||||
|
hoisted_over: None,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pub fn hoist_over(mut self, next_exp: AirTree) -> AirTree {
|
pub fn hoist_over(mut self, next_exp: AirTree) -> AirTree {
|
||||||
match &mut self {
|
match &mut self {
|
||||||
|
@ -969,6 +975,14 @@ impl AirTree {
|
||||||
AirStatement::NoOp => {
|
AirStatement::NoOp => {
|
||||||
air_vec.push(Air::NoOp);
|
air_vec.push(Air::NoOp);
|
||||||
}
|
}
|
||||||
|
AirStatement::FieldsEmpty { constr } => {
|
||||||
|
air_vec.push(Air::FieldsEmpty);
|
||||||
|
constr.create_air_vec(air_vec);
|
||||||
|
}
|
||||||
|
AirStatement::ListEmpty { list } => {
|
||||||
|
air_vec.push(Air::ListEmpty);
|
||||||
|
list.create_air_vec(air_vec);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
exp.create_air_vec(air_vec);
|
exp.create_air_vec(air_vec);
|
||||||
}
|
}
|
||||||
|
@ -1212,14 +1226,6 @@ impl AirTree {
|
||||||
msg.create_air_vec(air_vec);
|
msg.create_air_vec(air_vec);
|
||||||
then.create_air_vec(air_vec);
|
then.create_air_vec(air_vec);
|
||||||
}
|
}
|
||||||
AirExpression::FieldsEmpty { constr } => {
|
|
||||||
air_vec.push(Air::FieldsEmpty);
|
|
||||||
constr.create_air_vec(air_vec);
|
|
||||||
}
|
|
||||||
AirExpression::ListEmpty { list } => {
|
|
||||||
air_vec.push(Air::ListEmpty);
|
|
||||||
list.create_air_vec(air_vec);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
AirTree::UnhoistedSequence(_) => {
|
AirTree::UnhoistedSequence(_) => {
|
||||||
unreachable!("FIRST RESOLVE ALL UNHOISTED SEQUENCES")
|
unreachable!("FIRST RESOLVE ALL UNHOISTED SEQUENCES")
|
||||||
|
@ -1266,9 +1272,6 @@ impl AirTree {
|
||||||
| AirExpression::WrapClause { then, .. }
|
| AirExpression::WrapClause { then, .. }
|
||||||
| AirExpression::TupleClause { then, .. }
|
| AirExpression::TupleClause { then, .. }
|
||||||
| AirExpression::Finally { then, .. } => then.return_type(),
|
| AirExpression::Finally { then, .. } => then.return_type(),
|
||||||
|
|
||||||
AirExpression::FieldsEmpty { constr } => constr.return_type(),
|
|
||||||
AirExpression::ListEmpty { list } => list.return_type(),
|
|
||||||
},
|
},
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
|
@ -1425,6 +1428,22 @@ impl AirTree {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
AirStatement::NoOp => {}
|
AirStatement::NoOp => {}
|
||||||
|
AirStatement::FieldsEmpty { constr } => {
|
||||||
|
constr.do_traverse_tree_with(
|
||||||
|
tree_path,
|
||||||
|
current_depth + 1,
|
||||||
|
index_count.next_number(),
|
||||||
|
with,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
AirStatement::ListEmpty { list } => {
|
||||||
|
list.do_traverse_tree_with(
|
||||||
|
tree_path,
|
||||||
|
current_depth + 1,
|
||||||
|
index_count.next_number(),
|
||||||
|
with,
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
hoisted_over.do_traverse_tree_with(
|
hoisted_over.do_traverse_tree_with(
|
||||||
|
@ -1721,22 +1740,6 @@ impl AirTree {
|
||||||
with,
|
with,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
AirExpression::FieldsEmpty { constr } => {
|
|
||||||
constr.do_traverse_tree_with(
|
|
||||||
tree_path,
|
|
||||||
current_depth + 1,
|
|
||||||
index_count.next_number(),
|
|
||||||
with,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
AirExpression::ListEmpty { list } => {
|
|
||||||
list.do_traverse_tree_with(
|
|
||||||
tree_path,
|
|
||||||
current_depth + 1,
|
|
||||||
index_count.next_number(),
|
|
||||||
with,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
a => unreachable!("GOT THIS {:#?}", a),
|
a => unreachable!("GOT THIS {:#?}", a),
|
||||||
|
@ -1861,6 +1864,24 @@ impl AirTree {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AirStatement::DefineFunc { .. } => unreachable!(),
|
AirStatement::DefineFunc { .. } => unreachable!(),
|
||||||
|
AirStatement::FieldsEmpty { constr } => {
|
||||||
|
if *index == 0 {
|
||||||
|
constr.as_mut().do_find_air_tree_node(tree_path_iter)
|
||||||
|
} else if *index == 1 {
|
||||||
|
hoisted_over.as_mut().do_find_air_tree_node(tree_path_iter)
|
||||||
|
} else {
|
||||||
|
panic!("Tree Path index outside tree children nodes")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AirStatement::ListEmpty { list } => {
|
||||||
|
if *index == 0 {
|
||||||
|
list.as_mut().do_find_air_tree_node(tree_path_iter)
|
||||||
|
} else if *index == 1 {
|
||||||
|
hoisted_over.as_mut().do_find_air_tree_node(tree_path_iter)
|
||||||
|
} else {
|
||||||
|
panic!("Tree Path index outside tree children nodes")
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
AirTree::Expression(e) => match e {
|
AirTree::Expression(e) => match e {
|
||||||
AirExpression::List { items, .. }
|
AirExpression::List { items, .. }
|
||||||
|
@ -2037,20 +2058,6 @@ impl AirTree {
|
||||||
panic!("Tree Path index outside tree children nodes")
|
panic!("Tree Path index outside tree children nodes")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AirExpression::FieldsEmpty { constr } => {
|
|
||||||
if *index == 0 {
|
|
||||||
constr.as_mut().do_find_air_tree_node(tree_path_iter)
|
|
||||||
} else {
|
|
||||||
panic!("Tree Path index outside tree children nodes")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AirExpression::ListEmpty { list } => {
|
|
||||||
if *index == 0 {
|
|
||||||
list.as_mut().do_find_air_tree_node(tree_path_iter)
|
|
||||||
} else {
|
|
||||||
panic!("Tree Path index outside tree children nodes")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => unreachable!(
|
_ => unreachable!(
|
||||||
"A tree node with no children was encountered with a longer tree path."
|
"A tree node with no children was encountered with a longer tree path."
|
||||||
),
|
),
|
||||||
|
|
Loading…
Reference in New Issue