X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FbasicTypes%2FDataCon.lhs;h=3de990512874051f580f4c7c54f216eefd284d91;hb=27ca67931713c36f5ed248de88298416892e5649;hp=a04f28f28e0587e498bfcd82b33ec44afae170fe;hpb=80c89b80c355b2aaebcd53330e6c6170c3f05aca;p=ghc-hetmet.git diff --git a/compiler/basicTypes/DataCon.lhs b/compiler/basicTypes/DataCon.lhs index a04f28f..3de9905 100644 --- a/compiler/basicTypes/DataCon.lhs +++ b/compiler/basicTypes/DataCon.lhs @@ -11,7 +11,6 @@ module DataCon ( dataConRepType, dataConSig, dataConFullSig, dataConName, dataConTag, dataConTyCon, dataConUserType, dataConUnivTyVars, dataConExTyVars, dataConAllTyVars, dataConResTys, - dataConInstTys, dataConEqSpec, eqSpecPreds, dataConTheta, dataConStupidTheta, dataConInstArgTys, dataConOrigArgTys, dataConInstOrigArgTys, dataConRepArgTys, @@ -39,7 +38,8 @@ import Type ( Type, ThetaType, import Coercion ( isEqPred, mkEqPred ) import TyCon ( TyCon, FieldLabel, tyConDataCons, isProductTyCon, isTupleTyCon, isUnboxedTupleTyCon, - isNewTyCon, isRecursiveTyCon, tyConFamily_maybe ) + isNewTyCon, isClosedNewTyCon, isRecursiveTyCon, + tyConFamInst_maybe ) import Class ( Class, classTyCon ) import Name ( Name, NamedThing(..), nameUnique, mkSysTvName, mkSystemName ) import Var ( TyVar, CoVar, Id, mkTyVar, tyVarKind, setVarUnique, @@ -336,13 +336,9 @@ data DataCon -- An entirely separate wrapper function is built in TcTyDecls dcIds :: DataConIds, - dcInfix :: Bool, -- True <=> declared infix + dcInfix :: Bool -- True <=> declared infix -- Used for Template Haskell and 'deriving' only -- The actual fixity is stored elsewhere - - dcInstTys :: Maybe [Type] -- If this data constructor is part of a - -- data instance, then these are the type - -- patterns of the instance. } data DataConIds @@ -438,7 +434,6 @@ mkDataCon :: Name -> [TyVar] -> [TyVar] -> [(TyVar,Type)] -> ThetaType -> [Type] -> TyCon - -> Maybe [Type] -> ThetaType -> DataConIds -> DataCon -- Can get the tag from the TyCon @@ -449,7 +444,6 @@ mkDataCon name declared_infix univ_tvs ex_tvs eq_spec theta orig_arg_tys tycon - mb_typats stupid_theta ids = ASSERT( not (any isEqPred theta) ) -- We don't currently allow any equality predicates on @@ -469,8 +463,7 @@ mkDataCon name declared_infix dcStrictMarks = arg_stricts, dcRepStrictness = rep_arg_stricts, dcFields = fields, dcTag = tag, dcRepType = ty, - dcIds = ids, - dcInstTys = mb_typats } + dcIds = ids } -- Strictness marks for source-args -- *after unboxing choices*, @@ -609,9 +602,6 @@ dataConResTys dc = [substTyVar env tv | tv <- dcUnivTyVars dc] where env = mkTopTvSubst (dcEqSpec dc) -dataConInstTys :: DataCon -> Maybe [Type] -dataConInstTys = dcInstTys - dataConUserType :: DataCon -> Type -- The user-declared type of the data constructor -- in the nice-to-read form @@ -623,18 +613,13 @@ dataConUserType :: DataCon -> Type dataConUserType (MkData { dcUnivTyVars = univ_tvs, dcExTyVars = ex_tvs, dcEqSpec = eq_spec, dcTheta = theta, dcOrigArgTys = arg_tys, - dcTyCon = tycon, dcInstTys = mb_insttys }) + dcTyCon = tycon }) = mkForAllTys ((univ_tvs `minusList` map fst eq_spec) ++ ex_tvs) $ mkFunTys (mkPredTys theta) $ mkFunTys arg_tys $ - case mb_insttys of - Nothing -> mkTyConApp tycon (map (substTyVar subst) univ_tvs) - Just insttys -> mkTyConApp ftycon insttys -- data instance - where - ftycon = case tyConFamily_maybe tycon of - Just ftycon -> ftycon - Nothing -> panic err - err = "dataConUserType: type patterns without family tycon" + case tyConFamInst_maybe tycon of + Nothing -> mkTyConApp tycon (map (substTyVar subst) univ_tvs) + Just (ftc, insttys) -> mkTyConApp ftc insttys -- data instance where subst = mkTopTvSubst eq_spec @@ -743,9 +728,10 @@ splitProductType str ty deepSplitProductType_maybe ty = do { (res@(tycon, tycon_args, _, _)) <- splitProductType_maybe ty ; let {result - | isNewTyCon tycon && not (isRecursiveTyCon tycon) + | isClosedNewTyCon tycon && not (isRecursiveTyCon tycon) = deepSplitProductType_maybe (newTyConInstRhs tycon tycon_args) - | isNewTyCon tycon = Nothing -- cannot unbox through recursive newtypes + | isNewTyCon tycon = Nothing -- cannot unbox through recursive + -- newtypes nor through families | otherwise = Just res} ; result }