#include "HsVersions.h"
-import {-# SOURCE #-} HsExpr ( pprExpr, HsExpr, pprMatches, Match, pprGRHSs, GRHSs )
+import {-# SOURCE #-} HsExpr ( HsExpr, pprExpr,
+ Match, pprFunBind,
+ GRHSs, pprPatBind )
-- friends:
+import HsImpExp ( ppr_var )
import HsTypes ( HsType )
import CoreSyn ( CoreExpr )
import PprCore ( {- instance Outputable (Expr a) -} )
import Name ( Name )
import PrelNames ( isUnboundName )
import NameSet ( NameSet, elemNameSet, nameSetToList )
-import BasicTypes ( RecFlag(..), Fixity )
+import BasicTypes ( RecFlag(..), Fixity, Activation(..) )
import Outputable
import SrcLoc ( SrcLoc )
import Var ( TyVar )
-- 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]
SrcLoc
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)
(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
| 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
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}
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 (InlineSig True _ _ loc) = (SLIT("INLINE pragma"),loc)
+hsSigDoc (InlineSig False _ _ loc) = (SLIT("NOINLINE pragma"),loc)
hsSigDoc (SpecInstSig _ loc) = (SLIT("SPECIALISE instance pragma"),loc)
hsSigDoc (FixSig (FixitySig _ _ loc)) = (SLIT("fixity declaration"), loc)
\end{code}
= sep [ppr var <+> dcolon, nest 4 (ppr ty)]
ppr_sig (ClassOpSig var dm ty _)
- = sep [ppr var <+> pp_dm <+> dcolon, nest 4 (ppr ty)]
+ = getPprStyle $ \ sty ->
+ if ifaceStyle sty
+ then sep [ ppr var <+> pp_dm <+> dcolon, nest 4 (ppr ty) ]
+ else sep [ ppr_var var <+> dcolon,
+ nest 4 (ppr ty),
+ nest 4 (pp_dm_comment) ]
where
pp_dm = case dm of
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 "#-}"]
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
\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}