+-- always a breakpoint tick, maybe an HPC tick
+addTickLHsExprBreakAlways :: LHsExpr Id -> TM (LHsExpr Id)
+addTickLHsExprBreakAlways e
+ | opt_Hpc = addTickLHsExpr e
+ | otherwise = addTickLHsExprAlways e
+
+-- selectively add ticks to interesting expressions
+addTickLHsExpr :: LHsExpr Id -> TM (LHsExpr Id)
+addTickLHsExpr (L pos e0) = do
+ e1 <- addTickHsExpr e0
+ if opt_Hpc || isGoodBreakExpr e0
+ then do
+ fn <- allocTickBox ExpBox pos
+ return $ fn $ L pos e1
+ else
+ return $ L pos e1
+
+-- general heuristic: expressions which do not denote values are good break points
+isGoodBreakExpr :: HsExpr Id -> Bool
+isGoodBreakExpr (HsApp {}) = True
+isGoodBreakExpr (OpApp {}) = True
+isGoodBreakExpr (NegApp {}) = True
+isGoodBreakExpr (HsCase {}) = True
+isGoodBreakExpr (HsIf {}) = True
+isGoodBreakExpr (RecordCon {}) = True
+isGoodBreakExpr (RecordUpd {}) = True
+isGoodBreakExpr (ArithSeq {}) = True
+isGoodBreakExpr (PArrSeq {}) = True
+isGoodBreakExpr other = False
+