mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 03:42:17 +00:00
Obligation checking layers on extra abilities bound to a variable
This commit is contained in:
parent
db7fe48d1c
commit
9c88534758
2 changed files with 14 additions and 21 deletions
|
@ -494,19 +494,6 @@ trait DerivableVisitor {
|
|||
false
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn visit_flex_able(var: Variable, abilities: &[Symbol]) -> Result<(), NotDerivable> {
|
||||
// TODO(multi-abilities) flex-able can inherit other abilities
|
||||
if abilities != [Self::ABILITY] {
|
||||
Err(NotDerivable {
|
||||
var,
|
||||
context: NotDerivableContext::NoContext,
|
||||
})
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn visit_rigid_able(var: Variable, abilities: &[Symbol]) -> Result<(), NotDerivable> {
|
||||
if abilities != [Self::ABILITY] {
|
||||
|
@ -647,8 +634,14 @@ trait DerivableVisitor {
|
|||
context: NotDerivableContext::NoContext,
|
||||
})
|
||||
}
|
||||
FlexAbleVar(_, abilities) => {
|
||||
Self::visit_flex_able(var, subs.get_subs_slice(abilities))?
|
||||
FlexAbleVar(opt_name, abilities) => {
|
||||
// This flex var inherits the ability.
|
||||
let merged_abilites = roc_unify::unify::merged_ability_slices(
|
||||
subs,
|
||||
abilities,
|
||||
Self::ABILITY_SLICE,
|
||||
);
|
||||
subs.set_content(var, Content::FlexAbleVar(opt_name, merged_abilites));
|
||||
}
|
||||
RigidAbleVar(_, abilities) => {
|
||||
Self::visit_rigid_able(var, subs.get_subs_slice(abilities))?
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue