%
+% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[PatSyntax]{Abstract Haskell syntax---patterns}
import {-# SOURCE #-} HsExpr ( SyntaxExpr )
-- friends:
-import HsBinds ( DictBinds, HsBind(..), HsWrapper, isIdHsWrapper, pprHsWrapper,
- emptyLHsBinds, pprLHsBinds )
-import HsLit ( HsLit(HsCharPrim), HsOverLit )
-import HsTypes ( LHsType, PostTcType )
-import HsDoc ( LHsDoc, ppr_mbDoc )
-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}
data Pat id
= ------------ Simple patterns ---------------
WildPat PostTcType -- Wild card
+ -- The sole reason for a type on a WildPat is to
+ -- support hsPatType :: Pat Id -> Type
+
| VarPat id -- Variable
| VarPatOut id (DictBinds id) -- Used only for overloaded Ids; the
-- bindings give its overloaded instances
| SigPatOut (LPat id) -- Pattern with a type signature
Type
- ------------ Dictionary patterns (translation only) ---------------
- | DictPat -- Used when destructing Dictionaries with an explicit case
- [id] -- Superclass dicts
- [id] -- Methods
-
------------ Pattern coercions (translation only) ---------------
| CoPat HsWrapper -- If co::t1 -> t2, p::t2,
-- then (CoPat co p) :: t1
(Pat id) -- Why not LPat? Ans: existing locn will do
- Type
+ Type -- Type of whole pattern, t1
-- During desugaring a (CoPat co pat) turns into a cast with 'co' on
-- the scrutinee, followed by a match on 'pat'
\end{code}
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-}"),
- brackets (interpp'SP ds),
- brackets (interpp'SP ms)])
pprUserCon c (InfixCon p1 p2) = ppr p1 <+> ppr c <+> ppr p2
pprUserCon c details = ppr c <+> pprConArgs details
pprConArgs (InfixCon p1 p2) = interppSP [p1,p2]
pprConArgs (RecCon rpats) = braces (hsep (punctuate comma (map (pp_rpat) rpats)))
where
- pp_rpat (HsRecField v p d) =
- hsep [ppr d, ppr v, char '=', ppr p]
+ pp_rpat (HsRecField v p _d) =
+ hsep [ppr v, char '=', ppr p]
-- add parallel array brackets around a document
--
isConPat (ListPat {}) = True
isConPat (PArrPat {}) = True
isConPat (TuplePat {}) = True
-isConPat (DictPat ds ms) = (length ds + length ms) > 1
isConPat other = False
isSigPat (SigPatIn _ _) = True
go1 (NPlusKPat _ _ _ _) = False
go1 (TypePat _) = panic "isIrrefutableHsPat: type pattern"
- go1 (DictPat _ _) = panic "isIrrefutableHsPat: type pattern"
\end{code}