on master help sign in
Add additional constraint so field name errors do not cascade
4940dfcEvan Czaplicki
compiler/src/Type/Constrain/Expression.hs+8−3
@@ -411,15 +411,20 @@ constrainUpdate rtv region name expr fields expected =
411 do extVar <- mkFlexVar
411 do extVar <- mkFlexVar
412 fieldDict <- Map.traverseWithKey (constrainUpdateField rtv region) fields
412 fieldDict <- Map.traverseWithKey (constrainUpdateField rtv region) fields
413
413
414+ recordVar <- mkFlexVar
415+ let recordType = VarN recordVar
414− let recordType = RecordN (Map.map (\(_,t,_) -> t) fieldDict) (VarN extVar)
416+ let fieldsType = RecordN (Map.map (\(_,t,_) -> t) fieldDict) (VarN extVar)
417+
418+ -- NOTE: fieldsType is separate so that Error propagates better
419+ let fieldsCon = CEqual region Record recordType (NoExpectation fieldsType)
415 let recordCon = CEqual region Record recordType expected
420 let recordCon = CEqual region Record recordType expected
416
421
417− let vars = Map.foldr (\(v,_,_) vs -> v:vs) [extVar] fieldDict
422+ let vars = Map.foldr (\(v,_,_) vs -> v:vs) [recordVar,extVar] fieldDict
418 let cons = Map.foldr (\(_,_,c) cs -> c:cs) [recordCon] fieldDict
423 let cons = Map.foldr (\(_,_,c) cs -> c:cs) [recordCon] fieldDict
419
424
420 con <- constrain rtv expr (FromContext region (RecordUpdateKeys name fields) recordType)
425 con <- constrain rtv expr (FromContext region (RecordUpdateKeys name fields) recordType)
421
426
422− return $ exists vars $ CAnd (con:cons)
427+ return $ exists vars $ CAnd (fieldsCon:con:cons)
423
428
424
429
425constrainUpdateField :: RTV -> R.Region -> N.Name -> Can.FieldUpdate -> IO (Variable, Type, Constraint)
430constrainUpdateField :: RTV -> R.Region -> N.Name -> Can.FieldUpdate -> IO (Variable, Type, Constraint)