2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[HsBinds]{Abstract syntax: top-level bindings and signatures}
6 Datatype for: @HsBinds@, @Bind@, @Sig@, @MonoBinds@.
11 #include "HsVersions.h"
13 import {-# SOURCE #-} HsExpr ( pprExpr, HsExpr )
14 import {-# SOURCE #-} HsMatches ( pprMatches, Match, pprGRHSs, GRHSs )
17 import HsTypes ( HsType )
18 import HsImpExp ( IE(..), ieName )
19 import CoreSyn ( CoreExpr )
20 import PprCore () -- Instances for Outputable
24 import NameSet ( NameSet, nameSetToList )
25 import BasicTypes ( RecFlag(..), Fixity )
28 import SrcLoc ( SrcLoc )
32 %************************************************************************
34 \subsection{Bindings: @HsBinds@}
36 %************************************************************************
38 The following syntax may produce new syntax which is not part of the input,
39 and which is instead a translation of the input to the typechecker.
40 Syntax translations are marked TRANSLATION in comments. New empty
41 productions are useful in development but may not appear in the final
44 Collections of bindings, created by dependency analysis and translation:
47 data HsBinds id pat -- binders and bindees
50 | ThenBinds (HsBinds id pat)
53 | MonoBind (MonoBinds id pat)
54 [Sig id] -- Empty on typechecker output
59 nullBinds :: HsBinds id pat -> Bool
61 nullBinds EmptyBinds = True
62 nullBinds (ThenBinds b1 b2) = nullBinds b1 && nullBinds b2
63 nullBinds (MonoBind b _ _) = nullMonoBinds b
65 mkMonoBind :: MonoBinds id pat -> [Sig id] -> RecFlag -> HsBinds id pat
66 mkMonoBind EmptyMonoBinds _ _ = EmptyBinds
67 mkMonoBind mbinds sigs is_rec = MonoBind mbinds sigs is_rec
71 instance (Outputable pat, Outputable id) =>
72 Outputable (HsBinds id pat) where
73 ppr binds = ppr_binds binds
75 ppr_binds EmptyBinds = empty
76 ppr_binds (ThenBinds binds1 binds2)
77 = ($$) (ppr_binds binds1) (ppr_binds binds2)
78 ppr_binds (MonoBind bind sigs is_rec)
79 = vcat [ifNotPprForUser (ptext rec_str),
84 rec_str = case is_rec of
85 Recursive -> SLIT("{- rec -}")
86 NonRecursive -> SLIT("{- nonrec -}")
89 %************************************************************************
91 \subsection{Bindings: @MonoBinds@}
93 %************************************************************************
95 Global bindings (where clauses)
101 | AndMonoBinds (MonoBinds id pat)
109 Bool -- True => infix declaration
113 | VarMonoBind id -- TRANSLATION
116 | CoreMonoBind id -- TRANSLATION
117 CoreExpr -- No zonking; this is a final CoreExpr with Ids and Types!
119 | AbsBinds -- Binds abstraction; TRANSLATION
120 [TyVar] -- Type variables
122 [([TyVar], id, id)] -- (type variables, polymorphic, momonmorphic) triples
123 NameSet -- Set of *polymorphic* variables that have an INLINE pragma
124 (MonoBinds id pat) -- The "business end"
126 -- Creates bindings for *new* (polymorphic, overloaded) locals
127 -- in terms of *old* (monomorphic, non-overloaded) ones.
129 -- See section 9 of static semantics paper for more details.
130 -- (You can get a PhD for explaining the True Meaning
131 -- of this last construct.)
143 f1p = /\ tvs -> \ [d1,d2] -> letrec DBINDS and BIND
146 gp = ...same again, with gm instead of fm
148 This is a pretty bad translation, because it duplicates all the bindings.
149 So the desugarer tries to do a better job:
151 fp = /\ [a,b] -> \ [d1,d2] -> case tp [a,b] [d1,d2] of
155 p = /\ [a,b] -> \ [d1,d2] -> letrec DBINDS and BIND
159 -- We keep the invariant that a MonoBinds is only empty
160 -- if it is exactly EmptyMonoBinds
162 nullMonoBinds :: MonoBinds id pat -> Bool
163 nullMonoBinds EmptyMonoBinds = True
164 nullMonoBinds other_monobind = False
166 andMonoBinds :: MonoBinds id pat -> MonoBinds id pat -> MonoBinds id pat
167 andMonoBinds EmptyMonoBinds mb = mb
168 andMonoBinds mb EmptyMonoBinds = mb
169 andMonoBinds mb1 mb2 = AndMonoBinds mb1 mb2
171 andMonoBindList :: [MonoBinds id pat] -> MonoBinds id pat
172 andMonoBindList binds
175 loop1 [] = EmptyMonoBinds
176 loop1 (EmptyMonoBinds : binds) = loop1 binds
177 loop1 (b:bs) = loop2 b bs
181 loop2 acc (EmptyMonoBinds : bs) = loop2 acc bs
182 loop2 acc (b:bs) = loop2 (acc `AndMonoBinds` b) bs
186 instance (Outputable id, Outputable pat) =>
187 Outputable (MonoBinds id pat) where
188 ppr mbind = ppr_monobind mbind
191 ppr_monobind :: (Outputable id, Outputable pat) => MonoBinds id pat -> SDoc
192 ppr_monobind EmptyMonoBinds = empty
193 ppr_monobind (AndMonoBinds binds1 binds2)
194 = ppr_monobind binds1 $$ ppr_monobind binds2
196 ppr_monobind (PatMonoBind pat grhss locn)
197 = sep [ppr pat, nest 4 (pprGRHSs False grhss)]
199 ppr_monobind (FunMonoBind fun inf matches locn)
200 = pprMatches (False, ppr fun) matches
201 -- ToDo: print infix if appropriate
203 ppr_monobind (VarMonoBind name expr)
204 = sep [ppr name <+> equals, nest 4 (pprExpr expr)]
206 ppr_monobind (CoreMonoBind name expr)
207 = sep [ppr name <+> equals, nest 4 (ppr expr)]
209 ppr_monobind (AbsBinds tyvars dictvars exports inlines val_binds)
210 = sep [ptext SLIT("AbsBinds"),
211 brackets (interpp'SP tyvars),
212 brackets (interpp'SP dictvars),
213 brackets (sep (punctuate comma (map ppr exports))),
214 brackets (interpp'SP (nameSetToList inlines))]
216 nest 4 (ppr val_binds)
219 %************************************************************************
221 \subsection{@Sig@: type signatures and value-modifying user pragmas}
223 %************************************************************************
225 It is convenient to lump ``value-modifying'' user-pragmas (e.g.,
226 ``specialise this function to these four types...'') in with type
227 signatures. Then all the machinery to move them into place, etc.,
232 = Sig name -- a bog-std type signature
236 | ClassOpSig name -- Selector name
237 name -- Default-method name (if any)
238 Bool -- True <=> there is an explicit, programmer-supplied
239 -- default declaration in the class decl
243 | SpecSig name -- specialise a function or datatype ...
244 (HsType name) -- ... to these types
247 | InlineSig name -- INLINE f
251 | NoInlineSig name -- NOINLINE f
255 | SpecInstSig (HsType name) -- (Class tys); should be a specialisation of the
256 -- current instance decl
259 | FixSig (FixitySig name) -- Fixity declaration
261 | DeprecSig (Deprecation name) -- DEPRECATED
265 data FixitySig name = FixitySig name Fixity SrcLoc
267 -- We use exported entities for things to deprecate. Cunning trick (hack?):
268 -- `IEModuleContents undefined' is used for module deprecation.
269 data Deprecation name = Deprecation (IE name) DeprecTxt
271 type DeprecTxt = FAST_STRING -- reason/explanation for deprecation
275 sigsForMe :: (name -> Bool) -> [Sig name] -> [Sig name]
277 = filter sig_for_me sigs
279 sig_for_me (Sig n _ _) = f n
280 sig_for_me (ClassOpSig n _ _ _ _) = f n
281 sig_for_me (SpecSig n _ _) = f n
282 sig_for_me (InlineSig n _ _) = f n
283 sig_for_me (NoInlineSig n _ _) = f n
284 sig_for_me (SpecInstSig _ _) = False
285 sig_for_me (FixSig (FixitySig n _ _)) = f n
287 (DeprecSig (Deprecation (IEModuleContents _) _) _) = False
289 (DeprecSig (Deprecation d _) _) = f (ieName d)
291 isFixitySig :: Sig name -> Bool
292 isFixitySig (FixSig _) = True
293 isFixitySig _ = False
295 isClassOpSig :: Sig name -> Bool
296 isClassOpSig (ClassOpSig _ _ _ _ _) = True
297 isClassOpSig _ = False
299 isPragSig :: Sig name -> Bool
300 -- Identifies pragmas
301 isPragSig (SpecSig _ _ _) = True
302 isPragSig (InlineSig _ _ _) = True
303 isPragSig (NoInlineSig _ _ _) = True
304 isPragSig (SpecInstSig _ _) = True
305 isPragSig (DeprecSig _ _) = True
306 isPragSig other = False
310 instance (Outputable name) => Outputable (Sig name) where
311 ppr sig = ppr_sig sig
313 ppr_sig :: Outputable name => Sig name -> SDoc
314 ppr_sig (Sig var ty _)
315 = sep [ppr var <+> dcolon, nest 4 (ppr ty)]
317 ppr_sig (ClassOpSig var _ _ ty _)
318 = sep [ppr var <+> dcolon, nest 4 (ppr ty)]
320 ppr_sig (SpecSig var ty _)
321 = sep [ hsep [text "{-# SPECIALIZE", ppr var, dcolon],
322 nest 4 (ppr ty <+> text "#-}")
325 ppr_sig (InlineSig var phase _)
326 = hsep [text "{-# INLINE", ppr_phase phase, ppr var, text "#-}"]
328 ppr_sig (NoInlineSig var phase _)
329 = hsep [text "{-# NOINLINE", ppr_phase phase, ppr var, text "#-}"]
331 ppr_sig (SpecInstSig ty _)
332 = hsep [text "{-# SPECIALIZE instance", ppr ty, text "#-}"]
334 ppr_sig (FixSig fix_sig) = ppr fix_sig
336 ppr_sig (DeprecSig deprec _) = ppr deprec
338 instance Outputable name => Outputable (FixitySig name) where
339 ppr (FixitySig name fixity loc) = sep [ppr fixity, ppr name]
341 instance Outputable name => Outputable (Deprecation name) where
342 ppr (Deprecation (IEModuleContents _) txt)
343 = hsep [text "{-# DEPRECATED", doubleQuotes (ppr txt), text "#-}"]
344 ppr (Deprecation thing txt)
345 = hsep [text "{-# DEPRECATED", ppr thing, doubleQuotes (ppr txt), text "#-}"]
347 ppr_phase :: Maybe Int -> SDoc
348 ppr_phase Nothing = empty
349 ppr_phase (Just n) = int n