+
+
+%************************************************************************
+%* *
+\subsection{HsMatchCtxt}
+%* *
+%************************************************************************
+
+\begin{code}
+data HsMatchContext id -- Context of a Match
+ = FunRhs id -- Function binding for f
+ | CaseAlt -- Guard on a case alternative
+ | LambdaExpr -- Pattern of a lambda
+ | ProcExpr -- Pattern of a proc
+ | PatBindRhs -- Pattern binding
+ | RecUpd -- Record update [used only in DsExpr to tell matchWrapper
+ -- what sort of runtime error message to generate]
+ | StmtCtxt (HsStmtContext id) -- Pattern of a do-stmt or list comprehension
+ deriving ()
+
+data HsStmtContext id
+ = ListComp
+ | DoExpr
+ | MDoExpr -- Recursive do-expression
+ | PArrComp -- Parallel array comprehension
+ | PatGuard (HsMatchContext id) -- Pattern guard for specified thing
+ | ParStmtCtxt (HsStmtContext id) -- A branch of a parallel stmt
+\end{code}
+
+\begin{code}
+isDoExpr :: HsStmtContext id -> Bool
+isDoExpr DoExpr = True
+isDoExpr MDoExpr = True
+isDoExpr other = False
+\end{code}
+
+\begin{code}
+matchSeparator (FunRhs _) = ptext SLIT("=")
+matchSeparator CaseAlt = ptext SLIT("->")
+matchSeparator LambdaExpr = ptext SLIT("->")
+matchSeparator ProcExpr = ptext SLIT("->")
+matchSeparator PatBindRhs = ptext SLIT("=")
+matchSeparator (StmtCtxt _) = ptext SLIT("<-")
+matchSeparator RecUpd = panic "unused"
+\end{code}
+
+\begin{code}
+pprMatchContext (FunRhs fun) = ptext SLIT("the definition of") <+> quotes (ppr fun)
+pprMatchContext CaseAlt = ptext SLIT("a case alternative")
+pprMatchContext RecUpd = ptext SLIT("a record-update construct")
+pprMatchContext PatBindRhs = ptext SLIT("a pattern binding")
+pprMatchContext LambdaExpr = ptext SLIT("a lambda abstraction")
+pprMatchContext ProcExpr = ptext SLIT("an arrow abstraction")
+pprMatchContext (StmtCtxt ctxt) = ptext SLIT("a pattern binding in") $$ pprStmtContext ctxt
+
+pprMatchRhsContext (FunRhs fun) = ptext SLIT("a right-hand side of function") <+> quotes (ppr fun)
+pprMatchRhsContext CaseAlt = ptext SLIT("the body of a case alternative")
+pprMatchRhsContext PatBindRhs = ptext SLIT("the right-hand side of a pattern binding")
+pprMatchRhsContext LambdaExpr = ptext SLIT("the body of a lambda")
+pprMatchRhsContext ProcExpr = ptext SLIT("the body of a proc")
+pprMatchRhsContext RecUpd = panic "pprMatchRhsContext"
+
+pprStmtContext (ParStmtCtxt c) = sep [ptext SLIT("a parallel branch of"), pprStmtContext c]
+pprStmtContext (PatGuard ctxt) = ptext SLIT("a pattern guard for") $$ pprMatchContext ctxt
+pprStmtContext DoExpr = ptext SLIT("a 'do' expression")
+pprStmtContext MDoExpr = ptext SLIT("an 'mdo' expression")
+pprStmtContext ListComp = ptext SLIT("a list comprehension")
+pprStmtContext PArrComp = ptext SLIT("an array comprehension")
+
+-- Used for the result statement of comprehension
+-- e.g. the 'e' in [ e | ... ]
+-- or the 'r' in f x = r
+pprStmtResultContext (PatGuard ctxt) = pprMatchRhsContext ctxt
+pprStmtResultContext other = ptext SLIT("the result of") <+> pprStmtContext other
+
+
+-- Used to generate the string for a *runtime* error message
+matchContextErrString (FunRhs fun) = "function " ++ showSDoc (ppr fun)
+matchContextErrString CaseAlt = "case"
+matchContextErrString PatBindRhs = "pattern binding"
+matchContextErrString RecUpd = "record update"
+matchContextErrString LambdaExpr = "lambda"
+matchContextErrString ProcExpr = "proc"
+matchContextErrString (StmtCtxt (ParStmtCtxt c)) = matchContextErrString (StmtCtxt c)
+matchContextErrString (StmtCtxt (PatGuard _)) = "pattern guard"
+matchContextErrString (StmtCtxt DoExpr) = "'do' expression"
+matchContextErrString (StmtCtxt MDoExpr) = "'mdo' expression"
+matchContextErrString (StmtCtxt ListComp) = "list comprehension"
+matchContextErrString (StmtCtxt PArrComp) = "array comprehension"
+\end{code}