Improve depth-cutoff for printing HsSyn in error messages
[ghc-hetmet.git] / compiler / hsSyn / HsExpr.lhs
index 18306a9..2be1ee6 100644 (file)
@@ -1,7 +1,9 @@
 %
+% (c) The University of Glasgow 2006
 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
-\section[HsExpr]{Abstract Haskell syntax: expressions}
+
+HsExpr: Abstract Haskell syntax: expressions
 
 \begin{code}
 module HsExpr where
@@ -9,20 +11,18 @@ module HsExpr where
 #include "HsVersions.h"
 
 -- friends:
-import HsDecls         ( HsGroup )
-import HsPat           ( LPat )
-import HsLit           ( HsLit(..), HsOverLit )
-import HsTypes         ( LHsType, PostTcType )
-import HsImpExp                ( isOperator, pprHsVar )
-import HsBinds         ( HsLocalBinds, DictBinds, isEmptyLocalBinds,
-                         ExprCoFn, pprCoFn )
+import HsDecls
+import HsPat
+import HsLit
+import HsTypes
+import HsImpExp
+import HsBinds
 
 -- others:
-import Type            ( Type, pprParendType )
-import Var             ( TyVar, Id )
-import Name            ( Name )
-import BasicTypes      ( IPName, Boxity, tupleParens, Arity, Fixity(..) )
-import SrcLoc          ( Located(..), unLoc )
+import Var
+import Name
+import BasicTypes
+import SrcLoc
 import Outputable      
 import FastString
 \end{code}
@@ -186,6 +186,7 @@ data HsExpr id
                
   -----------------------------------------------------------
   -- MetaHaskell Extensions
+
   | HsBracket    (HsBracket id)
 
   | HsBracketOut (HsBracket Name)      -- Output of the type checker is the *original*
@@ -220,13 +221,28 @@ data HsExpr id
        (Maybe Fixity)  -- fixity (filled in by the renamer), for forms that
                        -- were converted from OpApp's by the renamer
        [LHsCmdTop id]  -- argument commands
-\end{code}
 
 
-These constructors only appear temporarily in the parser.
-The renamer translates them into the Right Thing.
+  ---------------------------------------
+  -- Haskell program coverage (Hpc) Support
+
+  | HsTick 
+     Int                               -- module-local tick number
+     (LHsExpr id)                      -- sub-expression
+
+  | HsBinTick
+     Int                               -- module-local tick number for True
+     Int                               -- module-local tick number for False
+     (LHsExpr id)                      -- sub-expression
+
+  | HsTickPragma                       -- A pragma introduced tick
+     (FastString,(Int,Int),(Int,Int))   -- external span for this tick    
+     (LHsExpr id)     
+
+  ---------------------------------------
+  -- These constructors only appear temporarily in the parser.
+  -- The renamer translates them into the Right Thing.
 
-\begin{code}
   | EWildPat                   -- wildcard
 
   | EAsPat     (Located id)    -- as pattern
@@ -235,12 +251,11 @@ The renamer translates them into the Right Thing.
   | ELazyPat   (LHsExpr id) -- ~ pattern
 
   | HsType      (LHsType id)     -- Explicit type argument; e.g  f {| Int |} x y
-\end{code}
 
-Everything from here on appears only in typechecker output.
+  ---------------------------------------
+  -- Finally, HsWrap appears only in typechecker output
 
-\begin{code}
-  |  HsCoerce  ExprCoFn        -- TRANSLATION
+  |  HsWrap    HsWrapper       -- TRANSLATION
                (HsExpr id)
 
 type PendingSplice = (Name, LHsExpr Id)        -- Typechecked splices, waiting to be 
@@ -259,10 +274,14 @@ instance OutputableBndr id => Outputable (HsExpr id) where
 \end{code}
 
 \begin{code}
+-- pprExpr and pprLExpr call pprDeeper; 
+-- the underscore versions do not
 pprExpr :: OutputableBndr id => HsExpr id -> SDoc
-
 pprExpr  e = pprDeeper (ppr_expr e)
 
