%
+% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[PatSyntax]{Abstract Haskell syntax---patterns}
Pat(..), InPat, OutPat, LPat,
HsConDetails(..), hsConArgs,
+ HsRecField(..), mkRecField,
mkPrefixConPat, mkCharLitPat, mkNilPat, mkCoPat,
import {-# SOURCE #-} HsExpr ( SyntaxExpr )
-- friends:
-import HsBinds ( DictBinds, HsBind(..), ExprCoFn, isIdCoercion, pprCoFn,
- emptyLHsBinds, pprLHsBinds )
-import HsLit ( HsLit(HsCharPrim), HsOverLit )
-import HsTypes ( LHsType, PostTcType )
-import BasicTypes ( Boxity, tupleParens )
+import HsBinds
+import HsLit
+import HsTypes
+import HsDoc
+import BasicTypes
-- others:
import PprCore ( {- instance OutputableBndr TyVar -} )
-import TysWiredIn ( nilDataCon, charDataCon, charTy )
-import Var ( TyVar )
-import DataCon ( DataCon, dataConTyCon )
-import TyCon ( isProductTyCon )
+import TysWiredIn
+import Var
+import DataCon
+import TyCon
import Outputable
-import Type ( Type )
-import SrcLoc ( Located(..), unLoc, noLoc )
+import Type
+import SrcLoc
\end{code}
[id] -- Methods
------------ Pattern coercions (translation only) ---------------
- | CoPat ExprCoFn -- If co::t1 -> t2, p::t2,
+ | CoPat HsWrapper -- If co::t1 -> t2, p::t2,
-- then (CoPat co p) :: t1
(Pat id) -- Why not LPat? Ans: existing locn will do
Type
\begin{code}
data HsConDetails id arg
- = PrefixCon [arg] -- C p1 p2 p3
- | RecCon [(Located id, arg)] -- C { x = p1, y = p2 }
- | InfixCon arg arg -- p1 `C` p2
+ = PrefixCon [arg] -- C p1 p2 p3
+ | RecCon [HsRecField id arg] -- C { x = p1, y = p2 }
+ | InfixCon arg arg -- p1 `C` p2
+
+data HsRecField id arg = HsRecField {
+ hsRecFieldId :: Located id,
+ hsRecFieldArg :: arg,
+ hsRecFieldDoc :: Maybe (LHsDoc id)
+}
+
+mkRecField id arg = HsRecField id arg Nothing
hsConArgs :: HsConDetails id arg -> [arg]
hsConArgs (PrefixCon ps) = ps
-hsConArgs (RecCon fs) = map snd fs
+hsConArgs (RecCon fs) = map hsRecFieldArg fs
hsConArgs (InfixCon p1 p2) = [p1,p2]
\end{code}
pprPat (NPat l (Just _) _ _) = char '-' <> ppr l
pprPat (NPlusKPat n k _ _) = hcat [ppr n, char '+', ppr k]
pprPat (TypePat ty) = ptext SLIT("{|") <> ppr ty <> ptext SLIT("|}")
-pprPat (CoPat co pat _) = parens (pprCoFn (ppr pat) co)
+pprPat (CoPat co pat _) = parens (pprHsWrapper (ppr pat) co)
pprPat (SigPatIn pat ty) = ppr pat <+> dcolon <+> ppr ty
pprPat (SigPatOut pat ty) = ppr pat <+> dcolon <+> ppr ty
pprPat (DictPat ds ms) = parens (sep [ptext SLIT("{-dict-}"),
pprConArgs (InfixCon p1 p2) = interppSP [p1,p2]
pprConArgs (RecCon rpats) = braces (hsep (punctuate comma (map (pp_rpat) rpats)))
where
- pp_rpat (v, p) = hsep [ppr v, char '=', ppr p]
-
+ pp_rpat (HsRecField v p _d) =
+ hsep [ppr v, char '=', ppr p]
-- add parallel array brackets around a document
--
pabrackets :: SDoc -> SDoc
pabrackets p = ptext SLIT("[:") <> p <> ptext SLIT(":]")
+
+instance (OutputableBndr id, Outputable arg) =>
+ Outputable (HsRecField id arg) where
+ ppr (HsRecField n ty doc) = ppr n <+> dcolon <+> ppr ty <+> ppr_mbDoc doc
\end{code}
mkCharLitPat :: Char -> OutPat id
mkCharLitPat c = mkPrefixConPat charDataCon [noLoc $ LitPat (HsCharPrim c)] charTy
-mkCoPat :: ExprCoFn -> OutPat id -> Type -> OutPat id
+mkCoPat :: HsWrapper -> OutPat id -> Type -> OutPat id
mkCoPat co lpat@(L loc pat) ty
- | isIdCoercion co = lpat
+ | isIdHsWrapper co = lpat
| otherwise = L loc (CoPat co pat ty)
\end{code}