Unify optional fields

This commit is contained in:
Richard Feldman 2020-07-18 12:50:14 -04:00
parent 8b53ec15fe
commit ae05f0eb0c

View file

@ -4,7 +4,7 @@ use roc_module::symbol::Symbol;
use roc_types::boolean_algebra::Bool; use roc_types::boolean_algebra::Bool;
use roc_types::subs::Content::{self, *}; use roc_types::subs::Content::{self, *};
use roc_types::subs::{Descriptor, FlatType, Mark, OptVariable, Subs, Variable}; use roc_types::subs::{Descriptor, FlatType, Mark, OptVariable, Subs, Variable};
use roc_types::types::{gather_fields, ErrorType, Mismatch, RecordStructure}; use roc_types::types::{gather_fields, ErrorType, Mismatch, RecordField, RecordStructure};
macro_rules! mismatch { macro_rules! mismatch {
() => {{ () => {{
@ -319,17 +319,27 @@ fn unify_shared_fields(
subs: &mut Subs, subs: &mut Subs,
pool: &mut Pool, pool: &mut Pool,
ctx: &Context, ctx: &Context,
shared_fields: MutMap<Lowercase, (Variable, Variable)>, shared_fields: MutMap<Lowercase, (RecordField<Variable>, RecordField<Variable>)>,
other_fields: MutMap<Lowercase, Variable>, other_fields: MutMap<Lowercase, RecordField<Variable>>,
ext: Variable, ext: Variable,
) -> Outcome { ) -> Outcome {
let mut matching_fields = MutMap::default(); let mut matching_fields = MutMap::default();
let num_shared_fields = shared_fields.len(); let num_shared_fields = shared_fields.len();
for (name, (actual, expected)) in shared_fields { for (name, (actual, expected)) in shared_fields {
let problems = unify_pool(subs, pool, actual, expected); let problems = unify_pool(subs, pool, actual.into_inner(), expected.into_inner());
if problems.is_empty() { if problems.is_empty() {
use RecordField::*;
// If either field is Required, both are Required.
let actual = match (actual, expected) {
(Required(val), Required(_)) => Required(val),
(Required(val), Optional(_)) => Required(val),
(Optional(val), Required(_)) => Required(val),
(Optional(val), Optional(_)) => Optional(val),
};
matching_fields.insert(name, actual); matching_fields.insert(name, actual);
} }
} }