[(name, InPat name, Bool)] -- True <=> source used punning
data OutPat tyvar uvar id
- = WildPat (GenType tyvar uvar) -- wild card
+ = WildPat (GenType tyvar uvar) -- wild card
| VarPat id -- variable (type is in the Id)
| ConPat Id -- Constructor is always an Id
(GenType tyvar uvar) -- the type of the pattern
- [(OutPat tyvar uvar id)]
+ [OutPat tyvar uvar id]
| ConOpPat (OutPat tyvar uvar id) -- just a special case...
Id
(GenType tyvar uvar)
| ListPat -- syntactic list
(GenType tyvar uvar) -- the type of the elements
- [(OutPat tyvar uvar id)]
+ [OutPat tyvar uvar id]
- | TuplePat [(OutPat tyvar uvar id)] -- tuple
+ | TuplePat [OutPat tyvar uvar id] -- tuple
-- UnitPat is TuplePat []
| RecPat Id -- record constructor
pprInPat sty (ListPatIn pats)
= ppBesides [ppLbrack, interpp'SP sty pats, ppRbrack]
pprInPat sty (TuplePatIn pats)
- = ppBesides [ppLparen, interpp'SP sty pats, ppRparen]
+ = ppParens (interpp'SP sty pats)
pprInPat sty (RecPatIn con rpats)
= ppBesides [ppr sty con, ppSP, ppChar '{', ppInterleave ppComma (map (pp_rpat sty) rpats), ppChar '}']
pprOutPat sty (ListPat ty pats)
= ppBesides [ppLbrack, interpp'SP sty pats, ppRbrack]
pprOutPat sty (TuplePat pats)
- = ppBesides [ppLparen, interpp'SP sty pats, ppRparen]
+ = ppParens (interpp'SP sty pats)
pprOutPat sty (RecPat con ty rpats)
= ppBesides [ppr sty con, ppChar '{', ppInterleave ppComma (map (pp_rpat sty) rpats), ppChar '}']
isConPat (ConOpPat _ _ _ _) = True
isConPat (ListPat _ _) = True
isConPat (TuplePat _) = True
+isConPat (RecPat _ _ _) = True
isConPat (DictPat ds ms) = (length ds + length ms) > 1
isConPat other = False
irrefutablePat (VarPat _) = True
irrefutablePat (LazyPat _) = True
irrefutablePat (AsPat _ pat) = irrefutablePat pat
-irrefutablePat (ConPat con tys pats) = all irrefutablePat pats && only_con con
-irrefutablePat (ConOpPat pat1 con pat2 _) = irrefutablePat pat1 && irrefutablePat pat1 && only_con con
+irrefutablePat (ConPat con tys pats) = only_con con && all irrefutablePat pats
+irrefutablePat (ConOpPat pat1 con pat2 _) = only_con con && irrefutablePat pat1 && irrefutablePat pat1
+irrefutablePat (RecPat con _ fields) = only_con con && and [ irrefutablePat pat | (_,pat,_) <- fields ]
irrefutablePat (ListPat _ _) = False
irrefutablePat (TuplePat pats) = all irrefutablePat pats
irrefutablePat (DictPat _ _) = True
collectPatBinders WildPatIn = []
collectPatBinders (VarPatIn var) = [var]
+collectPatBinders (LitPatIn _) = []
collectPatBinders (LazyPatIn pat) = collectPatBinders pat
collectPatBinders (AsPatIn a pat) = a : collectPatBinders pat
collectPatBinders (ConPatIn c pats) = concat (map collectPatBinders pats)