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:
microproofs 2023-05-14 18:22:07 -04:00 committed by Kasey
parent 3356e2ecd0
commit 4838ebd39e
6 changed files with 106 additions and 70 deletions

View File

@ -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 {

View File

@ -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();

View File

@ -0,0 +1,5 @@
# This file was generated by Aiken
# You typically do not need to edit this file
requirements = []
packages = []

View File

@ -0,0 +1,3 @@
name = "aiken-lang/acceptance_test_081"
version = "0.0.0"
description = ""

View File

@ -0,0 +1,4 @@
pub type Thing {
FFF
GGG(Int)
}

View File

@ -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)
}