X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Ftypes%2FGenerics.lhs;h=323da41d66a4b54cb24a6e6937e5b515b8b34898;hp=2adcc58832aced3e84cbd0b3330230e7aae8f92d;hb=c648345e3d82c0c40333bfd8ddea2633e21b08dc;hpb=a5673c5bcc20a9504c523c122112b935962dafe3 diff --git a/compiler/types/Generics.lhs b/compiler/types/Generics.lhs index 2adcc58..323da41 100644 --- a/compiler/types/Generics.lhs +++ b/compiler/types/Generics.lhs @@ -22,10 +22,12 @@ import RdrName import BasicTypes import TysWiredIn import PrelNames + -- For generation of representation types import TcEnv (tcLookupTyCon) -import TcRnMonad (TcM, newUnique) +import TcRnMonad import HscTypes +import BuildTyCl import SrcLoc import Bag @@ -52,11 +54,11 @@ canDoGenerics tycon = mergeErrors ( -- We do not support datatypes with context (if (not (null (tyConStupidTheta tycon))) - then (Just (ppr tycon <+> text "has a datatype context")) + then (Just (ppr tycon <+> text "must not have a datatype context")) else Nothing) -- We don't like type families : (if (isFamilyTyCon tycon) - then (Just (ppr tycon <+> text "is a family instance")) + then (Just (ppr tycon <+> text "must not be a family instance")) else Nothing) -- See comment below : (map bad_con (tyConDataCons tycon))) @@ -66,9 +68,9 @@ canDoGenerics tycon -- it relies on instantiating *polymorphic* sum and product types -- at the argument types of the constructors bad_con dc = if (any bad_arg_type (dataConOrigArgTys dc)) - then (Just (ppr dc <+> text "has unlifted or polymorphic arguments")) + then (Just (ppr dc <+> text "must not have unlifted or polymorphic arguments")) else (if (not (isVanillaDataCon dc)) - then (Just (ppr dc <+> text "is not a vanilla data constructor")) + then (Just (ppr dc <+> text "must be a vanilla data constructor")) else Nothing) @@ -81,7 +83,7 @@ canDoGenerics tycon mergeErrors [] = Nothing mergeErrors ((Just s):t) = case mergeErrors t of Nothing -> Just s - Just s' -> Just (s $$ s') + Just s' -> Just (s <> text ", and" $$ s') mergeErrors (Nothing :t) = mergeErrors t \end{code} @@ -112,6 +114,37 @@ mkBindsRep tycon = (from_alts, to_alts) = mkSum (1 :: US) tycon datacons -------------------------------------------------------------------------------- +-- The type instance synonym and synonym +-- type instance Rep (D a b) = Rep_D a b +-- type Rep_D a b = ...representation type for D ... +-------------------------------------------------------------------------------- + +tc_mkRepTyCon :: TyCon -- The type to generate representation for + -> MetaTyCons -- Metadata datatypes to refer to + -> TcM TyCon -- Generated representation0 type +tc_mkRepTyCon tycon metaDts = +-- Consider the example input tycon `D`, where data D a b = D_ a + do { -- `rep0` = GHC.Generics.Rep (type family) + rep0 <- tcLookupTyCon repTyConName + + -- `rep0Ty` = D1 ... (C1 ... (S1 ... (Rec0 a))) :: * -> * + ; rep0Ty <- tc_mkRepTy tycon metaDts + + -- `rep_name` is a name we generate for the synonym + ; rep_name <- newImplicitBinder (tyConName tycon) mkGenR + ; let -- `tyvars` = [a,b] + tyvars = tyConTyVars tycon + + -- rep0Ty has kind * -> * + rep_kind = liftedTypeKind `mkArrowKind` liftedTypeKind + + -- `appT` = D a b + appT = [mkTyConApp tycon (mkTyVarTys tyvars)] + + ; buildSynTyCon rep_name tyvars (SynonymTyCon rep0Ty) rep_kind + NoParentTyCon (Just (rep0, appT)) } + +-------------------------------------------------------------------------------- -- Type representation -------------------------------------------------------------------------------- @@ -173,41 +206,6 @@ tc_mkRepTy tycon metaDts = return (mkD tycon) -tc_mkRepTyCon :: TyCon -- The type to generate representation for - -> MetaTyCons -- Metadata datatypes to refer to - -> TcM TyCon -- Generated representation0 type -tc_mkRepTyCon tycon metaDts = --- Consider the example input tycon `D`, where data D a b = D_ a - do - uniq1 <- newUnique - uniq2 <- newUnique - -- `rep0Ty` = D1 ... (C1 ... (S1 ... (Rec0 a))) :: * -> * - rep0Ty <- tc_mkRepTy tycon metaDts - -- `rep0` = GHC.Generics.Rep (type family) - rep0 <- tcLookupTyCon repTyConName - - let modl = nameModule (tyConName tycon) - loc = nameSrcSpan (tyConName tycon) - -- `repName` is a name we generate for the synonym - repName = mkExternalName uniq1 modl (mkGenR0 (nameOccName (tyConName tycon))) loc - -- `coName` is a name for the coercion - coName = mkExternalName uniq2 modl (mkGenR0 (nameOccName (tyConName tycon))) loc - -- `tyvars` = [a,b] - tyvars = tyConTyVars tycon - -- `appT` = D a b - appT = [mkTyConApp tycon (mkTyVarTys tyvars)] - -- Result - res = mkSynTyCon repName - -- rep0Ty has kind `kind of D` -> * - (tyConKind tycon `mkArrowKind` liftedTypeKind) - tyvars (SynonymTyCon rep0Ty) - (FamInstTyCon rep0 appT - (mkCoercionTyCon coName (tyConArity tycon) - -- co : forall a b. Rep (D a b) ~ `rep0Ty` a b - (CoAxiom tyvars (mkTyConApp rep0 appT) rep0Ty))) - - return res - -------------------------------------------------------------------------------- -- Meta-information -------------------------------------------------------------------------------- @@ -220,7 +218,7 @@ data MetaTyCons = MetaTyCons { -- One meta datatype per dataype , metaS :: [[TyCon]] } instance Outputable MetaTyCons where - ppr (MetaTyCons d c s) = ppr d <+> ppr c <+> ppr s + ppr (MetaTyCons d c s) = ppr d $$ vcat (map ppr c) $$ vcat (map ppr (concat s)) metaTyCons2TyCons :: MetaTyCons -> [TyCon] metaTyCons2TyCons (MetaTyCons d c s) = d : c ++ concat s