on master help sign in
Add additional constraint so field name errors do not cascade
commit4940dfc096be058ca7731418bf539e39eb1405cf authorEvan Czaplicki <evancz@users.noreply.github.com> dateTue 24 Apr 2018, 00:09 (9 years ago) parentf91c6d0
1 file changed+8−3
compiler/src/Type/Constrain/Expression.hs+8−3
compiler/src/Type/Constrain/Expression.hs+8−3
@@ -411,15 +411,20 @@ constrainUpdate rtv region name expr fields expected =
411411 do extVar <- mkFlexVar
412412 fieldDict <- Map.traverseWithKey (constrainUpdateField rtv region) fields
413413
414− let recordType = RecordN (Map.map (\(_,t,_) -> t) fieldDict) (VarN extVar)
414+ recordVar <- mkFlexVar
415+ let recordType = VarN recordVar
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)
415420 let recordCon = CEqual region Record recordType expected
416421
417− let vars = Map.foldr (\(v,_,_) vs -> v:vs) [extVar] fieldDict
422+ let vars = Map.foldr (\(v,_,_) vs -> v:vs) [recordVar,extVar] fieldDict
418423 let cons = Map.foldr (\(_,_,c) cs -> c:cs) [recordCon] fieldDict
419424
420425 con <- constrain rtv expr (FromContext region (RecordUpdateKeys name fields) recordType)
421426
422− return $ exists vars $ CAnd (con:cons)
427+ return $ exists vars $ CAnd (fieldsCon:con:cons)
423428
424429
425430constrainUpdateField :: RTV -> R.Region -> N.Name -> Can.FieldUpdate -> IO (Variable, Type, Constraint)