diff --git a/compiler/can/src/module.rs b/compiler/can/src/module.rs index 50053a823a..fad4785f56 100644 --- a/compiler/can/src/module.rs +++ b/compiler/can/src/module.rs @@ -26,13 +26,19 @@ pub struct Module { pub referenced_values: MutSet, pub referenced_types: MutSet, pub aliases: MutMap, - pub rigid_variables: MutMap, + pub rigid_variables: RigidVariables, +} + +#[derive(Debug, Default)] +pub struct RigidVariables { + pub named: MutMap, + pub wildcards: MutSet, } #[derive(Debug)] pub struct ModuleOutput { pub aliases: MutMap, - pub rigid_variables: MutMap, + pub rigid_variables: RigidVariables, pub declarations: Vec, pub exposed_imports: MutMap, pub lookups: Vec<(Symbol, Variable, Region)>, @@ -169,7 +175,7 @@ pub fn canonicalize_module_defs<'a>( } let mut lookups = Vec::with_capacity(num_deps); - let mut rigid_variables = MutMap::default(); + let mut rigid_variables = RigidVariables::default(); // Exposed values are treated like defs that appear before any others, e.g. // @@ -249,11 +255,11 @@ pub fn canonicalize_module_defs<'a>( } for (var, lowercase) in output.introduced_variables.name_by_var { - rigid_variables.insert(var, lowercase.clone()); + rigid_variables.named.insert(var, lowercase.clone()); } for var in output.introduced_variables.wildcards { - rigid_variables.insert(var, "*".into()); + rigid_variables.wildcards.insert(var); } let mut referenced_values = MutSet::default(); diff --git a/compiler/solve/src/module.rs b/compiler/solve/src/module.rs index abd3b32a70..6508302d96 100644 --- a/compiler/solve/src/module.rs +++ b/compiler/solve/src/module.rs @@ -1,7 +1,7 @@ use crate::solve; use roc_can::constraint::{Constraint as ConstraintSoa, Constraints}; +use roc_can::module::RigidVariables; use roc_collections::all::MutMap; -use roc_module::ident::Lowercase; use roc_module::symbol::Symbol; use roc_types::solved_types::{Solved, SolvedType}; use roc_types::subs::{StorageSubs, Subs, Variable}; @@ -29,15 +29,19 @@ pub struct SolvedModule { pub fn run_solve( constraints: &Constraints, constraint: ConstraintSoa, - rigid_variables: MutMap, + rigid_variables: RigidVariables, mut subs: Subs, ) -> (Solved, solve::Env, Vec) { let env = solve::Env::default(); - for (var, name) in rigid_variables { + for (var, name) in rigid_variables.named { subs.rigid_var(var, name); } + for var in rigid_variables.wildcards { + subs.rigid_var(var, "*".into()); + } + // Now that the module is parsed, canonicalized, and constrained, // we need to type check it. let mut problems = Vec::new();