thread through Aliases

This commit is contained in:
Folkert 2022-03-14 21:20:35 +01:00
parent 0c5e4df215
commit 9059e09dca
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C

View file

@ -76,6 +76,32 @@ pub enum TypeError {
UnexposedLookup(Symbol), UnexposedLookup(Symbol),
} }
use roc_types::types::Alias;
#[derive(Debug, Default)]
pub struct Aliases {
aliases: MutMap<Symbol, Alias>,
}
impl Aliases {
fn instantiate_alias(
&self,
subs: &mut Subs,
rank: Rank,
pools: &mut Pools,
arena: &bumpalo::Bump,
symbol: Symbol,
alias_variables: AliasVariables,
) -> Result<Variable, ()> {
match self.aliases.get(&symbol) {
None => Err(()),
Some(alias) => {
todo!()
}
}
}
}
#[derive(Clone, Debug, Default)] #[derive(Clone, Debug, Default)]
pub struct Env { pub struct Env {
symbols: Vec<Symbol>, symbols: Vec<Symbol>,
@ -206,7 +232,7 @@ pub fn run_in_place(
rank, rank,
&mut pools, &mut pools,
problems, problems,
&mut MutMap::default(), &mut Aliases::default(),
subs, subs,
constraint, constraint,
); );
@ -259,7 +285,7 @@ fn solve(
rank: Rank, rank: Rank,
pools: &mut Pools, pools: &mut Pools,
problems: &mut Vec<TypeError>, problems: &mut Vec<TypeError>,
cached_aliases: &mut MutMap<Symbol, Variable>, aliases: &mut Aliases,
subs: &mut Subs, subs: &mut Subs,
constraint: &Constraint, constraint: &Constraint,
) -> State { ) -> State {
@ -305,7 +331,7 @@ fn solve(
constraints, constraints,
rank, rank,
pools, pools,
cached_aliases, aliases,
subs, subs,
let_con.def_types, let_con.def_types,
); );
@ -350,7 +376,7 @@ fn solve(
constraints, constraints,
next_rank, next_rank,
pools, pools,
cached_aliases, aliases,
subs, subs,
let_con.def_types, let_con.def_types,
); );
@ -443,23 +469,11 @@ fn solve(
Eq(type_index, expectation_index, category_index, region) => { Eq(type_index, expectation_index, category_index, region) => {
let category = &constraints.categories[category_index.index()]; let category = &constraints.categories[category_index.index()];
let actual = either_type_index_to_var( let actual =
constraints, either_type_index_to_var(constraints, subs, rank, pools, aliases, *type_index);
subs,
rank,
pools,
cached_aliases,
*type_index,
);
let expectation = &constraints.expectations[expectation_index.index()]; let expectation = &constraints.expectations[expectation_index.index()];
let expected = type_to_var( let expected = type_to_var(subs, rank, pools, aliases, expectation.get_type_ref());
subs,
rank,
pools,
cached_aliases,
expectation.get_type_ref(),
);
match unify(subs, actual, expected, Mode::EQ) { match unify(subs, actual, expected, Mode::EQ) {
Success(vars) => { Success(vars) => {
@ -498,7 +512,7 @@ fn solve(
subs, subs,
rank, rank,
pools, pools,
cached_aliases, aliases,
*source_index, *source_index,
); );
let target = *target; let target = *target;
@ -552,13 +566,8 @@ fn solve(
let actual = deep_copy_var_in(subs, rank, pools, var, arena); let actual = deep_copy_var_in(subs, rank, pools, var, arena);
let expectation = &constraints.expectations[expectation_index.index()]; let expectation = &constraints.expectations[expectation_index.index()];
let expected = type_to_var( let expected =
subs, type_to_var(subs, rank, pools, aliases, expectation.get_type_ref());
rank,
pools,
cached_aliases,
expectation.get_type_ref(),
);
match unify(subs, actual, expected, Mode::EQ) { match unify(subs, actual, expected, Mode::EQ) {
Success(vars) => { Success(vars) => {
@ -613,23 +622,11 @@ fn solve(
| PatternPresence(type_index, expectation_index, category_index, region) => { | PatternPresence(type_index, expectation_index, category_index, region) => {
let category = &constraints.pattern_categories[category_index.index()]; let category = &constraints.pattern_categories[category_index.index()];
let actual = either_type_index_to_var( let actual =
constraints, either_type_index_to_var(constraints, subs, rank, pools, aliases, *type_index);
subs,
rank,
pools,
cached_aliases,
*type_index,
);
let expectation = &constraints.pattern_expectations[expectation_index.index()]; let expectation = &constraints.pattern_expectations[expectation_index.index()];
let expected = type_to_var( let expected = type_to_var(subs, rank, pools, aliases, expectation.get_type_ref());
subs,
rank,
pools,
cached_aliases,
expectation.get_type_ref(),
);
let mode = match constraint { let mode = match constraint {
PatternPresence(..) => Mode::PRESENT, PatternPresence(..) => Mode::PRESENT,
@ -760,14 +757,8 @@ fn solve(
} }
} }
IsOpenType(type_index) => { IsOpenType(type_index) => {
let actual = either_type_index_to_var( let actual =
constraints, either_type_index_to_var(constraints, subs, rank, pools, aliases, *type_index);
subs,
rank,
pools,
cached_aliases,
*type_index,
);
let mut new_desc = subs.get(actual); let mut new_desc = subs.get(actual);
match new_desc.content { match new_desc.content {
@ -804,12 +795,12 @@ fn solve(
let tys = &constraints.types[types.indices()]; let tys = &constraints.types[types.indices()];
let pattern_category = &constraints.pattern_categories[pattern_category.index()]; let pattern_category = &constraints.pattern_categories[pattern_category.index()];
let actual = type_to_var(subs, rank, pools, cached_aliases, typ); let actual = type_to_var(subs, rank, pools, aliases, typ);
let tag_ty = Type::TagUnion( let tag_ty = Type::TagUnion(
vec![(tag_name.clone(), tys.to_vec())], vec![(tag_name.clone(), tys.to_vec())],
Box::new(Type::EmptyTagUnion), Box::new(Type::EmptyTagUnion),
); );
let includes = type_to_var(subs, rank, pools, cached_aliases, &tag_ty); let includes = type_to_var(subs, rank, pools, aliases, &tag_ty);
match unify(subs, actual, includes, Mode::PRESENT) { match unify(subs, actual, includes, Mode::PRESENT) {
Success(vars) => { Success(vars) => {
@ -881,7 +872,7 @@ impl LocalDefVarsVec<(Symbol, Loc<Variable>)> {
constraints: &Constraints, constraints: &Constraints,
rank: Rank, rank: Rank,
pools: &mut Pools, pools: &mut Pools,
cached_aliases: &mut MutMap<Symbol, Variable>, aliases: &mut Aliases,
subs: &mut Subs, subs: &mut Subs,
def_types_slice: roc_can::constraint::DefTypes, def_types_slice: roc_can::constraint::DefTypes,
) -> Self { ) -> Self {
@ -891,7 +882,7 @@ impl LocalDefVarsVec<(Symbol, Loc<Variable>)> {
let mut local_def_vars = Self::with_length(types_slice.len()); let mut local_def_vars = Self::with_length(types_slice.len());
for ((symbol, region), typ) in loc_symbols_slice.iter().copied().zip(types_slice) { for ((symbol, region), typ) in loc_symbols_slice.iter().copied().zip(types_slice) {
let var = type_to_var(subs, rank, pools, cached_aliases, typ); let var = type_to_var(subs, rank, pools, aliases, typ);
local_def_vars.push((symbol, Loc { value: var, region })); local_def_vars.push((symbol, Loc { value: var, region }));
} }
@ -921,14 +912,14 @@ fn either_type_index_to_var(
subs: &mut Subs, subs: &mut Subs,
rank: Rank, rank: Rank,
pools: &mut Pools, pools: &mut Pools,
_alias_map: &mut MutMap<Symbol, Variable>, aliases: &mut Aliases,
either_type_index: roc_collections::soa::EitherIndex<Type, Variable>, either_type_index: roc_collections::soa::EitherIndex<Type, Variable>,
) -> Variable { ) -> Variable {
match either_type_index.split() { match either_type_index.split() {
Ok(type_index) => { Ok(type_index) => {
let typ = &constraints.types[type_index.index()]; let typ = &constraints.types[type_index.index()];
type_to_var(subs, rank, pools, _alias_map, typ) type_to_var(subs, rank, pools, aliases, typ)
} }
Err(var_index) => { Err(var_index) => {
// we cheat, and store the variable directly in the index // we cheat, and store the variable directly in the index
@ -941,7 +932,7 @@ fn type_to_var(
subs: &mut Subs, subs: &mut Subs,
rank: Rank, rank: Rank,
pools: &mut Pools, pools: &mut Pools,
_: &mut MutMap<Symbol, Variable>, aliases: &Aliases,
typ: &Type, typ: &Type,
) -> Variable { ) -> Variable {
if let Type::Variable(var) = typ { if let Type::Variable(var) = typ {
@ -950,7 +941,7 @@ fn type_to_var(
let mut arena = take_scratchpad(); let mut arena = take_scratchpad();
// let var = type_to_variable(subs, rank, pools, &arena, typ); // let var = type_to_variable(subs, rank, pools, &arena, typ);
let var = type_to_variable(subs, rank, pools, &arena, typ); let var = type_to_variable(subs, rank, pools, &arena, aliases, typ);
arena.reset(); arena.reset();
put_scratchpad(arena); put_scratchpad(arena);
@ -1029,6 +1020,7 @@ fn type_to_variable<'a>(
rank: Rank, rank: Rank,
pools: &mut Pools, pools: &mut Pools,
arena: &'a bumpalo::Bump, arena: &'a bumpalo::Bump,
aliases: &Aliases,
typ: &Type, typ: &Type,
) -> Variable { ) -> Variable {
use bumpalo::collections::Vec; use bumpalo::collections::Vec;
@ -1233,8 +1225,13 @@ fn type_to_variable<'a>(
} }
}; };
// TODO let instantiated =
let alias_variable = subs.fresh_unnamed_flex_var(); aliases.instantiate_alias(subs, rank, pools, arena, *symbol, alias_variables);
let alias_variable = match instantiated {
Err(_) => panic!("Alias {:?} is not available", symbol),
Ok(alias_variable) => alias_variable,
};
let content = Content::Alias(*symbol, alias_variables, alias_variable, kind); let content = Content::Alias(*symbol, alias_variables, alias_variable, kind);
@ -1311,7 +1308,8 @@ fn type_to_variable<'a>(
}; };
// cannot use helper! here because this variable may be involved in unification below // cannot use helper! here because this variable may be involved in unification below
let alias_variable = type_to_variable(subs, rank, pools, arena, alias_type); let alias_variable =
type_to_variable(subs, rank, pools, arena, aliases, alias_type);
// TODO(opaques): I think host-exposed aliases should always be structural // TODO(opaques): I think host-exposed aliases should always be structural
// (when does it make sense to give a host an opaque type?) // (when does it make sense to give a host an opaque type?)
let content = Content::Alias( let content = Content::Alias(