[project @ 2004-09-10 13:58:55 by simonmar]
[ghc-hetmet.git] / ghc / compiler / coreSyn / PprCore.lhs
index b98b18f..f396974 100644 (file)
@@ -9,9 +9,9 @@
 
 \begin{code}
 module PprCore (
-       pprCoreExpr, pprParendExpr, pprIdBndr,
+       pprCoreExpr, pprParendExpr,
        pprCoreBinding, pprCoreBindings, pprCoreAlt,
-       pprIdRules, pprCoreRule
+       pprIdRules
     ) where
 
 #include "HsVersions.h"
@@ -27,7 +27,7 @@ import Id             ( Id, idType, isDataConWorkId_maybe, idLBVarInfo, idArity,
                          globalIdDetails, isGlobalId, isExportedId, 
                          isSpecPragmaId, idNewDemandInfo
                        )
-import Var             ( isTyVar )
+import Var             ( TyVar, isTyVar, tyVarKind )
 import IdInfo          ( IdInfo, megaSeqIdInfo, 
                          arityInfo, ppArityInfo, 
                          specInfo, pprNewStrictness,
@@ -40,7 +40,7 @@ import IdInfo         ( IdInfo, megaSeqIdInfo,
                        )
 import DataCon         ( dataConTyCon )
 import TyCon           ( tupleTyConBoxity, isTupleTyCon )
-import PprType         ( pprParendType, pprType, pprTyVarBndr )
+import Type            ( pprParendType, pprType, pprParendKind )
 import BasicTypes      ( tupleParens )
 import Util             ( lengthIs )
 import Outputable
@@ -275,7 +275,7 @@ pprCoreBinder LetBind binder
     pragmas = ppIdInfo binder (idInfo binder)
 
 -- Lambda bound type variables are preceded by "@"
-pprCoreBinder LambdaBind bndr = pprTypedBinder bndr
+pprCoreBinder LambdaBind bndr = parens (pprTypedBinder bndr)
 
 -- Case bound things don't get a signature or a herald
 pprCoreBinder CaseBind bndr = pprUntypedBinder bndr
@@ -287,12 +287,17 @@ pprUntypedBinder binder
 pprTypedBinder binder
   | isTyVar binder  = ptext SLIT("@") <+> pprTyVarBndr binder
   | otherwise      = pprIdBndr binder <+> dcolon <+> pprType (idType binder)
-       -- The space before the :: is important; it helps the lexer
-       -- when reading inferfaces.  Otherwise it would lex "a::b" as one thing.
-       --
-       -- It's important that the type is parenthesised too, at least when
-       -- printing interfaces, because we get \ x::(a->b) y::(c->d) -> ...
-       --      [Jun 2002: interfaces are now binary, so this doesn't matter]
+
+pprTyVarBndr :: TyVar -> SDoc
+pprTyVarBndr tyvar
+  = getPprStyle $ \ sty ->
+    if debugStyle sty then
+        hsep [ppr tyvar, dcolon, pprParendKind kind]
+               -- See comments with ppDcolon in PprCore.lhs
+    else
+        ppr tyvar
+  where
+    kind = tyVarKind tyvar
 
 -- pprIdBndr does *not* print the type
 -- When printing any Id binder in debug mode, we print its inline pragma and one-shot-ness