import HsImpExp ( pprHsVar )
import HsPat ( Pat )
import HsTypes ( HsType )
-import CoreSyn ( CoreExpr )
import PprCore ( {- instance Outputable (Expr a) -} )
--others:
import Name ( Name )
import PrelNames ( isUnboundName )
import NameSet ( NameSet, elemNameSet, nameSetToList )
-import BasicTypes ( RecFlag(..), FixitySig(..), Activation(..) )
+import BasicTypes ( RecFlag(..), FixitySig(..), Activation(..), IPName )
import Outputable
import SrcLoc ( SrcLoc )
import Var ( TyVar )
\begin{code}
data HsBinds id -- binders and bindees
= EmptyBinds
-
- | ThenBinds (HsBinds id)
- (HsBinds id)
-
- | MonoBind (MonoBinds id)
- [Sig id] -- Empty on typechecker output, Type Signatures
- RecFlag
+ | ThenBinds (HsBinds id) (HsBinds id)
+
+ | MonoBind -- A mutually recursive group
+ (MonoBinds id)
+ [Sig id] -- Empty on typechecker output, Type Signatures
+ RecFlag
+
+ | IPBinds -- Implcit parameters
+ -- Not allowed at top level
+ [(IPName id, HsExpr id)]
+ Bool -- True <=> this was a 'with' binding
+ -- (tmp, until 'with' is removed)
\end{code}
\begin{code}
nullBinds EmptyBinds = True
nullBinds (ThenBinds b1 b2) = nullBinds b1 && nullBinds b2
nullBinds (MonoBind b _ _) = nullMonoBinds b
+nullBinds (IPBinds b _) = null b
-mkMonoBind :: MonoBinds id -> [Sig id] -> RecFlag -> HsBinds id
-mkMonoBind EmptyMonoBinds _ _ = EmptyBinds
-mkMonoBind mbinds sigs is_rec = MonoBind mbinds sigs is_rec
+mkMonoBind :: RecFlag -> MonoBinds id -> HsBinds id
+mkMonoBind _ EmptyMonoBinds = EmptyBinds
+mkMonoBind is_rec mbinds = MonoBind mbinds [] is_rec
\end{code}
\begin{code}
ppr_binds EmptyBinds = empty
ppr_binds (ThenBinds binds1 binds2)
= ppr_binds binds1 $$ ppr_binds binds2
+
+ppr_binds (IPBinds binds is_with)
+ = sep (punctuate semi (map pp_item binds))
+ where
+ pp_item (id,rhs) = pprBndr LetBind id <+> equals <+> pprExpr rhs
+
ppr_binds (MonoBind bind sigs is_rec)
= vcat [ppr_isrec,
vcat (map ppr sigs),
| VarMonoBind id -- TRANSLATION
(HsExpr id)
- | CoreMonoBind id -- TRANSLATION
- CoreExpr -- No zonking; this is a final CoreExpr with Ids and Types!
-
| AbsBinds -- Binds abstraction; TRANSLATION
[TyVar] -- Type variables
[id] -- Dicts
ppr_monobind (VarMonoBind name expr)
= sep [pprBndr LetBind name <+> equals, nest 4 (pprExpr expr)]
-ppr_monobind (CoreMonoBind name expr)
- = sep [pprBndr LetBind name <+> equals, nest 4 (ppr expr)]
-
ppr_monobind (AbsBinds tyvars dictvars exports inlines val_binds)
= sep [ptext SLIT("AbsBinds"),
brackets (interpp'SP tyvars),
\begin{code}
okBindSig :: NameSet -> Sig Name -> Bool
-okBindSig ns (ClassOpSig _ _ _ _) = False
-okBindSig ns sig = sigForThisGroup ns sig
+okBindSig ns (ClassOpSig _ _ _ _) = False
+okBindSig ns sig = sigForThisGroup ns sig
okClsDclSig :: NameSet -> Sig Name -> Bool
-okClsDclSig ns (Sig _ _ _) = False
-okClsDclSig ns sig = sigForThisGroup ns sig
+okClsDclSig ns (Sig _ _ _) = False
+okClsDclSig ns sig = sigForThisGroup ns sig
okInstDclSig :: NameSet -> Sig Name -> Bool
-okInstDclSig ns (Sig _ _ _) = False
-okInstDclSig ns (FixSig _) = False
-okInstDclSig ns (SpecInstSig _ _) = True
-okInstDclSig ns sig = sigForThisGroup ns sig
+okInstDclSig ns (Sig _ _ _) = False
+okInstDclSig ns (FixSig _) = False
+okInstDclSig ns (SpecInstSig _ _) = True
+okInstDclSig ns sig = sigForThisGroup ns sig
sigForThisGroup ns sig
= case sigName sig of