Wrap unification subs in Env

This commit is contained in:
Ayaz Hafiz 2022-07-25 17:36:46 -04:00
parent 0989b2cb82
commit c0e976f544
No known key found for this signature in database
GPG Key ID: 0E2A37416A25EF58
8 changed files with 375 additions and 356 deletions

2
Cargo.lock generated
View File

@ -4124,10 +4124,12 @@ name = "roc_unify"
version = "0.1.0"
dependencies = [
"bitflags",
"roc_can",
"roc_collections",
"roc_debug_flags",
"roc_error_macros",
"roc_module",
"roc_solve_problem",
"roc_types",
]

View File

@ -17,6 +17,7 @@ use roc_types::types::{
RecordField,
};
use roc_unify::unify::unify;
use roc_unify::unify::Env as UEnv;
use roc_unify::unify::Mode;
use roc_unify::unify::Unified::*;
@ -227,7 +228,7 @@ fn solve<'a>(
expectation.get_type_ref(),
);
match unify(subs, actual, expected, Mode::EQ) {
match unify(&mut UEnv::new(subs), actual, expected, Mode::EQ) {
Success {
vars,
must_implement_ability: _,
@ -326,7 +327,7 @@ fn solve<'a>(
expectation.get_type_ref(),
);
match unify(subs, actual, expected, Mode::EQ) {
match unify(&mut UEnv::new(subs), actual, expected, Mode::EQ) {
Success {
vars,
must_implement_ability: _,
@ -403,7 +404,7 @@ fn solve<'a>(
);
// TODO(ayazhafiz): presence constraints for Expr2/Type2
match unify(subs, actual, expected, Mode::EQ) {
match unify(&mut UEnv::new(subs), actual, expected, Mode::EQ) {
Success {
vars,
must_implement_ability: _,
@ -717,7 +718,7 @@ fn solve<'a>(
);
let includes = type_to_var(arena, mempool, subs, rank, pools, cached_aliases, &tag_ty);
match unify(subs, actual, includes, Mode::PRESENT) {
match unify(&mut UEnv::new(subs), actual, includes, Mode::PRESENT) {
Success {
vars,
must_implement_ability: _,

View File

@ -83,9 +83,9 @@ impl Env<'_> {
}
fn unify(&mut self, left: Variable, right: Variable) {
use roc_unify::unify::{unify, Mode, Unified};
use roc_unify::unify::{unify, Env, Mode, Unified};
let unified = unify(self.subs, left, right, Mode::EQ);
let unified = unify(&mut Env::new(self.subs), left, right, Mode::EQ);
match unified {
Unified::Success {
@ -109,12 +109,12 @@ impl Env<'_> {
specialization_type: Variable,
ability_member: Symbol,
) -> SpecializationLambdaSets {
use roc_unify::unify::{unify_introduced_ability_specialization, Mode, Unified};
use roc_unify::unify::{unify_introduced_ability_specialization, Env, Mode, Unified};
let member_signature = self.import_encode_symbol(ability_member);
let unified = unify_introduced_ability_specialization(
self.subs,
&mut Env::new(self.subs),
member_signature,
specialization_type,
Mode::EQ,

View File

@ -13,7 +13,7 @@ use roc_module::symbol::ModuleId;
use roc_solve::solve::{compact_lambda_sets_of_vars, Phase, Pools};
use roc_types::subs::{get_member_lambda_sets_at_region, Content, FlatType, LambdaSet};
use roc_types::subs::{ExposedTypesStorageSubs, Subs, Variable};
use roc_unify::unify::{unify as unify_unify, Mode, Unified};
use roc_unify::unify::{unify as unify_unify, Env, Mode, Unified};
pub use roc_solve::ability::resolve_ability_specialization;
pub use roc_solve::ability::Resolved;
@ -260,7 +260,7 @@ pub fn unify(
ModuleId::DERIVED_SYNTH,
"derived module can only unify its subs in its own context!"
);
let unified = unify_unify(subs, left, right, Mode::EQ);
let unified = unify_unify(&mut Env::new(subs), left, right, Mode::EQ);
match unified {
Unified::Success {

View File

@ -7,7 +7,7 @@ use roc_region::all::{Loc, Region};
use roc_solve_problem::{TypeError, UnderivableReason, Unfulfilled};
use roc_types::subs::{instantiate_rigids, Content, FlatType, GetSubsSlice, Rank, Subs, Variable};
use roc_types::types::{AliasKind, Category, PatternCategory};
use roc_unify::unify::MustImplementConstraints;
use roc_unify::unify::{Env, MustImplementConstraints};
use roc_unify::unify::{MustImplementAbility, Obligated};
use crate::solve::type_to_var;
@ -573,10 +573,15 @@ pub fn resolve_ability_specialization(
let signature_var = member_def.signature_var();
instantiate_rigids(subs, signature_var);
let (_vars, must_implement_ability, _lambda_sets_to_specialize, _meta) =
unify(subs, specialization_var, signature_var, Mode::EQ).expect_success(
"If resolving a specialization, the specialization must be known to typecheck.",
);
let (_vars, must_implement_ability, _lambda_sets_to_specialize, _meta) = unify(
&mut Env::new(subs),
specialization_var,
signature_var,
Mode::EQ,
)
.expect_success(
"If resolving a specialization, the specialization must be known to typecheck.",
);
subs.rollback_to(snapshot);

View File

@ -33,8 +33,8 @@ use roc_types::types::{
OptAbleVar, Reason, TypeExtension, Uls,
};
use roc_unify::unify::{
unify, unify_introduced_ability_specialization, Mode, MustImplementConstraints, Obligated,
SpecializationLsetCollector, Unified::*,
unify, unify_introduced_ability_specialization, Env as UEnv, Mode, MustImplementConstraints,
Obligated, SpecializationLsetCollector, Unified::*,
};
// Type checking system adapted from Elm by Evan Czaplicki, BSD-3-Clause Licensed
@ -963,7 +963,7 @@ fn solve(
let expectation = &constraints.expectations[expectation_index.index()];
let expected = type_to_var(subs, rank, pools, aliases, expectation.get_type_ref());
match unify(subs, actual, expected, Mode::EQ) {
match unify(&mut UEnv::new(subs), actual, expected, Mode::EQ) {
Success {
vars,
must_implement_ability,
@ -1021,7 +1021,7 @@ fn solve(
);
let target = *target;
match unify(subs, actual, target, Mode::EQ) {
match unify(&mut UEnv::new(subs), actual, target, Mode::EQ) {
Success {
vars,
// ERROR NOT REPORTED
@ -1081,7 +1081,7 @@ fn solve(
let expected =
type_to_var(subs, rank, pools, aliases, expectation.get_type_ref());
match unify(subs, actual, expected, Mode::EQ) {
match unify(&mut UEnv::new(subs), actual, expected, Mode::EQ) {
Success {
vars,
must_implement_ability,
@ -1165,7 +1165,7 @@ fn solve(
_ => Mode::EQ,
};
match unify(subs, actual, expected, mode) {
match unify(&mut UEnv::new(subs), actual, expected, mode) {
Success {
vars,
must_implement_ability,
@ -1334,7 +1334,7 @@ fn solve(
);
let includes = type_to_var(subs, rank, pools, aliases, &tag_ty);
match unify(subs, actual, includes, Mode::PRESENT) {
match unify(&mut UEnv::new(subs), actual, includes, Mode::PRESENT) {
Success {
vars,
must_implement_ability,
@ -1442,7 +1442,7 @@ fn solve(
);
let snapshot = subs.snapshot();
let outcome = unify(subs, real_var, branches_var, Mode::EQ);
let outcome = unify(&mut UEnv::new(subs), real_var, branches_var, Mode::EQ);
let should_check_exhaustiveness;
match outcome {
@ -1477,7 +1477,7 @@ fn solve(
// open_tag_union(subs, real_var);
open_tag_union(subs, branches_var);
let almost_eq = matches!(
unify(subs, real_var, branches_var, Mode::EQ),
unify(&mut UEnv::new(subs), real_var, branches_var, Mode::EQ),
Success { .. }
);
@ -1489,7 +1489,7 @@ fn solve(
} else {
// Case 4: incompatible types, report type error.
// Re-run first failed unification to get the type diff.
match unify(subs, real_var, branches_var, Mode::EQ) {
match unify(&mut UEnv::new(subs), real_var, branches_var, Mode::EQ) {
Failure(vars, actual_type, expected_type, _bad_impls) => {
introduce(subs, rank, pools, &vars);
@ -1720,7 +1720,7 @@ fn check_ability_specialization(
deep_copy_var_in(subs, Rank::toplevel(), pools, root_signature_var, arena);
let snapshot = subs.snapshot();
let unified = unify_introduced_ability_specialization(
subs,
&mut UEnv::new(subs),
root_signature_var,
symbol_loc_var.value,
Mode::EQ,
@ -2238,7 +2238,8 @@ fn compact_lambda_set<P: Phase>(
// 3. Unify `t_f1 ~ t_f2`.
trace_compact!(3iter_start. subs, this_lambda_set, t_f1, t_f2);
let (vars, new_must_implement_ability, new_lambda_sets_to_specialize, _meta) =
unify(subs, t_f1, t_f2, Mode::EQ).expect_success("ambient functions don't unify");
unify(&mut UEnv::new(subs), t_f1, t_f2, Mode::EQ)
.expect_success("ambient functions don't unify");
trace_compact!(3iter_end. subs, t_f1);
introduce(subs, target_rank, pools, &vars);

View File

@ -22,3 +22,9 @@ path = "../types"
[dependencies.roc_debug_flags]
path = "../debug_flags"
[dependencies.roc_can]
path = "../can"
[dependencies.roc_solve_problem]
path = "../solve_problem"

File diff suppressed because it is too large Load Diff