fix: `expect _ = ...` not including the cast from data logic if the type is data and right hand has a type annotation

This commit is contained in:
microproofs 2023-06-23 18:39:12 -04:00
parent 226556bdd6
commit 8b3504e9a1
7 changed files with 106 additions and 5 deletions

View File

@ -15,6 +15,7 @@
### Fixed ### Fixed
- **aiken-lang**: Fix expect _ = ... not including the cast from data logic if the type is data and right hand has a type annotation
- **aiken-lang**: Fix for the final clause of a when expecting another clause - **aiken-lang**: Fix for the final clause of a when expecting another clause
afterwards in nested list cases. afterwards in nested list cases.
- **aiken-lang**: Fix for all elements were being destructured in tuple clauses - **aiken-lang**: Fix for all elements were being destructured in tuple clauses
@ -22,7 +23,8 @@
- **aiken-lang**: Fix for tuple clause not consuming the next case causing - **aiken-lang**: Fix for tuple clause not consuming the next case causing
incomplete contracts. Now tuple clause will always consume the next case incomplete contracts. Now tuple clause will always consume the next case
unless it is the final clause unless it is the final clause
- **aiken-lang**: Fix for builtins using the incorrect data to type conversion when used as a function param. - **aiken-lang**: Fix for builtins using the incorrect data to type conversion
when used as a function param.
## v1.0.10-alpha - 2023-06-13 ## v1.0.10-alpha - 2023-06-13

View File

@ -1701,7 +1701,7 @@ impl<'a> CodeGenerator<'a> {
) { ) {
let mut value_stack = if assignment_properties.value_type.is_data() let mut value_stack = if assignment_properties.value_type.is_data()
&& !tipo.is_data() && !tipo.is_data()
&& !pattern.is_discard() && matches!(assignment_properties.kind, AssignmentKind::Expect)
{ {
let mut wrap_stack = pattern_stack.empty_with_scope(); let mut wrap_stack = pattern_stack.empty_with_scope();
wrap_stack.un_wrap_data(tipo.clone().into()); wrap_stack.un_wrap_data(tipo.clone().into());
@ -1765,7 +1765,17 @@ impl<'a> CodeGenerator<'a> {
); );
} }
Pattern::Discard { .. } => { Pattern::Discard { .. } => {
if matches!(assignment_properties.kind, AssignmentKind::Let) {
pattern_stack.let_assignment("_", value_stack); pattern_stack.let_assignment("_", value_stack);
} else {
self.expect_pattern(
pattern,
pattern_stack,
value_stack,
tipo,
assignment_properties,
)
}
} }
list @ Pattern::List { .. } => { list @ Pattern::List { .. } => {
if matches!(assignment_properties.kind, AssignmentKind::Expect) if matches!(assignment_properties.kind, AssignmentKind::Expect)
@ -2097,7 +2107,12 @@ impl<'a> CodeGenerator<'a> {
self.expect_type(tipo, expect_stack, name, &mut IndexMap::new()); self.expect_type(tipo, expect_stack, name, &mut IndexMap::new());
} }
Pattern::Assign { .. } => todo!("Expect Assign not supported yet"), Pattern::Assign { .. } => todo!("Expect Assign not supported yet"),
Pattern::Discard { .. } => unreachable!(), Pattern::Discard { .. } => {
let name = "__expect_discard";
expect_stack.let_assignment(name, value_stack);
self.expect_type(tipo, expect_stack, name, &mut IndexMap::new());
}
Pattern::List { elements, tail, .. } => { Pattern::List { elements, tail, .. } => {
let inner_list_type = &tipo.get_inner_types()[0]; let inner_list_type = &tipo.get_inner_types()[0];
let mut names = vec![]; let mut names = vec![];

View File

@ -1,4 +1,4 @@
name = "aiken-lang/acceptance_test_083" name = "aiken-lang/acceptance_test_084"
version = "0.0.0" version = "0.0.0"
description = "" description = ""

View File

@ -0,0 +1,13 @@
# This file was generated by Aiken
# You typically do not need to edit this file
[[requirements]]
name = "aiken-lang/stdlib"
version = "main"
source = "github"
[[packages]]
name = "aiken-lang/stdlib"
version = "main"
requirements = []
source = "github"

View File

@ -0,0 +1,8 @@
name = "aiken-lang/acceptance_test_085"
version = "0.0.0"
description = ""
[[dependencies]]
name = 'aiken-lang/stdlib'
version = 'main'
source = 'github'

View File

@ -0,0 +1,19 @@
pub type AssetClass {
policy: ByteArray,
name: ByteArray,
}
pub type DatumOrc {
oracle_parameters: OracleParametersd,
token_a_amount: Int,
token_b_amount: Int,
expiration_time: Int,
maturity_time: Int,
}
pub type OracleParametersd {
pool_nft_cs: AssetClass,
oracle_nft_cs: AssetClass,
token_a_cs: AssetClass,
token_b_cs: AssetClass,
}

View File

@ -0,0 +1,44 @@
use other
pub type AssetClass {
policy: ByteArray,
name: ByteArray,
}
pub type DatumOrc1 {
oracle_parameters: OracleParametersd,
token_a_amount: Int,
token_b_amount: Int,
expiration_time: Int,
maturity_time: Int,
}
pub type OracleParametersd {
pool_nft_cs: AssetClass,
oracle_nft_cs: AssetClass,
token_a_cs: AssetClass,
token_b_cs: AssetClass,
}
test oracle1() {
let x: Data =
DatumOrc1 {
oracle_parameters: OracleParametersd {
pool_nft_cs: AssetClass { policy: #"", name: #"" },
oracle_nft_cs: AssetClass { policy: #"", name: #"" },
token_a_cs: AssetClass { policy: #"", name: #"" },
token_b_cs: AssetClass { policy: #"", name: #"" },
},
token_a_amount: 0,
token_b_amount: 0,
expiration_time: 0,
maturity_time: 0,
}
let y: Data = x
expect _: other.DatumOrc = y
// od == od
True
}