Make HsRecordBinds a data type instead of a synonym.
[ghc-hetmet.git] / compiler / hsSyn / HsExpr.lhs
index 2360337..d4cb80e 100644 (file)
@@ -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,11 +251,10 @@ 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}
   |  HsWrap    HsWrapper       -- TRANSLATION
                (HsExpr id)
 
@@ -391,6 +406,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)
@@ -527,13 +554,13 @@ 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))))
   where