+pprLExpr :: OutputableBndr id => LHsExpr id -> SDoc
+pprLExpr e = pprDeeper (ppr_expr (unLoc e))
+
 pprBinds :: OutputableBndr id => HsLocalBinds id -> SDoc
 pprBinds b = pprDeeper (ppr b)
 
@@ -349,13 +368,13 @@ ppr_expr (HsLet binds expr)
 ppr_expr (HsDo do_or_list_comp stmts body _) = pprDo do_or_list_comp stmts body
 
 ppr_expr (ExplicitList _ exprs)
-  = brackets (fsep (punctuate comma (map ppr_lexpr exprs)))
+  = brackets (pprDeeperList fsep (punctuate comma (map ppr_lexpr exprs)))
 
 ppr_expr (ExplicitPArr _ exprs)
-  = pa_brackets (fsep (punctuate comma (map ppr_lexpr exprs)))
+  = pa_brackets (pprDeeperList fsep (punctuate comma (map ppr_lexpr exprs)))
 
 ppr_expr (ExplicitTuple exprs boxity)
-  = tupleParens boxity (sep (punctuate comma (map ppr_lexpr exprs)))
+  = tupleParens boxity (pprDeeperList sep (punctuate comma (map ppr_lexpr exprs)))
 
 ppr_expr (RecordCon con_id con_expr rbinds)
   = pp_rbinds (ppr con_id) rbinds
@@ -380,7 +399,7 @@ ppr_expr (EAsPat v e) = ppr v <> char '@' <> pprParendExpr e
 ppr_expr (HsSCC lbl expr)
   = sep [ ptext SLIT("_scc_") <+> doubleQuotes (ftext lbl), pprParendExpr expr ]
 
-ppr_expr (HsCoerce co_fn e) = pprCoFn (ppr_expr e) co_fn
+ppr_expr (HsWrap co_fn e) = pprHsWrapper (ppr_expr e) co_fn
 ppr_expr (HsType id)       = ppr id
 
 ppr_expr (HsSpliceE s)       = pprSplice s
@@ -391,6 +410,18 @@ ppr_expr (HsBracketOut e ps) = ppr e $$ ptext SLIT("pending") <+> ppr ps
 ppr_expr (HsProc pat (L _ (HsCmdTop cmd _ _ _)))
   = hsep [ptext SLIT("proc"), ppr pat, ptext SLIT("->"), ppr cmd]
 
+ppr_expr (HsTick tickId exp)
+  = hcat [ptext SLIT("tick<"), ppr tickId,ptext SLIT(">("), ppr exp,ptext SLIT(")")]
+ppr_expr (HsBinTick tickIdTrue tickIdFalse exp)
+  = hcat [ptext SLIT("bintick<"), 
+         ppr tickIdTrue,
+         ptext SLIT(","),
+         ppr tickIdFalse,
+         ptext SLIT(">("), 
+         ppr exp,ptext SLIT(")")]
+ppr_expr (HsTickPragma externalSrcLoc exp)
+  = hcat [ptext SLIT("tickpragma<"), ppr externalSrcLoc,ptext SLIT(">("), ppr exp,ptext SLIT(")")]
+
 ppr_expr (HsArrApp arrow arg _ HsFirstOrderApp True)
   = hsep [ppr_lexpr arrow, ptext SLIT("-<"), ppr_lexpr arg]
 ppr_expr (HsArrApp arrow arg _ HsFirstOrderApp False)
@@ -430,9 +461,9 @@ Parenthesize unless very simple:
 pprParendExpr :: OutputableBndr id => LHsExpr id -> SDoc
 pprParendExpr expr
   = let
-       pp_as_was = ppr_lexpr expr
-       -- Using ppr_expr here avoids the call to 'deeper'
-       -- Not sure if that's always right.
+       pp_as_was = pprLExpr expr
+       -- Using pprLExpr makes sure that we go 'deeper'
+       -- I think that is usually (always?) right
     in
     case unLoc expr of
       HsLit l          -> ppr l
