[project @ 2000-11-10 15:12:50 by simonpj]
[ghc-hetmet.git] / ghc / compiler / hsSyn / HsBinds.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[HsBinds]{Abstract syntax: top-level bindings and signatures}
5
6 Datatype for: @HsBinds@, @Bind@, @Sig@, @MonoBinds@.
7
8 \begin{code}
9 module HsBinds where
10
11 #include "HsVersions.h"
12
13 import {-# SOURCE #-} HsExpr    ( pprExpr, HsExpr )
14 import {-# SOURCE #-} HsMatches ( pprMatches, Match, pprGRHSs, GRHSs )
15
16 -- friends:
17 import HsTypes          ( HsType )
18 import CoreSyn          ( CoreExpr )
19 import PprCore          ( {- instance Outputable (Expr a) -} )
20
21 --others:
22 import Name             ( Name )
23 import PrelNames        ( isUnboundName )
24 import NameSet          ( NameSet, elemNameSet, nameSetToList )
25 import BasicTypes       ( RecFlag(..), Fixity )
26 import Outputable       
27 import SrcLoc           ( SrcLoc )
28 import Var              ( TyVar )
29 import Class            ( DefMeth (..) )
30 \end{code}
31
32 %************************************************************************
33 %*                                                                      *
34 \subsection{Bindings: @HsBinds@}
35 %*                                                                      *
36 %************************************************************************
37
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
42 grammar.
43
44 Collections of bindings, created by dependency analysis and translation:
45
46 \begin{code}
47 data HsBinds id pat             -- binders and bindees
48   = EmptyBinds
49
50   | ThenBinds   (HsBinds id pat)
51                 (HsBinds id pat)
52
53   | MonoBind    (MonoBinds id pat)
54                 [Sig id]                -- Empty on typechecker output
55                 RecFlag
56 \end{code}
57
58 \begin{code}
59 nullBinds :: HsBinds id pat -> Bool
60
61 nullBinds EmptyBinds            = True
62 nullBinds (ThenBinds b1 b2)     = nullBinds b1 && nullBinds b2
63 nullBinds (MonoBind b _ _)      = nullMonoBinds b
64
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
68 \end{code}
69
70 \begin{code}
71 instance (Outputable pat, Outputable id) =>
72                 Outputable (HsBinds id pat) where
73     ppr binds = ppr_binds binds
74
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 [ppr_isrec,
80              vcat (map ppr sigs),
81              ppr bind
82        ]
83      where
84        ppr_isrec = getPprStyle $ \ sty -> 
85                    if userStyle sty then empty else
86                    case is_rec of
87                         Recursive    -> ptext SLIT("{- rec -}")
88                         NonRecursive -> ptext SLIT("{- nonrec -}")
89 \end{code}
90
91 %************************************************************************
92 %*                                                                      *
93 \subsection{Bindings: @MonoBinds@}
94 %*                                                                      *
95 %************************************************************************
96
97 Global bindings (where clauses)
98
99 \begin{code}
100 data MonoBinds id pat
101   = EmptyMonoBinds
102
103   | AndMonoBinds    (MonoBinds id pat)
104                     (MonoBinds id pat)
105
106   | FunMonoBind     id          -- Used for both functions      f x = e
107                                 -- and variables                f = \x -> e
108                                 -- Reason: the Match stuff lets us have an optional
109                                 --         result type sig      f :: a->a = ...mentions a...
110                     Bool                -- True => infix declaration
111                     [Match id pat]
112                     SrcLoc
113
114   | PatMonoBind     pat         -- The pattern is never a simple variable;
115                                 -- That case is done by FunMonoBind
116                     (GRHSs id pat)
117                     SrcLoc
118
119   | VarMonoBind     id                  -- TRANSLATION
120                     (HsExpr id pat)
121
122   | CoreMonoBind    id                  -- TRANSLATION
123                     CoreExpr            -- No zonking; this is a final CoreExpr with Ids and Types!
124
125   | AbsBinds                            -- Binds abstraction; TRANSLATION
126                 [TyVar]                 -- Type variables
127                 [id]                    -- Dicts
128                 [([TyVar], id, id)]     -- (type variables, polymorphic, momonmorphic) triples
129                 NameSet                 -- Set of *polymorphic* variables that have an INLINE pragma
130                 (MonoBinds id pat)      -- The "business end"
131
132         -- Creates bindings for *new* (polymorphic, overloaded) locals
133         -- in terms of *old* (monomorphic, non-overloaded) ones.
134         --
135         -- See section 9 of static semantics paper for more details.
136         -- (You can get a PhD for explaining the True Meaning
137         --  of this last construct.)
138 \end{code}
139
140 What AbsBinds means
141 ~~~~~~~~~~~~~~~~~~~
142          AbsBinds tvs
143                   [d1,d2]
144                   [(tvs1, f1p, f1m), 
145                    (tvs2, f2p, f2m)]
146                   BIND
147 means
148
149         f1p = /\ tvs -> \ [d1,d2] -> letrec DBINDS and BIND 
150                                       in fm
151
152         gp = ...same again, with gm instead of fm
153
154 This is a pretty bad translation, because it duplicates all the bindings.
155 So the desugarer tries to do a better job:
156
157         fp = /\ [a,b] -> \ [d1,d2] -> case tp [a,b] [d1,d2] of
158                                         (fm,gm) -> fm
159         ..ditto for gp..
160
161         p = /\ [a,b] -> \ [d1,d2] -> letrec DBINDS and BIND 
162                                       in (fm,gm)
163
164 \begin{code}
165 -- We keep the invariant that a MonoBinds is only empty 
166 -- if it is exactly EmptyMonoBinds
167
168 nullMonoBinds :: MonoBinds id pat -> Bool
169 nullMonoBinds EmptyMonoBinds         = True
170 nullMonoBinds other_monobind         = False
171
172 andMonoBinds :: MonoBinds id pat -> MonoBinds id pat -> MonoBinds id pat
173 andMonoBinds EmptyMonoBinds mb = mb
174 andMonoBinds mb EmptyMonoBinds = mb
175 andMonoBinds mb1 mb2 = AndMonoBinds mb1 mb2
176
177 andMonoBindList :: [MonoBinds id pat] -> MonoBinds id pat
178 andMonoBindList binds
179   = loop1 binds
180   where
181     loop1 [] = EmptyMonoBinds
182     loop1 (EmptyMonoBinds : binds) = loop1 binds
183     loop1 (b:bs) = loop2 b bs
184
185         -- acc is non-empty
186     loop2 acc [] = acc
187     loop2 acc (EmptyMonoBinds : bs) = loop2 acc bs
188     loop2 acc (b:bs) = loop2 (acc `AndMonoBinds` b) bs
189 \end{code}
190
191
192 \begin{code}
193 instance (Outputable id, Outputable pat) =>
194                 Outputable (MonoBinds id pat) where
195     ppr mbind = ppr_monobind mbind
196
197
198 ppr_monobind :: (Outputable id, Outputable pat) => MonoBinds id pat -> SDoc
199 ppr_monobind EmptyMonoBinds = empty
200 ppr_monobind (AndMonoBinds binds1 binds2)
201       = ppr_monobind binds1 $$ ppr_monobind binds2
202
203 ppr_monobind (PatMonoBind pat grhss locn)
204       = sep [ppr pat, nest 4 (pprGRHSs False grhss)]
205
206 ppr_monobind (FunMonoBind fun inf matches locn)
207       = pprMatches (False, ppr fun) matches
208       -- ToDo: print infix if appropriate
209
210 ppr_monobind (VarMonoBind name expr)
211       = sep [ppr name <+> equals, nest 4 (pprExpr expr)]
212
213 ppr_monobind (CoreMonoBind name expr)
214       = sep [ppr name <+> equals, nest 4 (ppr expr)]
215
216 ppr_monobind (AbsBinds tyvars dictvars exports inlines val_binds)
217      = sep [ptext SLIT("AbsBinds"),
218             brackets (interpp'SP tyvars),
219             brackets (interpp'SP dictvars),
220             brackets (sep (punctuate comma (map ppr exports))),
221             brackets (interpp'SP (nameSetToList inlines))]
222        $$
223        nest 4 (ppr val_binds)
224 \end{code}
225
226 %************************************************************************
227 %*                                                                      *
228 \subsection{@Sig@: type signatures and value-modifying user pragmas}
229 %*                                                                      *
230 %************************************************************************
231
232 It is convenient to lump ``value-modifying'' user-pragmas (e.g.,
233 ``specialise this function to these four types...'') in with type
234 signatures.  Then all the machinery to move them into place, etc.,
235 serves for both.
236
237 \begin{code}
238 data Sig name
239   = Sig         name            -- a bog-std type signature
240                 (HsType name)
241                 SrcLoc
242
243   | ClassOpSig  name                    -- Selector name
244                 (Maybe (DefMeth name))  -- Nothing for source-file class signatures
245                                         -- Gives DefMeth info for interface files sigs
246                 (HsType name)
247                 SrcLoc
248
249   | SpecSig     name            -- specialise a function or datatype ...
250                 (HsType name)   -- ... to these types
251                 SrcLoc
252
253   | InlineSig   name            -- INLINE f
254                 (Maybe Int)     -- phase
255                 SrcLoc
256
257   | NoInlineSig name            -- NOINLINE f
258                 (Maybe Int)     -- phase
259                 SrcLoc
260
261   | SpecInstSig (HsType name)   -- (Class tys); should be a specialisation of the 
262                                 -- current instance decl
263                 SrcLoc
264
265   | FixSig      (FixitySig name)        -- Fixity declaration
266
267
268 data FixitySig name = FixitySig name Fixity SrcLoc 
269
270 instance Eq name => Eq (FixitySig name) where
271    (FixitySig n1 f1 _) == (FixitySig n2 f2 _) = n1==n2 && f1==f2
272 \end{code}
273
274 \begin{code}
275 okBindSig :: NameSet -> Sig Name -> Bool
276 okBindSig ns (ClassOpSig _ _ _ _)                               = False
277 okBindSig ns sig = sigForThisGroup ns sig
278
279 okClsDclSig :: NameSet -> Sig Name -> Bool
280 okClsDclSig ns (Sig _ _ _)                                        = False
281 okClsDclSig ns sig = sigForThisGroup ns sig
282
283 okInstDclSig :: NameSet -> Sig Name -> Bool
284 okInstDclSig ns (Sig _ _ _)                                        = False
285 okInstDclSig ns (FixSig _)                                         = False
286 okInstDclSig ns (SpecInstSig _ _)                                  = True
287 okInstDclSig ns sig = sigForThisGroup ns sig
288
289 sigForThisGroup ns sig 
290   = case sigName sig of
291         Nothing                  -> False
292         Just n | isUnboundName n -> True        -- Don't complain about an unbound name again
293                | otherwise       -> n `elemNameSet` ns
294
295 sigName :: Sig name -> Maybe name
296 sigName (Sig         n _ _)             = Just n
297 sigName (ClassOpSig  n _ _ _)           = Just n
298 sigName (SpecSig     n _ _)             = Just n
299 sigName (InlineSig   n _   _)           = Just n
300 sigName (NoInlineSig n _   _)           = Just n
301 sigName (FixSig (FixitySig n _ _))      = Just n
302 sigName other                           = Nothing
303
304 isFixitySig :: Sig name -> Bool
305 isFixitySig (FixSig _) = True
306 isFixitySig _          = False
307
308 isClassOpSig :: Sig name -> Bool
309 isClassOpSig (ClassOpSig _ _ _ _) = True
310 isClassOpSig _                    = False
311
312 isPragSig :: Sig name -> Bool
313         -- Identifies pragmas 
314 isPragSig (SpecSig _ _ _)     = True
315 isPragSig (InlineSig   _ _ _) = True
316 isPragSig (NoInlineSig _ _ _) = True
317 isPragSig (SpecInstSig _ _)   = True
318 isPragSig other               = False
319 \end{code}
320
321 \begin{code}
322 hsSigDoc (Sig        _ _ loc)         = (SLIT("type signature"),loc)
323 hsSigDoc (ClassOpSig _ _ _ loc)       = (SLIT("class-method type signature"), loc)
324 hsSigDoc (SpecSig    _ _ loc)         = (SLIT("SPECIALISE pragma"),loc)
325 hsSigDoc (InlineSig  _ _    loc)      = (SLIT("INLINE pragma"),loc)
326 hsSigDoc (NoInlineSig  _ _  loc)      = (SLIT("NOINLINE pragma"),loc)
327 hsSigDoc (SpecInstSig _ loc)          = (SLIT("SPECIALISE instance pragma"),loc)
328 hsSigDoc (FixSig (FixitySig _ _ loc)) = (SLIT("fixity declaration"), loc)
329 \end{code}
330
331 \begin{code}
332 instance (Outputable name) => Outputable (Sig name) where
333     ppr sig = ppr_sig sig
334
335 ppr_sig :: Outputable name => Sig name -> SDoc
336 ppr_sig (Sig var ty _)
337       = sep [ppr var <+> dcolon, nest 4 (ppr ty)]
338
339 ppr_sig (ClassOpSig var dm ty _)
340       = sep [ppr var <+> pp_dm <+> dcolon, nest 4 (ppr ty)]
341       where
342         pp_dm = case dm of 
343                   Just (DefMeth _) -> equals    -- Default method indicator
344                   Just GenDefMeth  -> semi      -- Generic method indicator
345                   Just NoDefMeth   -> empty     -- No Method at all
346                   -- Not convinced this is right...
347                   -- Not used in interface file output hopefully
348                   -- but needed for ddump-rn ??
349                   other            -> dot
350                                    -- empty     -- No method at all
351
352
353 ppr_sig (SpecSig var ty _)
354       = sep [ hsep [text "{-# SPECIALIZE", ppr var, dcolon],
355               nest 4 (ppr ty <+> text "#-}")
356         ]
357
358 ppr_sig (InlineSig var phase _)
359       = hsep [text "{-# INLINE", ppr_phase phase, ppr var, text "#-}"]
360
361 ppr_sig (NoInlineSig var phase _)
362       = hsep [text "{-# NOINLINE", ppr_phase phase, ppr var, text "#-}"]
363
364 ppr_sig (SpecInstSig ty _)
365       = hsep [text "{-# SPECIALIZE instance", ppr ty, text "#-}"]
366
367 ppr_sig (FixSig fix_sig) = ppr fix_sig
368
369
370 instance Outputable name => Outputable (FixitySig name) where
371   ppr (FixitySig name fixity loc) = sep [ppr fixity, ppr name]
372
373 ppr_phase :: Maybe Int -> SDoc
374 ppr_phase Nothing  = empty
375 ppr_phase (Just n) = int n
376 \end{code}
377
378 Checking for distinct signatures; oh, so boring
379
380
381 \begin{code}
382 eqHsSig :: Sig Name -> Sig Name -> Bool
383 eqHsSig (Sig n1 _ _)         (Sig n2 _ _)         = n1 == n2
384 eqHsSig (InlineSig n1 _ _)   (InlineSig n2 _ _)   = n1 == n2
385 eqHsSig (NoInlineSig n1 _ _) (NoInlineSig n2 _ _) = n1 == n2
386
387 eqHsSig (SpecInstSig ty1 _)  (SpecInstSig ty2 _)  = ty1 == ty2
388 eqHsSig (SpecSig n1 ty1 _)   (SpecSig n2 ty2 _) 
389   = -- may have many specialisations for one value;
390     -- but not ones that are exactly the same...
391     (n1 == n2) && (ty1 == ty2)
392
393 eqHsSig other_1 other_2 = False
394 \end{code}