feat: all compiler errors fixed
Co-authored-by: Lucas Rosa <x@rvcas.dev>
This commit is contained in:
@@ -1671,15 +1671,15 @@ pub fn handle_clause_guard(
|
||||
) {
|
||||
match clause_guard {
|
||||
ClauseGuard::Not { value, .. } => {
|
||||
let value_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut value_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(value, &mut value_stack);
|
||||
|
||||
clause_guard_stack.unop(UnOp::Not, value_stack);
|
||||
}
|
||||
ClauseGuard::Equals { left, right, .. } => {
|
||||
let left_stack = clause_guard_stack.empty_with_scope();
|
||||
let right_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut left_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut right_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(left, &mut left_stack);
|
||||
handle_clause_guard(right, &mut right_stack);
|
||||
@@ -1687,8 +1687,8 @@ pub fn handle_clause_guard(
|
||||
clause_guard_stack.binop(BinOp::Eq, left.tipo(), left_stack, right_stack);
|
||||
}
|
||||
ClauseGuard::NotEquals { left, right, .. } => {
|
||||
let left_stack = clause_guard_stack.empty_with_scope();
|
||||
let right_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut left_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut right_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(left, &mut left_stack);
|
||||
handle_clause_guard(right, &mut right_stack);
|
||||
@@ -1696,8 +1696,8 @@ pub fn handle_clause_guard(
|
||||
clause_guard_stack.binop(BinOp::NotEq, left.tipo(), left_stack, right_stack);
|
||||
}
|
||||
ClauseGuard::GtInt { left, right, .. } => {
|
||||
let left_stack = clause_guard_stack.empty_with_scope();
|
||||
let right_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut left_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut right_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(left, &mut left_stack);
|
||||
handle_clause_guard(right, &mut right_stack);
|
||||
@@ -1705,8 +1705,8 @@ pub fn handle_clause_guard(
|
||||
clause_guard_stack.binop(BinOp::GtInt, left.tipo(), left_stack, right_stack);
|
||||
}
|
||||
ClauseGuard::GtEqInt { left, right, .. } => {
|
||||
let left_stack = clause_guard_stack.empty_with_scope();
|
||||
let right_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut left_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut right_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(left, &mut left_stack);
|
||||
handle_clause_guard(right, &mut right_stack);
|
||||
@@ -1714,8 +1714,8 @@ pub fn handle_clause_guard(
|
||||
clause_guard_stack.binop(BinOp::GtEqInt, left.tipo(), left_stack, right_stack);
|
||||
}
|
||||
ClauseGuard::LtInt { left, right, .. } => {
|
||||
let left_stack = clause_guard_stack.empty_with_scope();
|
||||
let right_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut left_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut right_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(left, &mut left_stack);
|
||||
handle_clause_guard(right, &mut right_stack);
|
||||
@@ -1723,8 +1723,8 @@ pub fn handle_clause_guard(
|
||||
clause_guard_stack.binop(BinOp::LtInt, left.tipo(), left_stack, right_stack);
|
||||
}
|
||||
ClauseGuard::LtEqInt { left, right, .. } => {
|
||||
let left_stack = clause_guard_stack.empty_with_scope();
|
||||
let right_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut left_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut right_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(left, &mut left_stack);
|
||||
handle_clause_guard(right, &mut right_stack);
|
||||
@@ -1732,8 +1732,8 @@ pub fn handle_clause_guard(
|
||||
clause_guard_stack.binop(BinOp::LtEqInt, left.tipo(), left_stack, right_stack);
|
||||
}
|
||||
ClauseGuard::Or { left, right, .. } => {
|
||||
let left_stack = clause_guard_stack.empty_with_scope();
|
||||
let right_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut left_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut right_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(left, &mut left_stack);
|
||||
handle_clause_guard(right, &mut right_stack);
|
||||
@@ -1741,8 +1741,8 @@ pub fn handle_clause_guard(
|
||||
clause_guard_stack.binop(BinOp::Or, left.tipo(), left_stack, right_stack);
|
||||
}
|
||||
ClauseGuard::And { left, right, .. } => {
|
||||
let left_stack = clause_guard_stack.empty_with_scope();
|
||||
let right_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut left_stack = clause_guard_stack.empty_with_scope();
|
||||
let mut right_stack = clause_guard_stack.empty_with_scope();
|
||||
|
||||
handle_clause_guard(left, &mut left_stack);
|
||||
handle_clause_guard(right, &mut right_stack);
|
||||
|
||||
@@ -10,7 +10,14 @@ impl Scope {
|
||||
self.0.is_empty()
|
||||
}
|
||||
|
||||
pub fn replace(&mut self, pattern: &Scope, replacement: Scope) {
|
||||
pub fn replace(&mut self, pattern: &Scope, mut replacement: Scope) {
|
||||
if pattern.is_empty() {
|
||||
replacement.0.extend(self.0.iter());
|
||||
self.0 = replacement.0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
let mut result = Vec::new();
|
||||
|
||||
let mut index = 0;
|
||||
@@ -36,7 +43,7 @@ impl Scope {
|
||||
}
|
||||
|
||||
if no_matches {
|
||||
replacement.0.extend(self.0);
|
||||
replacement.0.extend(self.0.iter());
|
||||
self.0 = replacement.0;
|
||||
} else {
|
||||
self.0 = result;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use std::sync::Arc;
|
||||
use std::{rc::Rc, sync::Arc};
|
||||
|
||||
use indexmap::IndexSet;
|
||||
use uplc::{builder::EXPECT_ON_LIST, builtins::DefaultFunction};
|
||||
@@ -12,15 +12,15 @@ use crate::{
|
||||
use super::{air::Air, scope::Scope};
|
||||
|
||||
/// A builder for [`Air`].
|
||||
pub struct AirStack<'a> {
|
||||
pub id_gen: &'a mut IdGenerator,
|
||||
pub struct AirStack {
|
||||
pub id_gen: Rc<IdGenerator>,
|
||||
pub scope: Scope,
|
||||
pub air: Vec<Air>,
|
||||
}
|
||||
|
||||
impl<'a> AirStack<'a> {
|
||||
impl AirStack {
|
||||
/// Create a new [`AirStack`] with an [`IdGenerator`]
|
||||
pub fn new(id_gen: &'a mut IdGenerator) -> Self {
|
||||
pub fn new(id_gen: Rc<IdGenerator>) -> Self {
|
||||
AirStack {
|
||||
id_gen,
|
||||
scope: Scope::default(),
|
||||
@@ -29,7 +29,7 @@ impl<'a> AirStack<'a> {
|
||||
}
|
||||
|
||||
/// Create a new [`AirStack`] with an [`IdGenerator`] and [`Scope`].
|
||||
pub fn with_scope(id_gen: &'a mut IdGenerator, scope: Scope) -> Self {
|
||||
pub fn with_scope(id_gen: Rc<IdGenerator>, scope: Scope) -> Self {
|
||||
AirStack {
|
||||
id_gen,
|
||||
scope,
|
||||
@@ -39,7 +39,7 @@ impl<'a> AirStack<'a> {
|
||||
|
||||
/// Create a new empty [`AirStack`] with the current stack's scope.
|
||||
pub fn empty_with_scope(&mut self) -> Self {
|
||||
AirStack::with_scope(&mut self.id_gen, self.scope.clone())
|
||||
AirStack::with_scope(self.id_gen.clone(), self.scope.clone())
|
||||
}
|
||||
|
||||
/// Increment the [`Scope`]
|
||||
@@ -266,7 +266,7 @@ impl<'a> AirStack<'a> {
|
||||
self.air.push(Air::Call {
|
||||
scope: self.scope.clone(),
|
||||
count: 2,
|
||||
tipo,
|
||||
tipo: tipo.clone(),
|
||||
});
|
||||
|
||||
self.local_var(tipo.clone(), EXPECT_ON_LIST);
|
||||
@@ -389,6 +389,8 @@ impl<'a> AirStack<'a> {
|
||||
) {
|
||||
self.new_scope();
|
||||
|
||||
let count = tipo.get_inner_types().len();
|
||||
|
||||
self.air.push(Air::TupleClause {
|
||||
scope: self.scope.clone(),
|
||||
subject_name: subject_name.to_string(),
|
||||
@@ -396,7 +398,7 @@ impl<'a> AirStack<'a> {
|
||||
predefined_indices,
|
||||
complex_clause,
|
||||
tipo,
|
||||
count: tipo.get_inner_types().len(),
|
||||
count,
|
||||
});
|
||||
|
||||
self.merge_child(body);
|
||||
@@ -434,7 +436,7 @@ impl<'a> AirStack<'a> {
|
||||
self.air.push(Air::Builtin {
|
||||
scope: self.scope.clone(),
|
||||
func: DefaultFunction::ChooseUnit,
|
||||
tipo: tipo.clone(),
|
||||
tipo,
|
||||
count: DefaultFunction::ChooseUnit.arity(),
|
||||
});
|
||||
|
||||
@@ -490,6 +492,8 @@ impl<'a> AirStack<'a> {
|
||||
scope: self.scope.clone(),
|
||||
constr_index: tag,
|
||||
});
|
||||
|
||||
self.merge_child(value);
|
||||
}
|
||||
|
||||
pub fn expect_bool(&mut self, is_true: bool, value: AirStack) {
|
||||
@@ -590,7 +594,7 @@ impl<'a> AirStack<'a> {
|
||||
}
|
||||
|
||||
pub fn clause_guard(
|
||||
&self,
|
||||
&mut self,
|
||||
subject_name: impl ToString,
|
||||
tipo: Arc<Type>,
|
||||
condition_stack: AirStack,
|
||||
@@ -629,7 +633,7 @@ impl<'a> AirStack<'a> {
|
||||
}
|
||||
|
||||
pub fn list_clause_guard(
|
||||
&self,
|
||||
&mut self,
|
||||
tipo: Arc<Type>,
|
||||
tail_name: impl ToString,
|
||||
next_tail_name: Option<String>,
|
||||
|
||||
Reference in New Issue
Block a user