Validate derives clauses after solving

This commit is contained in:
Ayaz Hafiz 2022-05-20 15:53:47 -04:00
parent 4cf87510c8
commit a4c122d5db
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
11 changed files with 440 additions and 113 deletions

View file

@ -9,6 +9,7 @@ use roc_builtins::std::borrow_stdlib;
use roc_can::abilities::{AbilitiesStore, SolvedSpecializations};
use roc_can::constraint::{Constraint as ConstraintSoa, Constraints};
use roc_can::def::Declaration;
use roc_can::expr::PendingDerives;
use roc_can::module::{canonicalize_module_defs, Module};
use roc_collections::{default_hasher, BumpMap, MutMap, MutSet, VecMap, VecSet};
use roc_constrain::module::{
@ -366,6 +367,7 @@ fn start_phase<'a>(
imported_modules,
declarations,
dep_idents,
pending_derives,
..
} = constrained;
@ -375,6 +377,7 @@ fn start_phase<'a>(
module_timing,
constraints,
constraint,
pending_derives,
var_store,
imported_modules,
&state.exposed_types,
@ -536,6 +539,9 @@ struct ConstrainedModule {
var_store: VarStore,
dep_idents: IdentIdsByModule,
module_timing: ModuleTiming,
// Rather than adding pending derives as constraints, hand them directly to solve because they
// must be solved at the end of a module.
pending_derives: PendingDerives,
}
#[derive(Debug)]
@ -885,6 +891,7 @@ enum BuildTask<'a> {
module_timing: ModuleTiming,
constraints: Constraints,
constraint: ConstraintSoa,
pending_derives: PendingDerives,
var_store: VarStore,
declarations: Vec<Declaration>,
dep_idents: IdentIdsByModule,
@ -3500,6 +3507,7 @@ impl<'a> BuildTask<'a> {
module_timing: ModuleTiming,
constraints: Constraints,
constraint: ConstraintSoa,
pending_derives: PendingDerives,
var_store: VarStore,
imported_modules: MutMap<ModuleId, Region>,
exposed_types: &ExposedByModule,
@ -3542,6 +3550,7 @@ impl<'a> BuildTask<'a> {
exposed_for_module,
constraints,
constraint,
pending_derives,
var_store,
declarations,
dep_idents,
@ -3616,6 +3625,7 @@ fn run_solve_solve(
exposed_for_module: ExposedForModule,
mut constraints: Constraints,
constraint: ConstraintSoa,
pending_derives: PendingDerives,
mut var_store: VarStore,
module: Module,
) -> (
@ -3663,6 +3673,7 @@ fn run_solve_solve(
subs,
solve_aliases,
abilities_store,
pending_derives,
);
let module_id = module.module_id;
@ -3713,6 +3724,7 @@ fn run_solve<'a>(
exposed_for_module: ExposedForModule,
constraints: Constraints,
constraint: ConstraintSoa,
pending_derives: PendingDerives,
var_store: VarStore,
decls: Vec<Declaration>,
dep_idents: IdentIdsByModule,
@ -3733,6 +3745,7 @@ fn run_solve<'a>(
exposed_for_module,
constraints,
constraint,
pending_derives,
var_store,
module,
),
@ -3754,6 +3767,7 @@ fn run_solve<'a>(
exposed_for_module,
constraints,
constraint,
pending_derives,
var_store,
module,
)
@ -3987,6 +4001,7 @@ fn canonicalize_and_constrain<'a>(
ident_ids: module_output.scope.locals.ident_ids,
dep_idents,
module_timing,
pending_derives: module_output.pending_derives,
};
CanAndCon {
@ -4476,6 +4491,7 @@ fn run_task<'a>(
exposed_for_module,
constraints,
constraint,
pending_derives,
var_store,
ident_ids,
declarations,
@ -4489,6 +4505,7 @@ fn run_task<'a>(
exposed_for_module,
constraints,
constraint,
pending_derives,
var_store,
declarations,
dep_idents,