@@ -446,7 +477,6 @@ pprParendExpr expr
       HsPar _          -> pp_as_was
       HsBracket _      -> pp_as_was
       HsBracketOut _ []        -> pp_as_was
-                       
       _                        -> parens pp_as_was
 \end{code}
 
@@ -527,15 +557,15 @@ data HsCmdTop id
 %************************************************************************
 
 \begin{code}
-type HsRecordBinds id = [(Located id, LHsExpr id)]
+data HsRecordBinds id = HsRecordBinds [(Located id, LHsExpr id)]
 
 recBindFields :: HsRecordBinds id -> [id]
-recBindFields rbinds = [unLoc field | (field,_) <- rbinds]
+recBindFields (HsRecordBinds rbinds) = [unLoc field | (field,_) <- rbinds]
 
 pp_rbinds :: OutputableBndr id => SDoc -> HsRecordBinds id -> SDoc
-pp_rbinds thing rbinds
+pp_rbinds thing (HsRecordBinds rbinds)
   = hang thing 
-        4 (braces (sep (punctuate comma (map (pp_rbind) rbinds))))
+        4 (braces (pprDeeperList sep (punctuate comma (map (pp_rbind) rbinds))))
   where
     pp_rbind (v, e) = hsep [pprBndr LetBind (unLoc v), char '=', ppr e]
 \end{code}
@@ -607,7 +637,9 @@ We know the list must have at least one @Match@ in it.
 
 \begin{code}
 pprMatches :: (OutputableBndr id) => HsMatchContext id -> MatchGroup id -> SDoc
-pprMatches ctxt (MatchGroup matches ty) = (ppr ty) $$ vcat (map (pprMatch ctxt) (map unLoc matches))
+pprMatches ctxt (MatchGroup matches ty) = vcat (map (pprMatch ctxt) (map unLoc matches))
+                                          -- Don't print the type; it's only 
+                                          -- a place-holder before typechecking
 
 -- Exported to HsBinds, which can't see the defn of HsMatchContext
 pprFunBind :: (OutputableBndr id) => id -> MatchGroup id -> SDoc
@@ -637,9 +669,10 @@ pprMatch ctxt (Match pats maybe_ty grhss)
 
 pprGRHSs :: OutputableBndr id => HsMatchContext id -> GRHSs id -> SDoc
 pprGRHSs ctxt (GRHSs grhss binds)
-  = vcat (map (pprGRHS ctxt . unLoc) grhss)
-    $$
-    (if isEmptyLocalBinds binds then empty
+  = pprDeeper
+    (vcat (map (pprGRHS ctxt . unLoc) grhss)
+      $$
+     if isEmptyLocalBinds binds then empty
      else text "where" $$ nest 4 (pprBinds binds))
 
 pprGRHS :: OutputableBndr id => HsMatchContext id -> GRHS id -> SDoc
@@ -762,8 +795,8 @@ pprStmt (ParStmt stmtss)          = hsep (map (\stmts -> ptext SLIT("| ") <> ppr
 pprStmt (RecStmt segment _ _ _ _) = ptext SLIT("rec") <+> braces (vcat (map ppr segment))
 
 pprDo :: OutputableBndr id => HsStmtContext any -> [LStmt id] -> LHsExpr id -> SDoc
-pprDo DoExpr      stmts body = ptext SLIT("do")  <+> (vcat (map ppr stmts) $$ ppr body)
-pprDo (MDoExpr _) stmts body = ptext SLIT("mdo") <+> (vcat (map ppr stmts) $$ ppr body)
+pprDo DoExpr      stmts body = ptext SLIT("do")  <+> pprDeeperList vcat (map ppr stmts ++ [ppr body])
+pprDo (MDoExpr _) stmts body = ptext SLIT("mdo") <+> pprDeeperList vcat (map ppr stmts ++ [ppr body])
 pprDo ListComp    stmts body = pprComp brackets    stmts body
 pprDo PArrComp    stmts body = pprComp pa_brackets stmts body
 pprDo other      stmts body = panic "pprDo"    -- PatGuard, ParStmtCxt