on master help sign in
Have local record constructors return aliased type
3b5c227Evan Czaplicki
compiler/src/Canonicalize/Environment/Local.hs+21−32
@@ -292,41 +292,30 @@ type CtorDups = Dups.Dict (Map.Map ModuleName.Canonical Env.Ctor)
292
292
293canonicalizeAlias :: Env.Env -> Valid.Alias -> Result i w ( (N.Name, Can.Alias), CtorDups )
293canonicalizeAlias :: Env.Env -> Valid.Alias -> Result i w ( (N.Name, Can.Alias), CtorDups )
294canonicalizeAlias env@(Env.Env home _ _ _ _ _ _ _) (Valid.Alias _ (A.At region name) args tipe) =
294canonicalizeAlias env@(Env.Env home _ _ _ _ _ _ _) (Valid.Alias _ (A.At region name) args tipe) =
295+ do let vars = map A.toValue args
296+ ctipe <- Type.canonicalize env tipe
297+ Result.ok
298+ ( (name, Can.Alias vars ctipe)
299+ ,
295− case tipe of
300+ case ctipe of
296− A.At _ (Src.TRecord fields Nothing) ->
297− do cfields <- canonicalizeFields env fields
298− fieldDict <- Dups.checkFields cfields
299−
300− let
301− addArg (_, Can.FieldType _ t1) t2 = Can.TLambda t1 t2
302− recordType = Can.TRecord fieldDict Nothing
301+ Can.TRecord fields Nothing ->
303− vars = map A.toValue args
304− ctor = Env.RecordCtor home vars (foldr addArg recordType cfields)
305−
306− Result.ok
307− ( (name, Can.Alias vars recordType)
308− , Dups.one name region (Map.singleton home ctor)
302+ Dups.one name region (Map.singleton home (toRecordCtor home name vars fields))
309− )
303+
310−
304+ _ ->
311− _ ->
312− do ctipe <- Type.canonicalize env tipe
313− Result.ok
314− ( (name, Can.Alias (map A.toValue args) ctipe)
315− , Dups.none
305+ Dups.none
316− )
306+ )
317−
318
307
319−canonicalizeFields :: Env.Env -> [(A.Located N.Name, Src.Type)] -> Result i w [(A.Located N.Name, Can.FieldType)]
308+toRecordCtor :: ModuleName.Canonical -> N.Name -> [N.Name] -> Map.Map N.Name Can.FieldType -> Env.Ctor
320−canonicalizeFields env fields =
309+toRecordCtor home name vars fields =
321 let
310 let
322− len =
311+ avars = map (\var -> (var, Can.TVar var)) vars
323− fromIntegral (length fields)
312+ alias =
324−
313+ foldr
325− canonicalizeField index (name, srcType) =
314+ (\(_,t1) t2 -> Can.TLambda t1 t2)
326− do tipe <- Type.canonicalize env srcType
315+ (Can.TAlias home name avars (Can.Filled (Can.TRecord fields Nothing)))
327− return (name, Can.FieldType index tipe)
316+ (Can.fieldsToList fields)
328 in
317 in
329− sequenceA (zipWith canonicalizeField [0..len] fields)
318+ Env.RecordCtor home vars alias
330
319
331
320
332
321