X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fiface%2FIfaceSyn.lhs;h=4ebebe09ff297a36c329f27439b178d89d8b1e73;hb=17434e5beb213f1e8971d1ce8ffbf40a0848bb3a;hp=5f9c1d88309fd7e4c1cba27323cd07aeeb1ac5e0;hpb=d76c18e05f6366c23144624b696a02fbaa6d26e8;p=ghc-hetmet.git diff --git a/compiler/iface/IfaceSyn.lhs b/compiler/iface/IfaceSyn.lhs index 5f9c1d8..4ebebe0 100644 --- a/compiler/iface/IfaceSyn.lhs +++ b/compiler/iface/IfaceSyn.lhs @@ -17,10 +17,10 @@ module IfaceSyn ( IfaceDecl(..), IfaceClassOp(..), IfaceConDecl(..), IfaceConDecls(..), IfaceExpr(..), IfaceAlt, IfaceNote(..), IfaceBinding(..), IfaceConAlt(..), IfaceIdInfo(..), - IfaceInfoItem(..), IfaceRule(..), IfaceInst(..), + IfaceInfoItem(..), IfaceRule(..), IfaceInst(..), IfaceFamInst(..), -- Misc - visibleIfConDecls, + visibleIfConDecls, extractIfFamInsts, -- Equality IfaceEq(..), (&&&), bool, eqListBy, eqMaybeBy, @@ -39,7 +39,7 @@ import NewDemand ( StrictSig, pprIfaceStrictSig ) import TcType ( deNoteType ) import Class ( FunDep, DefMeth, pprFundeps ) import OccName ( OccName, parenSymOcc, occNameFS, - OccSet, unionOccSets, unitOccSet ) + OccSet, unionOccSets, unitOccSet, occSetElts ) import UniqFM ( UniqFM, emptyUFM, addToUFM, lookupUFM ) import Name ( Name, NamedThing(..), nameOccName, isExternalName ) import CostCentre ( CostCentre, pprCostCentreCore ) @@ -85,10 +85,8 @@ data IfaceDecl -- been compiled with -- different flags to the -- current compilation unit - ifFamInst :: Maybe -- Just _ <=> instance of fam - (IfaceTyCon, -- Family tycon - [IfaceType], -- Instance types - Int ) -- Unique index for naming + ifFamInst :: Maybe IfaceFamInst + -- Just <=> instance of family } | IfaceSyn { ifName :: OccName, -- Type constructor @@ -156,6 +154,16 @@ data IfaceInst -- If this instance decl is *used*, we'll record a usage on the dfun; -- and if the head does not change it won't be used if it wasn't before +data IfaceFamInst + = IfaceFamInst { ifFamInstTyCon :: IfaceTyCon -- Family tycon + , ifFamInstTys :: [IfaceType] -- Instance types + } + +extractIfFamInsts :: [IfaceDecl] -> [(IfaceFamInst, IfaceDecl)] +extractIfFamInsts decls = + [(famInst, decl) | decl@IfaceData {ifFamInst = Just famInst} <- decls] + -- !!!TODO: we also need a similar case for synonyms + data IfaceRule = IfaceRule { ifRuleName :: RuleName, @@ -284,10 +292,8 @@ pprRec isrec = ptext SLIT("RecFlag") <+> ppr isrec pprGen True = ptext SLIT("Generics: yes") pprGen False = ptext SLIT("Generics: no") -pprFamily Nothing = ptext SLIT("FamilyInstance: none") -pprFamily (Just (fam, tys, index)) = ptext SLIT("FamilyInstance:") <+> - ppr fam <+> hsep (map ppr tys) <+> - brackets (ppr index) +pprFamily Nothing = ptext SLIT("FamilyInstance: none") +pprFamily (Just famInst) = ptext SLIT("FamilyInstance:") <+> ppr famInst instance Outputable IfaceClassOp where ppr (IfaceClassOp n dm ty) = ppr n <+> ppr dm <+> dcolon <+> ppr ty @@ -344,6 +350,10 @@ instance Outputable IfaceInst where where ppr_mb Nothing = dot ppr_mb (Just tc) = ppr tc + +instance Outputable IfaceFamInst where + ppr (IfaceFamInst {ifFamInstTyCon = tycon, ifFamInstTys = tys}) + = ppr tycon <+> hsep (map ppr tys) \end{code} @@ -374,21 +384,22 @@ pprIfaceExpr add_par e@(IfaceLam _ _) collect bs (IfaceLam b e) = collect (b:bs) e collect bs e = (reverse bs, e) --- gaw 2004 pprIfaceExpr add_par (IfaceCase scrut bndr ty [(con, bs, rhs)]) --- gaw 2004 - = add_par (sep [ptext SLIT("case") <+> char '@' <+> pprParendIfaceType ty <+> pprIfaceExpr noParens scrut <+> ptext SLIT("of") + = add_par (sep [ptext SLIT("case") <+> char '@' <+> pprParendIfaceType ty + <+> pprIfaceExpr noParens scrut <+> ptext SLIT("of") <+> ppr bndr <+> char '{' <+> ppr_con_bs con bs <+> arrow, pprIfaceExpr noParens rhs <+> char '}']) --- gaw 2004 pprIfaceExpr add_par (IfaceCase scrut bndr ty alts) --- gaw 2004 - = add_par (sep [ptext SLIT("case") <+> char '@' <+> pprParendIfaceType ty <+> pprIfaceExpr noParens scrut <+> ptext SLIT("of") + = add_par (sep [ptext SLIT("case") <+> char '@' <+> pprParendIfaceType ty + <+> pprIfaceExpr noParens scrut <+> ptext SLIT("of") <+> ppr bndr <+> char '{', nest 2 (sep (map ppr_alt alts)) <+> char '}']) -pprIfaceExpr add_par (IfaceCast expr co) = add_par (ptext SLIT("cast") <+> ppr expr <+> ppr co) +pprIfaceExpr add_par (IfaceCast expr co) + = sep [pprIfaceExpr parens expr, + nest 2 (ptext SLIT("`cast`")), + pprParendIfaceType co] pprIfaceExpr add_par (IfaceLet (IfaceNonRec b rhs) body) = add_par (sep [ptext SLIT("let {"), @@ -464,6 +475,11 @@ data IfaceEq | NotEqual -- Definitely different | EqBut OccSet -- The same provided these local things have not changed +instance Outputable IfaceEq where + ppr Equal = ptext SLIT("Equal") + ppr NotEqual = ptext SLIT("NotEqual") + ppr (EqBut occset) = ptext SLIT("EqBut") <+> ppr (occSetElts occset) + bool :: Bool -> IfaceEq bool True = Equal bool False = NotEqual @@ -556,10 +572,11 @@ eqIfDecl d1@(IfaceData {}) d2@(IfaceData {}) -- over the constructors (any more), but they do scope -- over the stupid context in the IfaceConDecls where - Nothing `eqIfTc_fam` Nothing = Equal - (Just (fam1, tys1, co1)) `eqIfTc_fam` (Just (fam2, tys2, co2)) = - fam1 `eqIfTc` fam2 &&& eqListBy eqIfType tys1 tys2 &&& bool (co1 == co2) - _ `eqIfTc_fam` _ = NotEqual + Nothing `eqIfTc_fam` Nothing = Equal + (Just (IfaceFamInst fam1 tys1)) + `eqIfTc_fam` (Just (IfaceFamInst fam2 tys2)) = + fam1 `eqIfTc` fam2 &&& eqListBy eqIfType tys1 tys2 + _ `eqIfTc_fam` _ = NotEqual eqIfDecl d1@(IfaceSyn {}) d2@(IfaceSyn {}) = bool (ifName d1 == ifName d2) &&& @@ -719,7 +736,12 @@ eqIfTc IfaceBoolTc IfaceBoolTc = Equal eqIfTc IfaceListTc IfaceListTc = Equal eqIfTc IfacePArrTc IfacePArrTc = Equal eqIfTc (IfaceTupTc bx1 ar1) (IfaceTupTc bx2 ar2) = bool (bx1==bx2 && ar1==ar2) -eqIfTc _ _ = NotEqual +eqIfTc IfaceLiftedTypeKindTc IfaceLiftedTypeKindTc = Equal +eqIfTc IfaceOpenTypeKindTc IfaceOpenTypeKindTc = Equal +eqIfTc IfaceUnliftedTypeKindTc IfaceUnliftedTypeKindTc = Equal +eqIfTc IfaceUbxTupleKindTc IfaceUbxTupleKindTc = Equal +eqIfTc IfaceArgTypeKindTc IfaceArgTypeKindTc = Equal +eqIfTc _ _ = NotEqual \end{code} ----------------------------------------------------------- @@ -733,7 +755,7 @@ type EqEnv = UniqFM FastString -- Tracks the mapping from L-variables to R-varia eqIfOcc :: EqEnv -> FastString -> FastString -> IfaceEq eqIfOcc env n1 n2 = case lookupUFM env n1 of Just n1 -> bool (n1 == n2) - Nothing -> bool (n1 == n2) + Nothing -> bool (show n1 == show n2) extendEqEnv :: EqEnv -> FastString -> FastString -> EqEnv extendEqEnv env n1 n2 | n1 == n2 = env