2 % (c) The AQUA Project, Glasgow University, 1996
4 \section[DsHsSyn]{Haskell abstract syntax---added things for desugarer}
7 #include "HsVersions.h"
13 import HsSyn ( OutPat(..), HsBinds(..), Bind(..), MonoBinds(..),
14 Sig, HsExpr, GRHSsAndBinds, Match, HsLit )
15 import TcHsSyn ( TypecheckedPat(..), TypecheckedBind(..),
16 TypecheckedMonoBinds(..) )
19 import PrelInfo ( mkListTy, mkTupleTy, unitTy )
23 Note: If @outPatType@ doesn't bear a strong resemblance to @coreExprType@,
24 then something is wrong.
26 outPatType :: TypecheckedPat -> Type
28 outPatType (WildPat ty) = ty
29 outPatType (VarPat var) = idType var
30 outPatType (LazyPat pat) = outPatType pat
31 outPatType (AsPat var pat) = idType var
32 outPatType (ConPat _ ty _) = ty
33 outPatType (ConOpPat _ _ _ ty) = ty
34 outPatType (ListPat ty _) = mkListTy ty
35 outPatType (TuplePat pats) = mkTupleTy (length pats) (map outPatType pats)
36 outPatType (RecPat _ ty _) = ty
37 outPatType (LitPat lit ty) = ty
38 outPatType (NPat lit ty _) = ty
39 outPatType (DictPat ds ms) = case (length ds_ms) of
41 1 -> idType (head ds_ms)
42 n -> mkTupleTy n (map idType ds_ms)
48 Nota bene: DsBinds relies on the fact that at least for simple
49 tuple patterns @collectTypedPatBinders@ returns the binders in
50 the same order as they appear in the tuple.
52 collectTypedBinders and collectedTypedPatBinders are the exportees.
55 collectTypedBinders :: TypecheckedBind -> [Id]
56 collectTypedBinders EmptyBind = []
57 collectTypedBinders (NonRecBind bs) = collectTypedMonoBinders bs
58 collectTypedBinders (RecBind bs) = collectTypedMonoBinders bs
60 collectTypedMonoBinders :: TypecheckedMonoBinds -> [Id]
61 collectTypedMonoBinders EmptyMonoBinds = []
62 collectTypedMonoBinders (PatMonoBind pat _ _) = collectTypedPatBinders pat
63 collectTypedMonoBinders (FunMonoBind f _ _ _) = [f]
64 collectTypedMonoBinders (VarMonoBind v _) = [v]
65 collectTypedMonoBinders (AndMonoBinds bs1 bs2)
66 = collectTypedMonoBinders bs1 ++ collectTypedMonoBinders bs2
68 collectTypedPatBinders :: TypecheckedPat -> [Id]
69 collectTypedPatBinders (VarPat var) = [var]
70 collectTypedPatBinders (LazyPat pat) = collectTypedPatBinders pat
71 collectTypedPatBinders (AsPat a pat) = a : collectTypedPatBinders pat
72 collectTypedPatBinders (ConPat _ _ pats) = concat (map collectTypedPatBinders pats)
73 collectTypedPatBinders (ConOpPat p1 _ p2 _) = collectTypedPatBinders p1 ++ collectTypedPatBinders p2
74 collectTypedPatBinders (ListPat t pats) = concat (map collectTypedPatBinders pats)
75 collectTypedPatBinders (TuplePat pats) = concat (map collectTypedPatBinders pats)
76 collectTypedPatBinders (RecPat _ _ fields) = concat (map (\ (f,pat,_) -> collectTypedPatBinders pat) fields)
77 collectTypedPatBinders (DictPat ds ms) = ds ++ ms
78 collectTypedPatBinders any_other_pat = [ {-no binders-} ]