Fix Trac #2138: print the 'stupid theta' of a data type
[ghc-hetmet.git] / compiler / main / PprTyThing.hs
index 6a0bf82..c379d97 100644 (file)
@@ -1,3 +1,10 @@
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 -----------------------------------------------------------------------------
 --
 -- Pretty-printing TyThings
@@ -6,13 +13,6 @@
 --
 -----------------------------------------------------------------------------
 
-{-# OPTIONS -w #-}
--- The above warning supression flag is a temporary kludge.
--- While working on this module you are encouraged to remove it and fix
--- any warnings in the module. See
---     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
--- for details
-
 module PprTyThing (
        PrintExplicitForalls,
        pprTyThing,
@@ -28,7 +28,7 @@ module PprTyThing (
 import qualified GHC
 
 import GHC     ( TyThing(..) )
-import TyCon   ( tyConFamInst_maybe )
+import TyCon   ( tyConFamInst_maybe, isAlgTyCon, tyConStupidTheta )
 import Type    ( TyThing(..), tidyTopType, pprTypeApp )
 import TcType  ( tcMultiSplitSigmaTy, mkPhiTy )
 import SrcLoc  ( SrcSpan )
@@ -86,7 +86,7 @@ pprTyConHdr pefas tyCon
   | Just (fam_tc, tys) <- tyConFamInst_maybe tyCon
   = ptext keyword <+> ptext SLIT("instance") <+> pprTypeApp tyCon (ppr_bndr tyCon) tys
   | otherwise
-  = ptext keyword <+> opt_family <+> ppr_bndr tyCon <+> hsep (map ppr vars)
+  = ptext keyword <+> opt_family <+> opt_stupid <+> ppr_bndr tyCon <+> hsep (map ppr vars)
   where
     vars | GHC.isPrimTyCon tyCon || 
           GHC.isFunTyCon tyCon = take (GHC.tyConArity tyCon) GHC.alphaTyVars
@@ -100,6 +100,10 @@ pprTyConHdr pefas tyCon
       | GHC.isOpenTyCon tyCon = ptext SLIT("family")
       | otherwise             = empty
 
+    opt_stupid         -- The "stupid theta" part of the declaration
+       | isAlgTyCon tyCon = GHC.pprThetaArrow (tyConStupidTheta tyCon)
+       | otherwise        = empty      -- Returns 'empty' if null theta
+
 pprDataConSig pefas dataCon =
   ppr_bndr dataCon <+> dcolon <+> pprTypeForUser pefas (GHC.dataConType dataCon)
 
@@ -190,7 +194,7 @@ pprDataConDecl pefas gadt_style show_label dataCon
 
        -- printing out the dataCon as a type signature, in GADT style
     pp_tau = foldr add (ppr res_ty) tys_w_strs
-    add (str,ty) pp_ty = pprBangTy str ty <+> arrow <+> pp_ty
+    add str_ty pp_ty = pprParendBangTy str_ty <+> arrow <+> pp_ty
 
     pprParendBangTy (strict,ty)
        | GHC.isMarkedStrict strict = char '!' <> GHC.pprParendType ty