feat: record modules are no longer unimplemented for no fields
refactor: remove some clones and use a ref instead test: add acceptance test 81
This commit is contained in:
parent
3356e2ecd0
commit
4838ebd39e
|
@ -20,7 +20,10 @@ use crate::{
|
||||||
},
|
},
|
||||||
builtins::{bool, data, void},
|
builtins::{bool, data, void},
|
||||||
expr::TypedExpr,
|
expr::TypedExpr,
|
||||||
gen_uplc::builder::{find_and_replace_generics, get_generic_id_and_type, get_variant_name},
|
gen_uplc::builder::{
|
||||||
|
find_and_replace_generics, get_generic_id_and_type, get_variant_name,
|
||||||
|
lookup_data_type_by_tipo,
|
||||||
|
},
|
||||||
tipo::{
|
tipo::{
|
||||||
ModuleValueConstructor, PatternConstructor, Type, TypeInfo, ValueConstructor,
|
ModuleValueConstructor, PatternConstructor, Type, TypeInfo, ValueConstructor,
|
||||||
ValueConstructorVariant,
|
ValueConstructorVariant,
|
||||||
|
@ -296,7 +299,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
name: constr_name, ..
|
name: constr_name, ..
|
||||||
} => {
|
} => {
|
||||||
if let Some(data_type) =
|
if let Some(data_type) =
|
||||||
builder::lookup_data_type_by_tipo(self.data_types.clone(), tipo)
|
builder::lookup_data_type_by_tipo(&self.data_types, tipo)
|
||||||
{
|
{
|
||||||
let (constr_index, _) = data_type
|
let (constr_index, _) = data_type
|
||||||
.constructors
|
.constructors
|
||||||
|
@ -365,7 +368,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
if let Some(data_type) =
|
if let Some(data_type) =
|
||||||
builder::lookup_data_type_by_tipo(self.data_types.clone(), tipo)
|
builder::lookup_data_type_by_tipo(&self.data_types, tipo)
|
||||||
{
|
{
|
||||||
let (constr_index, _) = data_type
|
let (constr_index, _) = data_type
|
||||||
.constructors
|
.constructors
|
||||||
|
@ -470,7 +473,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut pattern_stack = ir_stack.empty_with_scope();
|
let mut pattern_stack = ir_stack.empty_with_scope();
|
||||||
|
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
self.build(value, &mut value_stack);
|
self.build(value, &mut value_stack);
|
||||||
|
|
||||||
|
@ -648,8 +651,29 @@ impl<'a> CodeGenerator<'a> {
|
||||||
tipo,
|
tipo,
|
||||||
..
|
..
|
||||||
} => match constructor {
|
} => match constructor {
|
||||||
ModuleValueConstructor::Record { .. } => {
|
ModuleValueConstructor::Record {
|
||||||
todo!("Records from modules not yet implemented.")
|
name,
|
||||||
|
arity,
|
||||||
|
tipo,
|
||||||
|
field_map,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
assert!(arity == &0, "Wait how did you get here?");
|
||||||
|
let data_type = lookup_data_type_by_tipo(&self.data_types, tipo);
|
||||||
|
|
||||||
|
let val_constructor = ValueConstructor::public(
|
||||||
|
tipo.clone(),
|
||||||
|
ValueConstructorVariant::Record {
|
||||||
|
name: name.clone(),
|
||||||
|
arity: *arity,
|
||||||
|
field_map: field_map.clone(),
|
||||||
|
location: Span::empty(),
|
||||||
|
module: module_name.clone(),
|
||||||
|
constructors_count: data_type.unwrap().constructors.len() as u16,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
ir_stack.var(val_constructor, name, "");
|
||||||
}
|
}
|
||||||
ModuleValueConstructor::Fn { name, module, .. } => {
|
ModuleValueConstructor::Fn { name, module, .. } => {
|
||||||
let func = self.functions.get(&FunctionAccessKey {
|
let func = self.functions.get(&FunctionAccessKey {
|
||||||
|
@ -816,10 +840,8 @@ impl<'a> CodeGenerator<'a> {
|
||||||
if clause.pattern.is_var() || clause.pattern.is_discard() {
|
if clause.pattern.is_var() || clause.pattern.is_discard() {
|
||||||
ir_stack.wrap_clause(clause_pattern_stack);
|
ir_stack.wrap_clause(clause_pattern_stack);
|
||||||
} else {
|
} else {
|
||||||
let data_type = builder::lookup_data_type_by_tipo(
|
let data_type =
|
||||||
self.data_types.clone(),
|
builder::lookup_data_type_by_tipo(&self.data_types, subject_type);
|
||||||
subject_type,
|
|
||||||
);
|
|
||||||
|
|
||||||
if let Some(data_type) = data_type {
|
if let Some(data_type) = data_type {
|
||||||
if data_type.constructors.len() > 1 {
|
if data_type.constructors.len() > 1 {
|
||||||
|
@ -1057,7 +1079,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
// find data type definition
|
// find data type definition
|
||||||
let data_type =
|
let data_type =
|
||||||
builder::lookup_data_type_by_tipo(self.data_types.clone(), tipo).unwrap();
|
builder::lookup_data_type_by_tipo(&self.data_types, tipo).unwrap();
|
||||||
|
|
||||||
let (index, _) = data_type
|
let (index, _) = data_type
|
||||||
.constructors
|
.constructors
|
||||||
|
@ -1228,8 +1250,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
tipo,
|
tipo,
|
||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
let data_type =
|
let data_type = builder::lookup_data_type_by_tipo(&self.data_types, tipo).unwrap();
|
||||||
builder::lookup_data_type_by_tipo(self.data_types.clone(), tipo).unwrap();
|
|
||||||
|
|
||||||
let (_, constructor_type) = data_type
|
let (_, constructor_type) = data_type
|
||||||
.constructors
|
.constructors
|
||||||
|
@ -1530,8 +1551,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
} => {
|
} => {
|
||||||
let id = self.id_gen.next();
|
let id = self.id_gen.next();
|
||||||
let constr_var_name = format!("{constr_name}_{id}");
|
let constr_var_name = format!("{constr_name}_{id}");
|
||||||
let data_type =
|
let data_type = builder::lookup_data_type_by_tipo(&self.data_types, tipo).unwrap();
|
||||||
builder::lookup_data_type_by_tipo(self.data_types.clone(), tipo).unwrap();
|
|
||||||
|
|
||||||
let mut when_stack = pattern_stack.empty_with_scope();
|
let mut when_stack = pattern_stack.empty_with_scope();
|
||||||
|
|
||||||
|
@ -1899,8 +1919,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
unimplemented!("What are you doing with Data type?")
|
unimplemented!("What are you doing with Data type?")
|
||||||
} else {
|
} else {
|
||||||
let data_type =
|
let data_type =
|
||||||
builder::lookup_data_type_by_tipo(self.data_types.clone(), tipo)
|
builder::lookup_data_type_by_tipo(&self.data_types, tipo).unwrap();
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let (index, _) = data_type
|
let (index, _) = data_type
|
||||||
.constructors
|
.constructors
|
||||||
|
@ -2106,7 +2125,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let data_type =
|
let data_type =
|
||||||
builder::lookup_data_type_by_tipo(self.data_types.clone(), tipo).unwrap();
|
builder::lookup_data_type_by_tipo(&self.data_types, tipo).unwrap();
|
||||||
|
|
||||||
let (index, data_type_constr) = data_type
|
let (index, data_type_constr) = data_type
|
||||||
.constructors
|
.constructors
|
||||||
|
@ -2282,7 +2301,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
defined_data_types: &mut IndexMap<String, u64>,
|
defined_data_types: &mut IndexMap<String, u64>,
|
||||||
) {
|
) {
|
||||||
let mut tipo = tipo.clone().into();
|
let mut tipo = tipo.clone().into();
|
||||||
builder::replace_opaque_type(&mut tipo, self.data_types.clone());
|
builder::replace_opaque_type(&mut tipo, &self.data_types);
|
||||||
|
|
||||||
if tipo.is_bool()
|
if tipo.is_bool()
|
||||||
|| tipo.is_bytearray()
|
|| tipo.is_bytearray()
|
||||||
|
@ -2427,8 +2446,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let data_type =
|
let data_type = builder::lookup_data_type_by_tipo(&self.data_types, &tipo).unwrap();
|
||||||
builder::lookup_data_type_by_tipo(self.data_types.clone(), &tipo).unwrap();
|
|
||||||
|
|
||||||
let new_id = self.id_gen.next();
|
let new_id = self.id_gen.next();
|
||||||
|
|
||||||
|
@ -3304,7 +3322,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
variant_name,
|
variant_name,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = constructor.tipo.clone();
|
let mut replaced_type = constructor.tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::Var {
|
ir_stack[index] = Air::Var {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3324,7 +3342,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
tail,
|
tail,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::List {
|
ir_stack[index] = Air::List {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3341,7 +3359,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
check_last_item,
|
check_last_item,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::ListAccessor {
|
ir_stack[index] = Air::ListAccessor {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3358,7 +3376,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
tail,
|
tail,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::ListExpose {
|
ir_stack[index] = Air::ListExpose {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3374,7 +3392,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
count,
|
count,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::Builtin {
|
ir_stack[index] = Air::Builtin {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3385,7 +3403,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::BinOp { tipo, scope, name } => {
|
Air::BinOp { tipo, scope, name } => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::BinOp {
|
ir_stack[index] = Air::BinOp {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3399,7 +3417,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
subject_name,
|
subject_name,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::When {
|
ir_stack[index] = Air::When {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3414,7 +3432,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
complex_clause,
|
complex_clause,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::Clause {
|
ir_stack[index] = Air::Clause {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3431,7 +3449,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
complex_clause,
|
complex_clause,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::ListClause {
|
ir_stack[index] = Air::ListClause {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3451,7 +3469,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
complex_clause,
|
complex_clause,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::TupleClause {
|
ir_stack[index] = Air::TupleClause {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3469,7 +3487,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
subject_name,
|
subject_name,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::ClauseGuard {
|
ir_stack[index] = Air::ClauseGuard {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3485,7 +3503,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
inverse,
|
inverse,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::ListClauseGuard {
|
ir_stack[index] = Air::ListClauseGuard {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3497,7 +3515,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::Tuple { tipo, scope, count } => {
|
Air::Tuple { tipo, scope, count } => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::Tuple {
|
ir_stack[index] = Air::Tuple {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3511,7 +3529,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
tuple_index,
|
tuple_index,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::TupleIndex {
|
ir_stack[index] = Air::TupleIndex {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3521,7 +3539,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::ErrorTerm { tipo, scope } => {
|
Air::ErrorTerm { tipo, scope } => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::ErrorTerm {
|
ir_stack[index] = Air::ErrorTerm {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3530,7 +3548,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::Trace { tipo, scope } => {
|
Air::Trace { tipo, scope } => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::Trace {
|
ir_stack[index] = Air::Trace {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3544,7 +3562,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
check_last_item,
|
check_last_item,
|
||||||
} => {
|
} => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::TupleAccessor {
|
ir_stack[index] = Air::TupleAccessor {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3562,7 +3580,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut new_indices = vec![];
|
let mut new_indices = vec![];
|
||||||
for (ind, tipo) in indices {
|
for (ind, tipo) in indices {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
new_indices.push((ind, replaced_type));
|
new_indices.push((ind, replaced_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3583,7 +3601,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
indices_to_remove.push(index);
|
indices_to_remove.push(index);
|
||||||
} else {
|
} else {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::Record {
|
ir_stack[index] = Air::Record {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3605,10 +3623,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
indices_to_remove.push(index);
|
indices_to_remove.push(index);
|
||||||
} else {
|
} else {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
&mut replaced_type,
|
|
||||||
self.data_types.clone(),
|
|
||||||
);
|
|
||||||
|
|
||||||
ir_stack[index] = Air::RecordAccess {
|
ir_stack[index] = Air::RecordAccess {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3618,7 +3633,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::RecordAccess {
|
ir_stack[index] = Air::RecordAccess {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3644,10 +3659,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut new_indices = vec![];
|
let mut new_indices = vec![];
|
||||||
for (ind, name, tipo) in indices {
|
for (ind, name, tipo) in indices {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
&mut replaced_type,
|
|
||||||
self.data_types.clone(),
|
|
||||||
);
|
|
||||||
new_indices.push((ind, name, replaced_type));
|
new_indices.push((ind, name, replaced_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3661,10 +3673,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut new_indices = vec![];
|
let mut new_indices = vec![];
|
||||||
for (ind, name, tipo) in indices {
|
for (ind, name, tipo) in indices {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
&mut replaced_type,
|
|
||||||
self.data_types.clone(),
|
|
||||||
);
|
|
||||||
new_indices.push((ind, name, replaced_type));
|
new_indices.push((ind, name, replaced_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3677,7 +3686,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::Call { scope, count, tipo } => {
|
Air::Call { scope, count, tipo } => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::Call {
|
ir_stack[index] = Air::Call {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3687,7 +3696,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::If { scope, tipo } => {
|
Air::If { scope, tipo } => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::If {
|
ir_stack[index] = Air::If {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3696,7 +3705,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::UnWrapData { scope, tipo } => {
|
Air::UnWrapData { scope, tipo } => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::UnWrapData {
|
ir_stack[index] = Air::UnWrapData {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3705,7 +3714,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
Air::WrapData { scope, tipo } => {
|
Air::WrapData { scope, tipo } => {
|
||||||
let mut replaced_type = tipo.clone();
|
let mut replaced_type = tipo.clone();
|
||||||
builder::replace_opaque_type(&mut replaced_type, self.data_types.clone());
|
builder::replace_opaque_type(&mut replaced_type, &self.data_types);
|
||||||
|
|
||||||
ir_stack[index] = Air::WrapData {
|
ir_stack[index] = Air::WrapData {
|
||||||
scope,
|
scope,
|
||||||
|
@ -3792,7 +3801,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
arg_stack.push(Term::Constant(UplcConstant::Unit.into()));
|
arg_stack.push(Term::Constant(UplcConstant::Unit.into()));
|
||||||
} else {
|
} else {
|
||||||
let data_type = builder::lookup_data_type_by_tipo(
|
let data_type = builder::lookup_data_type_by_tipo(
|
||||||
self.data_types.clone(),
|
&self.data_types,
|
||||||
&constructor.tipo,
|
&constructor.tipo,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -4997,7 +5006,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
let mut actual_type = arg.tipo.clone();
|
let mut actual_type = arg.tipo.clone();
|
||||||
|
|
||||||
replace_opaque_type(&mut actual_type, self.data_types.clone());
|
replace_opaque_type(&mut actual_type, &self.data_types);
|
||||||
|
|
||||||
self.assignment(
|
self.assignment(
|
||||||
&Pattern::Var {
|
&Pattern::Var {
|
||||||
|
|
|
@ -1588,7 +1588,7 @@ pub fn handle_recursion_ir(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lookup_data_type_by_tipo(
|
pub fn lookup_data_type_by_tipo(
|
||||||
data_types: IndexMap<DataTypeKey, &TypedDataType>,
|
data_types: &IndexMap<DataTypeKey, &TypedDataType>,
|
||||||
tipo: &Type,
|
tipo: &Type,
|
||||||
) -> Option<DataType<Arc<Type>>> {
|
) -> Option<DataType<Arc<Type>>> {
|
||||||
match tipo {
|
match tipo {
|
||||||
|
@ -1625,7 +1625,7 @@ pub fn check_replaceable_opaque_type(
|
||||||
t: &Arc<Type>,
|
t: &Arc<Type>,
|
||||||
data_types: &IndexMap<DataTypeKey, &TypedDataType>,
|
data_types: &IndexMap<DataTypeKey, &TypedDataType>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let data_type = lookup_data_type_by_tipo(data_types.clone(), t);
|
let data_type = lookup_data_type_by_tipo(data_types, t);
|
||||||
|
|
||||||
if let Some(data_type) = data_type {
|
if let Some(data_type) = data_type {
|
||||||
let data_type_args = data_type.constructors[0].arguments.clone();
|
let data_type_args = data_type.constructors[0].arguments.clone();
|
||||||
|
@ -1635,9 +1635,9 @@ pub fn check_replaceable_opaque_type(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn replace_opaque_type(t: &mut Arc<Type>, data_types: IndexMap<DataTypeKey, &TypedDataType>) {
|
pub fn replace_opaque_type(t: &mut Arc<Type>, data_types: &IndexMap<DataTypeKey, &TypedDataType>) {
|
||||||
if check_replaceable_opaque_type(t, &data_types) && matches!(&**t, Type::App { .. }) {
|
if check_replaceable_opaque_type(t, data_types) && matches!(&**t, Type::App { .. }) {
|
||||||
let data_type = lookup_data_type_by_tipo(data_types.clone(), t).unwrap();
|
let data_type = lookup_data_type_by_tipo(data_types, t).unwrap();
|
||||||
let new_type_fields = data_type.typed_parameters.clone();
|
let new_type_fields = data_type.typed_parameters.clone();
|
||||||
|
|
||||||
let mut mono_types: IndexMap<u64, Arc<Type>> = IndexMap::new();
|
let mut mono_types: IndexMap<u64, Arc<Type>> = IndexMap::new();
|
||||||
|
@ -1652,7 +1652,7 @@ pub fn replace_opaque_type(t: &mut Arc<Type>, data_types: IndexMap<DataTypeKey,
|
||||||
|
|
||||||
find_and_replace_generics(&mut generic_type, &mono_types);
|
find_and_replace_generics(&mut generic_type, &mono_types);
|
||||||
|
|
||||||
replace_opaque_type(&mut generic_type, data_types.clone());
|
replace_opaque_type(&mut generic_type, data_types);
|
||||||
*t = generic_type;
|
*t = generic_type;
|
||||||
} else {
|
} else {
|
||||||
match (**t).clone() {
|
match (**t).clone() {
|
||||||
|
@ -1665,7 +1665,7 @@ pub fn replace_opaque_type(t: &mut Arc<Type>, data_types: IndexMap<DataTypeKey,
|
||||||
let mut new_args = vec![];
|
let mut new_args = vec![];
|
||||||
for arg in args {
|
for arg in args {
|
||||||
let mut new_arg_type = arg.clone();
|
let mut new_arg_type = arg.clone();
|
||||||
replace_opaque_type(&mut new_arg_type, data_types.clone());
|
replace_opaque_type(&mut new_arg_type, data_types);
|
||||||
new_args.push(new_arg_type);
|
new_args.push(new_arg_type);
|
||||||
}
|
}
|
||||||
*t = Type::App {
|
*t = Type::App {
|
||||||
|
@ -1680,12 +1680,12 @@ pub fn replace_opaque_type(t: &mut Arc<Type>, data_types: IndexMap<DataTypeKey,
|
||||||
let mut new_args = vec![];
|
let mut new_args = vec![];
|
||||||
for arg in args {
|
for arg in args {
|
||||||
let mut new_arg_type = arg.clone();
|
let mut new_arg_type = arg.clone();
|
||||||
replace_opaque_type(&mut new_arg_type, data_types.clone());
|
replace_opaque_type(&mut new_arg_type, data_types);
|
||||||
new_args.push(new_arg_type);
|
new_args.push(new_arg_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut new_ret = ret;
|
let mut new_ret = ret;
|
||||||
replace_opaque_type(&mut new_ret, data_types.clone());
|
replace_opaque_type(&mut new_ret, data_types);
|
||||||
|
|
||||||
*t = Type::Fn {
|
*t = Type::Fn {
|
||||||
args: new_args,
|
args: new_args,
|
||||||
|
@ -1696,7 +1696,7 @@ pub fn replace_opaque_type(t: &mut Arc<Type>, data_types: IndexMap<DataTypeKey,
|
||||||
Type::Var { tipo } => {
|
Type::Var { tipo } => {
|
||||||
if let TypeVar::Link { tipo } = &*tipo.borrow() {
|
if let TypeVar::Link { tipo } = &*tipo.borrow() {
|
||||||
let mut new_type = tipo.clone();
|
let mut new_type = tipo.clone();
|
||||||
replace_opaque_type(&mut new_type, data_types.clone());
|
replace_opaque_type(&mut new_type, data_types);
|
||||||
*t = new_type;
|
*t = new_type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1704,7 +1704,7 @@ pub fn replace_opaque_type(t: &mut Arc<Type>, data_types: IndexMap<DataTypeKey,
|
||||||
let mut new_elems = vec![];
|
let mut new_elems = vec![];
|
||||||
for arg in elems {
|
for arg in elems {
|
||||||
let mut new_arg_type = arg.clone();
|
let mut new_arg_type = arg.clone();
|
||||||
replace_opaque_type(&mut new_arg_type, data_types.clone());
|
replace_opaque_type(&mut new_arg_type, data_types);
|
||||||
new_elems.push(new_arg_type);
|
new_elems.push(new_arg_type);
|
||||||
}
|
}
|
||||||
*t = Type::Tuple { elems: new_elems }.into();
|
*t = Type::Tuple { elems: new_elems }.into();
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
# This file was generated by Aiken
|
||||||
|
# You typically do not need to edit this file
|
||||||
|
|
||||||
|
requirements = []
|
||||||
|
packages = []
|
|
@ -0,0 +1,3 @@
|
||||||
|
name = "aiken-lang/acceptance_test_081"
|
||||||
|
version = "0.0.0"
|
||||||
|
description = ""
|
|
@ -0,0 +1,4 @@
|
||||||
|
pub type Thing {
|
||||||
|
FFF
|
||||||
|
GGG(Int)
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
use other.{FFF, GGG}
|
||||||
|
|
||||||
|
test thing1() {
|
||||||
|
let x =
|
||||||
|
other.FFF
|
||||||
|
|
||||||
|
x == FFF
|
||||||
|
}
|
||||||
|
|
||||||
|
test thing2() {
|
||||||
|
let x =
|
||||||
|
other.GGG(2)
|
||||||
|
|
||||||
|
x == GGG(2)
|
||||||
|
}
|
Loading…
Reference in New Issue