X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FhsSyn%2FHsBinds.lhs;h=a3d127d6b212d97f0d34e1205968cd3cc3807fbe;hb=d8a22a2b98e2ccb3a49d6524583fbad636c7d81d;hp=f5959361e5fb991fd5d5de555b51d6a99f0cc951;hpb=ff55074d483155afc78cf151e1f5469ac13b5749;p=ghc-hetmet.git diff --git a/ghc/compiler/hsSyn/HsBinds.lhs b/ghc/compiler/hsSyn/HsBinds.lhs index f595936..a3d127d 100644 --- a/ghc/compiler/hsSyn/HsBinds.lhs +++ b/ghc/compiler/hsSyn/HsBinds.lhs @@ -10,19 +10,21 @@ module HsBinds where #include "HsVersions.h" -import {-# SOURCE #-} HsExpr ( pprExpr, HsExpr ) -import {-# SOURCE #-} HsMatches ( pprMatches, Match, pprGRHSs, GRHSs ) +import {-# SOURCE #-} HsExpr ( HsExpr, pprExpr, + Match, pprFunBind, + GRHSs, pprPatBind ) -- friends: +import HsImpExp ( pprHsVar ) +import HsPat ( Pat ) import HsTypes ( HsType ) -import CoreSyn ( CoreExpr ) -import PprCore ( {- Instances -} ) +import PprCore ( {- instance Outputable (Expr a) -} ) --others: import Name ( Name ) import PrelNames ( isUnboundName ) import NameSet ( NameSet, elemNameSet, nameSetToList ) -import BasicTypes ( RecFlag(..), Fixity ) +import BasicTypes ( RecFlag(..), FixitySig(..), Activation(..), IPName ) import Outputable import SrcLoc ( SrcLoc ) import Var ( TyVar ) @@ -44,46 +46,59 @@ grammar. Collections of bindings, created by dependency analysis and translation: \begin{code} -data HsBinds id pat -- binders and bindees +data HsBinds id -- binders and bindees = EmptyBinds - - | ThenBinds (HsBinds id pat) - (HsBinds id pat) - - | MonoBind (MonoBinds id pat) - [Sig id] -- Empty on typechecker output - 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 :: HsBinds id pat -> Bool +nullBinds :: HsBinds id -> Bool nullBinds EmptyBinds = True nullBinds (ThenBinds b1 b2) = nullBinds b1 && nullBinds b2 nullBinds (MonoBind b _ _) = nullMonoBinds b +nullBinds (IPBinds b _) = null b -mkMonoBind :: MonoBinds id pat -> [Sig id] -> RecFlag -> HsBinds id pat -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} -instance (Outputable pat, Outputable id) => - Outputable (HsBinds id pat) where +instance (OutputableBndr id) => Outputable (HsBinds id) where ppr binds = ppr_binds binds ppr_binds EmptyBinds = empty ppr_binds (ThenBinds binds1 binds2) - = ($$) (ppr_binds binds1) (ppr_binds 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 [ifNotPprForUser (ptext rec_str), + = vcat [ppr_isrec, vcat (map ppr sigs), ppr bind ] where - rec_str = case is_rec of - Recursive -> SLIT("{- rec -}") - NonRecursive -> SLIT("{- nonrec -}") + ppr_isrec = getPprStyle $ \ sty -> + if userStyle sty then empty else + case is_rec of + Recursive -> ptext SLIT("{- rec -}") + NonRecursive -> ptext SLIT("{- nonrec -}") \end{code} %************************************************************************ @@ -95,37 +110,38 @@ ppr_binds (MonoBind bind sigs is_rec) Global bindings (where clauses) \begin{code} -data MonoBinds id pat +data MonoBinds id = EmptyMonoBinds - | AndMonoBinds (MonoBinds id pat) - (MonoBinds id pat) + | AndMonoBinds (MonoBinds id) + (MonoBinds id) | FunMonoBind id -- Used for both functions f x = e -- and variables f = \x -> e -- Reason: the Match stuff lets us have an optional -- result type sig f :: a->a = ...mentions a... + -- + -- This also means that instance decls can only have + -- FunMonoBinds, so if you change this, you'll need to + -- change e.g. rnMethodBinds Bool -- True => infix declaration - [Match id pat] + [Match id] SrcLoc - | PatMonoBind pat -- The pattern is never a simple variable; + | PatMonoBind (Pat id) -- The pattern is never a simple variable; -- That case is done by FunMonoBind - (GRHSs id pat) + (GRHSs id) SrcLoc | VarMonoBind id -- TRANSLATION - (HsExpr id pat) - - | CoreMonoBind id -- TRANSLATION - CoreExpr -- No zonking; this is a final CoreExpr with Ids and Types! + (HsExpr id) | AbsBinds -- Binds abstraction; TRANSLATION [TyVar] -- Type variables [id] -- Dicts [([TyVar], id, id)] -- (type variables, polymorphic, momonmorphic) triples NameSet -- Set of *polymorphic* variables that have an INLINE pragma - (MonoBinds id pat) -- The "business end" + (MonoBinds id) -- The "business end" -- Creates bindings for *new* (polymorphic, overloaded) locals -- in terms of *old* (monomorphic, non-overloaded) ones. @@ -156,23 +172,23 @@ So the desugarer tries to do a better job: (fm,gm) -> fm ..ditto for gp.. - p = /\ [a,b] -> \ [d1,d2] -> letrec DBINDS and BIND - in (fm,gm) + tp = /\ [a,b] -> \ [d1,d2] -> letrec DBINDS and BIND + in (fm,gm) \begin{code} -- We keep the invariant that a MonoBinds is only empty -- if it is exactly EmptyMonoBinds -nullMonoBinds :: MonoBinds id pat -> Bool +nullMonoBinds :: MonoBinds id -> Bool nullMonoBinds EmptyMonoBinds = True nullMonoBinds other_monobind = False -andMonoBinds :: MonoBinds id pat -> MonoBinds id pat -> MonoBinds id pat +andMonoBinds :: MonoBinds id -> MonoBinds id -> MonoBinds id andMonoBinds EmptyMonoBinds mb = mb andMonoBinds mb EmptyMonoBinds = mb andMonoBinds mb1 mb2 = AndMonoBinds mb1 mb2 -andMonoBindList :: [MonoBinds id pat] -> MonoBinds id pat +andMonoBindList :: [MonoBinds id] -> MonoBinds id andMonoBindList binds = loop1 binds where @@ -188,28 +204,21 @@ andMonoBindList binds \begin{code} -instance (Outputable id, Outputable pat) => - Outputable (MonoBinds id pat) where +instance OutputableBndr id => Outputable (MonoBinds id) where ppr mbind = ppr_monobind mbind -ppr_monobind :: (Outputable id, Outputable pat) => MonoBinds id pat -> SDoc +ppr_monobind :: OutputableBndr id => MonoBinds id -> SDoc ppr_monobind EmptyMonoBinds = empty ppr_monobind (AndMonoBinds binds1 binds2) = ppr_monobind binds1 $$ ppr_monobind binds2 -ppr_monobind (PatMonoBind pat grhss locn) - = sep [ppr pat, nest 4 (pprGRHSs False grhss)] - -ppr_monobind (FunMonoBind fun inf matches locn) - = pprMatches (False, ppr fun) matches +ppr_monobind (PatMonoBind pat grhss locn) = pprPatBind pat grhss +ppr_monobind (FunMonoBind fun inf matches locn) = pprFunBind fun matches -- ToDo: print infix if appropriate ppr_monobind (VarMonoBind name expr) - = sep [ppr name <+> equals, nest 4 (pprExpr expr)] - -ppr_monobind (CoreMonoBind name expr) - = sep [ppr name <+> equals, nest 4 (ppr expr)] + = sep [pprBndr LetBind name <+> equals, nest 4 (pprExpr expr)] ppr_monobind (AbsBinds tyvars dictvars exports inlines val_binds) = sep [ptext SLIT("AbsBinds"), @@ -218,7 +227,10 @@ ppr_monobind (AbsBinds tyvars dictvars exports inlines val_binds) brackets (sep (punctuate comma (map ppr exports))), brackets (interpp'SP (nameSetToList inlines))] $$ - nest 4 (ppr val_binds) + nest 4 ( vcat [pprBndr LetBind x | (_,x,_) <- exports] + -- Print type signatures + $$ + ppr val_binds ) \end{code} %************************************************************************ @@ -238,9 +250,9 @@ data Sig name (HsType name) SrcLoc - | ClassOpSig name -- Selector name - (Maybe (DefMeth name)) -- Nothing for source-file class signatures - -- Gives DefMeth info for interface files sigs + | ClassOpSig name -- Selector name + (DefMeth name) -- Default-method info + -- See "THE NAMING STORY" in HsDecls (HsType name) SrcLoc @@ -248,12 +260,9 @@ data Sig name (HsType name) -- ... to these types SrcLoc - | InlineSig name -- INLINE f - (Maybe Int) -- phase - SrcLoc - - | NoInlineSig name -- NOINLINE f - (Maybe Int) -- phase + | InlineSig Bool -- True <=> INLINE f, False <=> NOINLINE f + name -- Function name + Activation -- When inlining is *active* SrcLoc | SpecInstSig (HsType name) -- (Class tys); should be a specialisation of the @@ -261,28 +270,22 @@ data Sig name SrcLoc | FixSig (FixitySig name) -- Fixity declaration - - -data FixitySig name = FixitySig name Fixity SrcLoc - -instance Eq name => Eq (FixitySig name) where - (FixitySig n1 f1 _) == (FixitySig n2 f2 _) = n1==n2 && f1==f2 \end{code} \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 @@ -291,13 +294,12 @@ sigForThisGroup ns sig | otherwise -> n `elemNameSet` ns sigName :: Sig name -> Maybe name -sigName (Sig n _ _) = Just n -sigName (ClassOpSig n _ _ _) = Just n -sigName (SpecSig n _ _) = Just n -sigName (InlineSig n _ _) = Just n -sigName (NoInlineSig n _ _) = Just n -sigName (FixSig (FixitySig n _ _)) = Just n -sigName other = Nothing +sigName (Sig n _ _) = Just n +sigName (ClassOpSig n _ _ _) = Just n +sigName (SpecSig n _ _) = Just n +sigName (InlineSig _ n _ _) = Just n +sigName (FixSig (FixitySig n _ _)) = Just n +sigName other = Nothing isFixitySig :: Sig name -> Bool isFixitySig (FixSig _) = True @@ -310,20 +312,19 @@ isClassOpSig _ = False isPragSig :: Sig name -> Bool -- Identifies pragmas isPragSig (SpecSig _ _ _) = True -isPragSig (InlineSig _ _ _) = True -isPragSig (NoInlineSig _ _ _) = True +isPragSig (InlineSig _ _ _ _) = True isPragSig (SpecInstSig _ _) = True isPragSig other = False \end{code} \begin{code} -hsSigDoc (Sig _ _ loc) = (SLIT("type signature"),loc) -hsSigDoc (ClassOpSig _ _ _ loc) = (SLIT("class-method type signature"), loc) -hsSigDoc (SpecSig _ _ loc) = (SLIT("SPECIALISE pragma"),loc) -hsSigDoc (InlineSig _ _ loc) = (SLIT("INLINE pragma"),loc) -hsSigDoc (NoInlineSig _ _ loc) = (SLIT("NOINLINE pragma"),loc) -hsSigDoc (SpecInstSig _ loc) = (SLIT("SPECIALISE instance pragma"),loc) -hsSigDoc (FixSig (FixitySig _ _ loc)) = (SLIT("fixity declaration"), loc) +hsSigDoc (Sig _ _ loc) = (ptext SLIT("type signature"),loc) +hsSigDoc (ClassOpSig _ _ _ loc) = (ptext SLIT("class-method type signature"), loc) +hsSigDoc (SpecSig _ _ loc) = (ptext SLIT("SPECIALISE pragma"),loc) +hsSigDoc (InlineSig True _ _ loc) = (ptext SLIT("INLINE pragma"),loc) +hsSigDoc (InlineSig False _ _ loc) = (ptext SLIT("NOINLINE pragma"),loc) +hsSigDoc (SpecInstSig _ loc) = (ptext SLIT("SPECIALISE instance pragma"),loc) +hsSigDoc (FixSig (FixitySig _ _ loc)) = (ptext SLIT("fixity declaration"), loc) \end{code} \begin{code} @@ -335,42 +336,34 @@ ppr_sig (Sig var ty _) = sep [ppr var <+> dcolon, nest 4 (ppr ty)] ppr_sig (ClassOpSig var dm ty _) - = sep [ppr var <+> pp_dm <+> dcolon, nest 4 (ppr ty)] + = sep [ pprHsVar var <+> dcolon, + nest 4 (ppr ty), + nest 4 (pp_dm_comment) ] where pp_dm = case dm of - Just (DefMeth _) -> equals -- Default method indicator - Just GenDefMeth -> semi -- Generic method indicator - Just NoDefMeth -> empty -- No Method at all - -- Not convinced this is right... - -- Not used in interface file output hopefully - -- but needed for ddump-rn ?? - other -> dot - -- empty -- No method at all - + DefMeth _ -> equals -- Default method indicator + GenDefMeth -> semi -- Generic method indicator + NoDefMeth -> empty -- No Method at all + pp_dm_comment = case dm of + DefMeth _ -> text "{- has default method -}" + GenDefMeth -> text "{- has generic method -}" + NoDefMeth -> empty -- No Method at all ppr_sig (SpecSig var ty _) = sep [ hsep [text "{-# SPECIALIZE", ppr var, dcolon], nest 4 (ppr ty <+> text "#-}") ] -ppr_sig (InlineSig var phase _) - = hsep [text "{-# INLINE", ppr_phase phase, ppr var, text "#-}"] +ppr_sig (InlineSig True var phase _) + = hsep [text "{-# INLINE", ppr phase, ppr var, text "#-}"] -ppr_sig (NoInlineSig var phase _) - = hsep [text "{-# NOINLINE", ppr_phase phase, ppr var, text "#-}"] +ppr_sig (InlineSig False var phase _) + = hsep [text "{-# NOINLINE", ppr phase, ppr var, text "#-}"] ppr_sig (SpecInstSig ty _) = hsep [text "{-# SPECIALIZE instance", ppr ty, text "#-}"] ppr_sig (FixSig fix_sig) = ppr fix_sig - - -instance Outputable name => Outputable (FixitySig name) where - ppr (FixitySig name fixity loc) = sep [ppr fixity, ppr name] - -ppr_phase :: Maybe Int -> SDoc -ppr_phase Nothing = empty -ppr_phase (Just n) = int n \end{code} Checking for distinct signatures; oh, so boring @@ -378,15 +371,14 @@ Checking for distinct signatures; oh, so boring \begin{code} eqHsSig :: Sig Name -> Sig Name -> Bool -eqHsSig (Sig n1 _ _) (Sig n2 _ _) = n1 == n2 -eqHsSig (InlineSig n1 _ _) (InlineSig n2 _ _) = n1 == n2 -eqHsSig (NoInlineSig n1 _ _) (NoInlineSig n2 _ _) = n1 == n2 +eqHsSig (Sig n1 _ _) (Sig n2 _ _) = n1 == n2 +eqHsSig (InlineSig b1 n1 _ _)(InlineSig b2 n2 _ _) = b1 == b2 && n1 == n2 eqHsSig (SpecInstSig ty1 _) (SpecInstSig ty2 _) = ty1 == ty2 -eqHsSig (SpecSig n1 ty1 _) (SpecSig n2 ty2 _) - = -- may have many specialisations for one value; +eqHsSig (SpecSig n1 ty1 _) (SpecSig n2 ty2 _) = + -- may have many specialisations for one value; -- but not ones that are exactly the same... (n1 == n2) && (ty1 == ty2) -eqHsSig other_1 other_2 = False +eqHsSig _other1 _other2 = False \end{code}