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 ( HsExpr, pprExpr,
18 import HsImpExp ( pprHsVar )
20 import HsTypes ( HsType )
21 import CoreSyn ( CoreExpr )
22 import PprCore ( {- instance Outputable (Expr a) -} )
26 import PrelNames ( isUnboundName )
27 import NameSet ( NameSet, elemNameSet, nameSetToList )
28 import BasicTypes ( RecFlag(..), FixitySig(..), Activation(..) )
30 import SrcLoc ( SrcLoc )
32 import Class ( DefMeth (..) )
35 %************************************************************************
37 \subsection{Bindings: @HsBinds@}
39 %************************************************************************
41 The following syntax may produce new syntax which is not part of the input,
42 and which is instead a translation of the input to the typechecker.
43 Syntax translations are marked TRANSLATION in comments. New empty
44 productions are useful in development but may not appear in the final
47 Collections of bindings, created by dependency analysis and translation:
50 data HsBinds id -- binders and bindees
53 | ThenBinds (HsBinds id)
56 | MonoBind (MonoBinds id)
57 [Sig id] -- Empty on typechecker output, Type Signatures
62 nullBinds :: HsBinds id -> Bool
64 nullBinds EmptyBinds = True
65 nullBinds (ThenBinds b1 b2) = nullBinds b1 && nullBinds b2
66 nullBinds (MonoBind b _ _) = nullMonoBinds b
68 mkMonoBind :: MonoBinds id -> [Sig id] -> RecFlag -> HsBinds id
69 mkMonoBind EmptyMonoBinds _ _ = EmptyBinds
70 mkMonoBind mbinds sigs is_rec = MonoBind mbinds sigs is_rec
74 instance (OutputableBndr id) => Outputable (HsBinds id) where
75 ppr binds = ppr_binds binds
77 ppr_binds EmptyBinds = empty
78 ppr_binds (ThenBinds binds1 binds2)
79 = ppr_binds binds1 $$ ppr_binds binds2
80 ppr_binds (MonoBind bind sigs is_rec)
86 ppr_isrec = getPprStyle $ \ sty ->
87 if userStyle sty then empty else
89 Recursive -> ptext SLIT("{- rec -}")
90 NonRecursive -> ptext SLIT("{- nonrec -}")
93 %************************************************************************
95 \subsection{Bindings: @MonoBinds@}
97 %************************************************************************
99 Global bindings (where clauses)
105 | AndMonoBinds (MonoBinds id)
108 | FunMonoBind id -- Used for both functions f x = e
109 -- and variables f = \x -> e
110 -- Reason: the Match stuff lets us have an optional
111 -- result type sig f :: a->a = ...mentions a...
113 -- This also means that instance decls can only have
114 -- FunMonoBinds, so if you change this, you'll need to
115 -- change e.g. rnMethodBinds
116 Bool -- True => infix declaration
120 | PatMonoBind (Pat id) -- The pattern is never a simple variable;
121 -- That case is done by FunMonoBind
125 | VarMonoBind id -- TRANSLATION
128 | CoreMonoBind id -- TRANSLATION
129 CoreExpr -- No zonking; this is a final CoreExpr with Ids and Types!
131 | AbsBinds -- Binds abstraction; TRANSLATION
132 [TyVar] -- Type variables
134 [([TyVar], id, id)] -- (type variables, polymorphic, momonmorphic) triples
135 NameSet -- Set of *polymorphic* variables that have an INLINE pragma
136 (MonoBinds id) -- The "business end"
138 -- Creates bindings for *new* (polymorphic, overloaded) locals
139 -- in terms of *old* (monomorphic, non-overloaded) ones.
141 -- See section 9 of static semantics paper for more details.
142 -- (You can get a PhD for explaining the True Meaning
143 -- of this last construct.)
155 f1p = /\ tvs -> \ [d1,d2] -> letrec DBINDS and BIND
158 gp = ...same again, with gm instead of fm
160 This is a pretty bad translation, because it duplicates all the bindings.
161 So the desugarer tries to do a better job:
163 fp = /\ [a,b] -> \ [d1,d2] -> case tp [a,b] [d1,d2] of
167 tp = /\ [a,b] -> \ [d1,d2] -> letrec DBINDS and BIND
171 -- We keep the invariant that a MonoBinds is only empty
172 -- if it is exactly EmptyMonoBinds
174 nullMonoBinds :: MonoBinds id -> Bool
175 nullMonoBinds EmptyMonoBinds = True
176 nullMonoBinds other_monobind = False
178 andMonoBinds :: MonoBinds id -> MonoBinds id -> MonoBinds id
179 andMonoBinds EmptyMonoBinds mb = mb
180 andMonoBinds mb EmptyMonoBinds = mb
181 andMonoBinds mb1 mb2 = AndMonoBinds mb1 mb2
183 andMonoBindList :: [MonoBinds id] -> MonoBinds id
184 andMonoBindList binds
187 loop1 [] = EmptyMonoBinds
188 loop1 (EmptyMonoBinds : binds) = loop1 binds
189 loop1 (b:bs) = loop2 b bs
193 loop2 acc (EmptyMonoBinds : bs) = loop2 acc bs
194 loop2 acc (b:bs) = loop2 (acc `AndMonoBinds` b) bs
199 instance OutputableBndr id => Outputable (MonoBinds id) where
200 ppr mbind = ppr_monobind mbind
203 ppr_monobind :: OutputableBndr id => MonoBinds id -> SDoc
204 ppr_monobind EmptyMonoBinds = empty
205 ppr_monobind (AndMonoBinds binds1 binds2)
206 = ppr_monobind binds1 $$ ppr_monobind binds2
208 ppr_monobind (PatMonoBind pat grhss locn) = pprPatBind pat grhss
209 ppr_monobind (FunMonoBind fun inf matches locn) = pprFunBind fun matches
210 -- ToDo: print infix if appropriate
212 ppr_monobind (VarMonoBind name expr)
213 = sep [pprBndr LetBind name <+> equals, nest 4 (pprExpr expr)]
215 ppr_monobind (CoreMonoBind name expr)
216 = sep [pprBndr LetBind name <+> equals, nest 4 (ppr expr)]
218 ppr_monobind (AbsBinds tyvars dictvars exports inlines val_binds)
219 = sep [ptext SLIT("AbsBinds"),
220 brackets (interpp'SP tyvars),
221 brackets (interpp'SP dictvars),
222 brackets (sep (punctuate comma (map ppr exports))),
223 brackets (interpp'SP (nameSetToList inlines))]
225 nest 4 ( vcat [pprBndr LetBind x | (_,x,_) <- exports]
226 -- Print type signatures
231 %************************************************************************
233 \subsection{@Sig@: type signatures and value-modifying user pragmas}
235 %************************************************************************
237 It is convenient to lump ``value-modifying'' user-pragmas (e.g.,
238 ``specialise this function to these four types...'') in with type
239 signatures. Then all the machinery to move them into place, etc.,
244 = Sig name -- a bog-std type signature
248 | ClassOpSig name -- Selector name
249 (DefMeth name) -- Default-method info
250 -- See "THE NAMING STORY" in HsDecls
254 | SpecSig name -- specialise a function or datatype ...
255 (HsType name) -- ... to these types
258 | InlineSig Bool -- True <=> INLINE f, False <=> NOINLINE f
259 name -- Function name
260 Activation -- When inlining is *active*
263 | SpecInstSig (HsType name) -- (Class tys); should be a specialisation of the
264 -- current instance decl
267 | FixSig (FixitySig name) -- Fixity declaration
271 okBindSig :: NameSet -> Sig Name -> Bool
272 okBindSig ns (ClassOpSig _ _ _ _) = False
273 okBindSig ns sig = sigForThisGroup ns sig
275 okClsDclSig :: NameSet -> Sig Name -> Bool
276 okClsDclSig ns (Sig _ _ _) = False
277 okClsDclSig ns sig = sigForThisGroup ns sig
279 okInstDclSig :: NameSet -> Sig Name -> Bool
280 okInstDclSig ns (Sig _ _ _) = False
281 okInstDclSig ns (FixSig _) = False
282 okInstDclSig ns (SpecInstSig _ _) = True
283 okInstDclSig ns sig = sigForThisGroup ns sig
285 sigForThisGroup ns sig
286 = case sigName sig of
288 Just n | isUnboundName n -> True -- Don't complain about an unbound name again
289 | otherwise -> n `elemNameSet` ns
291 sigName :: Sig name -> Maybe name
292 sigName (Sig n _ _) = Just n
293 sigName (ClassOpSig n _ _ _) = Just n
294 sigName (SpecSig n _ _) = Just n
295 sigName (InlineSig _ n _ _) = Just n
296 sigName (FixSig (FixitySig n _ _)) = Just n
297 sigName other = Nothing
299 isFixitySig :: Sig name -> Bool
300 isFixitySig (FixSig _) = True
301 isFixitySig _ = False
303 isClassOpSig :: Sig name -> Bool
304 isClassOpSig (ClassOpSig _ _ _ _) = True
305 isClassOpSig _ = False
307 isPragSig :: Sig name -> Bool
308 -- Identifies pragmas
309 isPragSig (SpecSig _ _ _) = True
310 isPragSig (InlineSig _ _ _ _) = True
311 isPragSig (SpecInstSig _ _) = True
312 isPragSig other = False
316 hsSigDoc (Sig _ _ loc) = (ptext SLIT("type signature"),loc)
317 hsSigDoc (ClassOpSig _ _ _ loc) = (ptext SLIT("class-method type signature"), loc)
318 hsSigDoc (SpecSig _ _ loc) = (ptext SLIT("SPECIALISE pragma"),loc)
319 hsSigDoc (InlineSig True _ _ loc) = (ptext SLIT("INLINE pragma"),loc)
320 hsSigDoc (InlineSig False _ _ loc) = (ptext SLIT("NOINLINE pragma"),loc)
321 hsSigDoc (SpecInstSig _ loc) = (ptext SLIT("SPECIALISE instance pragma"),loc)
322 hsSigDoc (FixSig (FixitySig _ _ loc)) = (ptext SLIT("fixity declaration"), loc)
326 instance (Outputable name) => Outputable (Sig name) where
327 ppr sig = ppr_sig sig
329 ppr_sig :: Outputable name => Sig name -> SDoc
330 ppr_sig (Sig var ty _)
331 = sep [ppr var <+> dcolon, nest 4 (ppr ty)]
333 ppr_sig (ClassOpSig var dm ty _)
334 = sep [ pprHsVar var <+> dcolon,
336 nest 4 (pp_dm_comment) ]
339 DefMeth _ -> equals -- Default method indicator
340 GenDefMeth -> semi -- Generic method indicator
341 NoDefMeth -> empty -- No Method at all
342 pp_dm_comment = case dm of
343 DefMeth _ -> text "{- has default method -}"
344 GenDefMeth -> text "{- has generic method -}"
345 NoDefMeth -> empty -- No Method at all
347 ppr_sig (SpecSig var ty _)
348 = sep [ hsep [text "{-# SPECIALIZE", ppr var, dcolon],
349 nest 4 (ppr ty <+> text "#-}")
352 ppr_sig (InlineSig True var phase _)
353 = hsep [text "{-# INLINE", ppr phase, ppr var, text "#-}"]
355 ppr_sig (InlineSig False var phase _)
356 = hsep [text "{-# NOINLINE", ppr phase, ppr var, text "#-}"]
358 ppr_sig (SpecInstSig ty _)
359 = hsep [text "{-# SPECIALIZE instance", ppr ty, text "#-}"]
361 ppr_sig (FixSig fix_sig) = ppr fix_sig
364 Checking for distinct signatures; oh, so boring
368 eqHsSig :: Sig Name -> Sig Name -> Bool
369 eqHsSig (Sig n1 _ _) (Sig n2 _ _) = n1 == n2
370 eqHsSig (InlineSig b1 n1 _ _)(InlineSig b2 n2 _ _) = b1 == b2 && n1 == n2
372 eqHsSig (SpecInstSig ty1 _) (SpecInstSig ty2 _) = ty1 == ty2
373 eqHsSig (SpecSig n1 ty1 _) (SpecSig n2 ty2 _) =
374 -- may have many specialisations for one value;
375 -- but not ones that are exactly the same...
376 (n1 == n2) && (ty1 == ty2)
378 eqHsSig _other1 _other2 = False