Skip to content

Commit

Permalink
fix: found issue with record access on Pairs
Browse files Browse the repository at this point in the history
  • Loading branch information
MicroProofs committed May 3, 2024
1 parent 34f8e62 commit 7c842a2
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 13 deletions.
48 changes: 38 additions & 10 deletions crates/aiken-lang/src/builtins.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ use crate::{
},
expr::TypedExpr,
tipo::{
fields::FieldMap, Type, TypeAliasAnnotation, TypeConstructor, TypeInfo, TypeVar,
ValueConstructor, ValueConstructorVariant,
fields::FieldMap, AccessorsMap, RecordAccessor, Type, TypeAliasAnnotation, TypeConstructor,
TypeInfo, TypeVar, ValueConstructor, ValueConstructorVariant,
},
IdGenerator,
};
Expand Down Expand Up @@ -347,7 +347,7 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo {
ValueConstructor::public(
function(
vec![fst_parameter.clone(), snd_parameter.clone()],
pair(fst_parameter, snd_parameter),
pair(fst_parameter.clone(), snd_parameter.clone()),
),
ValueConstructorVariant::Record {
module: "".into(),
Expand All @@ -364,6 +364,34 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo {
),
);

let mut accessors = HashMap::new();
accessors.insert(
"fst".to_string(),
RecordAccessor {
index: 0,
label: "fst".to_string(),
tipo: fst_parameter.clone(),
},
);

accessors.insert(
"snd".to_string(),
RecordAccessor {
index: 1,
label: "snd".to_string(),
tipo: snd_parameter.clone(),
},
);

prelude.accessors.insert(
PAIR.to_string(),
AccessorsMap {
public: true,
tipo: pair(fst_parameter.clone(), snd_parameter.clone()),
accessors,
},
);

// String
prelude.types.insert(
STRING.to_string(),
Expand Down Expand Up @@ -702,7 +730,7 @@ pub fn from_default_function(builtin: DefaultFunction, id_gen: &IdGenerator) ->
(tipo, 2)
}
DefaultFunction::MapData => {
let tipo = function(vec![list(tuple(vec![data(), data()]))], data());
let tipo = function(vec![list(pair(data(), data()))], data());

(tipo, 1)
}
Expand All @@ -722,12 +750,12 @@ pub fn from_default_function(builtin: DefaultFunction, id_gen: &IdGenerator) ->
(tipo, 1)
}
DefaultFunction::UnConstrData => {
let tipo = function(vec![data()], tuple(vec![int(), list(data())]));
let tipo = function(vec![data()], pair(int(), list(data())));

(tipo, 1)
}
DefaultFunction::UnMapData => {
let tipo = function(vec![data()], list(tuple(vec![data(), data()])));
let tipo = function(vec![data()], list(pair(data(), data())));

(tipo, 1)
}
Expand Down Expand Up @@ -772,15 +800,15 @@ pub fn from_default_function(builtin: DefaultFunction, id_gen: &IdGenerator) ->
(tipo, 6)
}
DefaultFunction::MkPairData => {
let tipo = function(vec![data(), data()], tuple(vec![data(), data()]));
let tipo = function(vec![data(), data()], pair(data(), data()));
(tipo, 2)
}
DefaultFunction::MkNilData => {
let tipo = function(vec![], list(data()));
(tipo, 0)
}
DefaultFunction::MkNilPairData => {
let tipo = function(vec![], list(tuple(vec![data(), data()])));
let tipo = function(vec![], list(pair(data(), data())));
(tipo, 0)
}
DefaultFunction::ChooseUnit => {
Expand All @@ -796,13 +824,13 @@ pub fn from_default_function(builtin: DefaultFunction, id_gen: &IdGenerator) ->
DefaultFunction::FstPair => {
let a = generic_var(id_gen.next());
let b = generic_var(id_gen.next());
let tipo = function(vec![tuple(vec![a.clone(), b])], a);
let tipo = function(vec![pair(a.clone(), b)], a);
(tipo, 1)
}
DefaultFunction::SndPair => {
let a = generic_var(id_gen.next());
let b = generic_var(id_gen.next());
let tipo = function(vec![tuple(vec![a, b.clone()])], b);
let tipo = function(vec![pair(a, b.clone())], b);
(tipo, 1)
}
DefaultFunction::ChooseList => {
Expand Down
6 changes: 5 additions & 1 deletion crates/aiken-lang/src/tipo/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -837,7 +837,11 @@ impl<'a, 'b> ExprTyper<'a, 'b> {
.get(module)
.and_then(|module| module.accessors.get(name)),

_something_without_fields => return Err(unknown_field(vec![])),
Type::Pair { .. } => self.environment.accessors.get("Pair"),

_something_without_fields => {
return Err(unknown_field(vec![]));
}
}
.ok_or_else(|| unknown_field(vec![]))?;

Expand Down
4 changes: 2 additions & 2 deletions examples/acceptance_tests/064/lib/tests.ak
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ type Foo {
}

fn get_constr(data: Data) -> Int {
builtin.un_constr_data(data).1st
builtin.un_constr_data(data).fst
}

test foo() {
Expand All @@ -23,7 +23,7 @@ fn map(list: List<a>, f: fn(a) -> b) -> List<b> {
}

fn get_fields(data: Data) -> List<Int> {
builtin.un_constr_data(data).2nd
builtin.un_constr_data(data).snd
|> map(builtin.un_i_data)
}

Expand Down

0 comments on commit 7c842a2

Please sign in to comment.