X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FcoreSyn%2FMkExternalCore.lhs;h=34f39a51930eef37ad8b670a89a477b3a37252c3;hp=ba0c198209af5203a187f67cd016e525716fcf63;hb=044805225a08d5e370b72d2efed66880912b0806;hpb=b0045fdd4404f3ac2ddacad8c39a017f01f8ff6b diff --git a/compiler/coreSyn/MkExternalCore.lhs b/compiler/coreSyn/MkExternalCore.lhs index ba0c198..34f39a5 100644 --- a/compiler/coreSyn/MkExternalCore.lhs +++ b/compiler/coreSyn/MkExternalCore.lhs @@ -84,33 +84,17 @@ collect_tdefs tcon tdefs | isAlgTyCon tcon = tdef: tdefs where tdef | isNewTyCon tcon = - C.Newtype (qtc tcon) (map make_tbind tyvars) + C.Newtype (qtc tcon) (case newTyConCo_maybe tcon of - Just co -> (qtc co, - map make_tbind vs, - make_kind (mkCoKind l r)) - where (vs,l,r) = coercionAxiom co + Just co -> qtc co Nothing -> pprPanic ("MkExternalCore: newtype tcon\ should have a coercion: ") (ppr tcon)) - repclause + (map make_tbind tyvars) + (make_ty (snd (newTyConRhs tcon))) | otherwise = C.Data (qtc tcon) (map make_tbind tyvars) (map make_cdef (tyConDataCons tcon)) - where repclause | isRecursiveTyCon tcon || isOpenTyCon tcon= Nothing - | otherwise = Just (make_ty (snd (newTyConRhs tcon))) tyvars = tyConTyVars tcon - coercionAxiom co = - case isCoercionTyCon_maybe co of - -- See Note [Newtype coercions] in - -- types/TyCon - Just (arity,coKindFun) | (l,r) <- (coKindFun $ map mkTyVarTy vs) -> - -- Here we eta-expand the newtype coercion, - -- which makes the ext-core typechecker somewhat simpler. - (tyvars,mkAppTys l extraVs,mkAppTys r extraVs) - where (vs, extraVs) = (take arity tyvars, - map mkTyVarTy $ drop arity tyvars) - Nothing -> pprPanic "MkExternalCore: coercion tcon lacks a kind fun" - (ppr tcon) collect_tdefs _ tdefs = tdefs @@ -239,8 +223,8 @@ make_ty' (TyVarTy tv) = C.Tvar (make_var_id (tyVarName tv)) make_ty' (AppTy t1 t2) = C.Tapp (make_ty t1) (make_ty t2) make_ty' (FunTy t1 t2) = make_ty (TyConApp funTyCon [t1,t2]) make_ty' (ForAllTy tv t) = C.Tforall (make_tbind tv) (make_ty t) -make_ty' (TyConApp tc ts) = foldl C.Tapp (C.Tcon (qtc tc)) - (map make_ty ts) +make_ty' (TyConApp tc ts) = make_tyConApp tc ts + -- Newtypes are treated just like any other type constructor; not expanded -- Reason: predTypeRep does substitution and, while substitution deals -- correctly with name capture, it's only correct if you see the uniques! @@ -255,6 +239,25 @@ make_ty' (TyConApp tc ts) = foldl C.Tapp (C.Tcon (qtc tc)) make_ty' (PredTy p) = make_ty (predTypeRep p) +make_tyConApp :: TyCon -> [Type] -> C.Ty +make_tyConApp tc [t1, t2] | tc == transCoercionTyCon = + C.TransCoercion (make_ty t1) (make_ty t2) +make_tyConApp tc [t] | tc == symCoercionTyCon = + C.SymCoercion (make_ty t) +make_tyConApp tc [t1, t2] | tc == unsafeCoercionTyCon = + C.UnsafeCoercion (make_ty t1) (make_ty t2) +make_tyConApp tc [t] | tc == leftCoercionTyCon = + C.LeftCoercion (make_ty t) +make_tyConApp tc [t] | tc == rightCoercionTyCon = + C.RightCoercion (make_ty t) +make_tyConApp tc [t1, t2] | tc == instCoercionTyCon = + C.InstCoercion (make_ty t1) (make_ty t2) +-- this fails silently if we have an application +-- of a wired-in coercion tycon to the wrong number of args. +-- Not great... +make_tyConApp tc ts = + foldl C.Tapp (C.Tcon (qtc tc)) + (map make_ty ts) make_kind :: Kind -> C.Kind