import {-# SOURCE #-} HsPat ( LPat )
import HsTypes
-import PprCore
+import PprCore ()
import Coercion
import Type
import Name
-- Recursive by default
| ValBindsOut -- After renaming
- [(RecFlag, LHsBinds id)] -- Dependency analysed
+ [(RecFlag, LHsBinds id)] -- Dependency analysed, later bindings
+ -- in the list may depend on earlier
+ -- ones.
[LSig Name]
type LHsBinds id = Bag (LHsBind id)
-- type Int -> forall a'. a' -> a'
-- Notice that the coercion captures the free a'.
- bind_fvs :: NameSet -- After the renamer, this contains a superset of the
+ bind_fvs :: NameSet, -- After the renamer, this contains a superset of the
-- Names of the other binders in this binding group that
-- are free in the RHS of the defn
-- Before renaming, and after typechecking,
-- the field is unused; it's just an error thunk
+
+ fun_tick :: Maybe (Int,[id]) -- This is the (optional) module-local tick number.
}
| PatBind { -- The pattern is never a simple variable;
| AbsBinds { -- Binds abstraction; TRANSLATION
abs_tvs :: [TyVar],
abs_dicts :: [DictId],
- abs_exports :: [([TyVar], id, id, [Prag])], -- (tvs, poly_id, mono_id, prags)
+ abs_exports :: [([TyVar], id, id, [LPrag])], -- (tvs, poly_id, mono_id, prags)
abs_binds :: LHsBinds id -- The dictionary bindings and typechecked user bindings
-- mixed up together; you can tell the dict bindings because
-- they are all VarBinds
ppr_monobind (PatBind { pat_lhs = pat, pat_rhs = grhss }) = pprPatBind pat grhss
ppr_monobind (VarBind { var_id = var, var_rhs = rhs }) = ppr var <+> equals <+> pprExpr (unLoc rhs)
-ppr_monobind (FunBind { fun_id = fun, fun_matches = matches }) = pprFunBind (unLoc fun) matches
+ppr_monobind (FunBind { fun_id = fun,
+ fun_matches = matches,
+ fun_tick = tick }) =
+ (case tick of
+ Nothing -> empty
+ Just t -> text "-- tick id = " <> ppr t
+ ) $$ pprFunBind (unLoc fun) matches
-- ToDo: print infix if appropriate
ppr_monobind (AbsBinds { abs_tvs = tyvars, abs_dicts = dictvars,
| WpCo Coercion -- A cast: [] `cast` co
-- Guaranteedn not the identity coercion
- | WpApp Var -- [] x; the xi are dicts or coercions
- | WpTyApp Type -- [] t
- | WpLam Id -- \x. []; the xi are dicts or coercions
- | WpTyLam TyVar -- \a. []
+ | WpApp Var -- [] d the 'd' is a type-class dictionary
+ | WpTyApp Type -- [] t the 't' is a type or corecion
+ | WpLam Id -- \d. [] the 'd' is a type-class dictionary
+ | WpTyLam TyVar -- \a. [] the 'a' is a type or coercion variable
-- Non-empty bindings, so that the identity coercion
-- is always exactly WpHole
\begin{code}
type LSig name = Located (Sig name)
-data Sig name
- = TypeSig (Located name) -- A bog-std type signature
+data Sig name -- Signatures and pragmas
+ = -- An ordinary type signature
+ -- f :: Num a => a -> a
+ TypeSig (Located name) -- A bog-std type signature
(LHsType name)
- | SpecSig (Located name) -- Specialise a function or datatype ...
- (LHsType name) -- ... to these types
- InlineSpec
+ -- An ordinary fixity declaration
+ -- infixl *** 8
+ | FixSig (FixitySig name) -- Fixity declaration
+ -- An inline pragma
+ -- {#- INLINE f #-}
| InlineSig (Located name) -- Function name
InlineSpec
+ -- A specialisation pragma
+ -- {-# SPECIALISE f :: Int -> Int #-}
+ | SpecSig (Located name) -- Specialise a function or datatype ...
+ (LHsType name) -- ... to these types
+ InlineSpec
+
+ -- A specialisation pragma for instance declarations only
+ -- {-# SPECIALISE instance Eq [Int] #-}
| SpecInstSig (LHsType name) -- (Class tys); should be a specialisation of the
-- current instance decl
- | FixSig (FixitySig name) -- Fixity declaration
type LFixitySig name = Located (FixitySig name)
data FixitySig name = FixitySig (Located name) Fixity
-- A Prag conveys pragmas from the type checker to the desugarer
+type LPrag = Located Prag
data Prag
= InlinePrag
InlineSpec
(HsExpr Id) -- An expression, of the given specialised type, which
PostTcType -- specialises the polymorphic function
[Id] -- Dicts mentioned free in the expression
+ -- Apr07: I think this is pretty useless
+ -- see Note [Const rule dicts] in DsBinds
InlineSpec -- Inlining spec for the specialised function
isInlinePrag (InlinePrag _) = True
isInlinePrag prag = False
-isSpecPrag (SpecPrag _ _ _ _) = True
-isSpecPrag prag = False
+isSpecPrag (SpecPrag {}) = True
+isSpecPrag prag = False
\end{code}
\begin{code}
pprSpec :: (Outputable id, Outputable ty) => id -> ty -> InlineSpec -> SDoc
pprSpec var ty inl = sep [ptext SLIT("SPECIALIZE") <+> ppr inl <+> pprVarSig var ty]
-pprPrag :: Outputable id => id -> Prag -> SDoc
-pprPrag var (InlinePrag inl) = ppr inl <+> ppr var
-pprPrag var (SpecPrag expr ty _ inl) = pprSpec var ty inl
+pprPrag :: Outputable id => id -> LPrag -> SDoc
+pprPrag var (L _ (InlinePrag inl)) = ppr inl <+> ppr var
+pprPrag var (L _ (SpecPrag expr ty _ inl)) = pprSpec var ty inl
\end{code}