[project @ 2002-10-11 14:46:02 by simonpj]
[ghc-hetmet.git] / ghc / compiler / hsSyn / HsDecls.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[HsDecls]{Abstract syntax: global declarations}
5
6 Definitions for: @TyDecl@ and @oCnDecl@, @ClassDecl@,
7 @InstDecl@, @DefaultDecl@ and @ForeignDecl@.
8
9 \begin{code}
10 module HsDecls (
11         HsDecl(..), TyClDecl(..), InstDecl(..), RuleDecl(..), RuleBndr(..),
12         DefaultDecl(..), HsGroup(..), SpliceDecl(..),
13         ForeignDecl(..), ForeignImport(..), ForeignExport(..),
14         CImportSpec(..), FoType(..),
15         ConDecl(..), CoreDecl(..),
16         BangType(..), getBangType, getBangStrictness, unbangedType,
17         DeprecDecl(..), DeprecTxt,
18         tyClDeclName, tyClDeclNames, tyClDeclTyVars,
19         isClassDecl, isSynDecl, isDataDecl, isIfaceSigDecl, 
20         isTypeOrClassDecl, countTyClDecls,
21         isSourceInstDecl, ifaceRuleDeclName,
22         conDetailsTys,
23         collectRuleBndrSigTys, isSrcRule
24     ) where
25
26 #include "HsVersions.h"
27
28 -- friends:
29 import {-# SOURCE #-}   HsExpr( HsExpr, pprExpr )
30         -- Because Expr imports Decls via HsBracket
31
32 import HsBinds          ( HsBinds, MonoBinds, Sig(..) )
33 import HsPat            ( HsConDetails(..), hsConArgs )
34 import HsImpExp         ( pprHsVar )
35 import HsTypes
36 import PprCore          ( pprCoreRule )
37 import HsCore           ( UfExpr, UfBinder, HsIdInfo, pprHsIdInfo,
38                           eq_ufBinders, eq_ufExpr, pprUfExpr 
39                         )
40 import CoreSyn          ( CoreRule(..), RuleName )
41 import BasicTypes       ( NewOrData(..), StrictnessMark(..), Activation(..), FixitySig(..) )
42 import ForeignCall      ( CCallTarget(..), DNCallSpec, CCallConv, Safety,
43                           CExportSpec(..)) 
44
45 -- others:
46 import Name             ( NamedThing )
47 import FunDeps          ( pprFundeps )
48 import TyCon            ( DataConDetails(..), visibleDataCons )
49 import Class            ( FunDep, DefMeth(..) )
50 import CStrings         ( CLabelString )
51 import Outputable       
52 import Util             ( eqListBy, count )
53 import SrcLoc           ( SrcLoc )
54 import FastString
55
56 import Maybe            ( isNothing, fromJust ) 
57 \end{code}
58
59
60 %************************************************************************
61 %*                                                                      *
62 \subsection[HsDecl]{Declarations}
63 %*                                                                      *
64 %************************************************************************
65
66 \begin{code}
67 data HsDecl id
68   = TyClD       (TyClDecl id)
69   | InstD       (InstDecl  id)
70   | ValD        (MonoBinds id)
71   | SigD        (Sig id)
72   | DefD        (DefaultDecl id)
73   | ForD        (ForeignDecl id)
74   | DeprecD     (DeprecDecl id)
75   | RuleD       (RuleDecl id)
76   | CoreD       (CoreDecl id)
77   | SpliceD     (SpliceDecl id)
78
79 -- NB: all top-level fixity decls are contained EITHER
80 -- EITHER SigDs
81 -- OR     in the ClassDecls in TyClDs
82 --
83 -- The former covers
84 --      a) data constructors
85 --      b) class methods (but they can be also done in the
86 --              signatures of class decls)
87 --      c) imported functions (that have an IfacSig)
88 --      d) top level decls
89 --
90 -- The latter is for class methods only
91
92 -- A [HsDecl] is categorised into a HsGroup before being 
93 -- fed to the renamer.
94 data HsGroup id
95   = HsGroup {
96         hs_valds  :: HsBinds id,        
97                 -- Before the renamer, this is a single big MonoBinds, 
98                 -- with all the bindings, and all the signatures.
99                 -- The renamer does dependency analysis, using ThenBinds
100                 -- to give the structure
101
102         hs_tyclds :: [TyClDecl id],
103         hs_instds :: [InstDecl id],
104
105         hs_fixds  :: [FixitySig id],
106                 -- Snaffled out of both top-level fixity signatures,
107                 -- and those in class declarations
108
109         hs_defds  :: [DefaultDecl id],
110         hs_fords  :: [ForeignDecl id],
111         hs_depds  :: [DeprecDecl id],
112         hs_ruleds :: [RuleDecl id],
113         hs_coreds :: [CoreDecl id]
114   }
115 \end{code}
116
117 \begin{code}
118 instance OutputableBndr name => Outputable (HsDecl name) where
119     ppr (TyClD dcl)  = ppr dcl
120     ppr (ValD binds) = ppr binds
121     ppr (DefD def)   = ppr def
122     ppr (InstD inst) = ppr inst
123     ppr (ForD fd)    = ppr fd
124     ppr (SigD sd)    = ppr sd
125     ppr (RuleD rd)   = ppr rd
126     ppr (DeprecD dd) = ppr dd
127     ppr (CoreD dd)   = ppr dd
128     ppr (SpliceD dd) = ppr dd
129
130 instance OutputableBndr name => Outputable (HsGroup name) where
131     ppr (HsGroup { hs_valds  = val_decls,
132                    hs_tyclds = tycl_decls,
133                    hs_instds = inst_decls,
134                    hs_fixds  = fix_decls,
135                    hs_depds  = deprec_decls,
136                    hs_fords  = foreign_decls,
137                    hs_defds  = default_decls,
138                    hs_ruleds = rule_decls,
139                    hs_coreds = core_decls })
140         = vcat [ppr_ds fix_decls, ppr_ds default_decls, 
141                 ppr_ds deprec_decls, ppr_ds rule_decls,
142                 ppr val_decls,
143                 ppr_ds tycl_decls, ppr_ds inst_decls,
144                 ppr_ds foreign_decls, ppr_ds core_decls]
145         where
146           ppr_ds [] = empty
147           ppr_ds ds = text "" $$ vcat (map ppr ds)
148
149 data SpliceDecl id = SpliceDecl (HsExpr id) SrcLoc      -- Top level splice
150
151 instance OutputableBndr name => Outputable (SpliceDecl name) where
152    ppr (SpliceDecl e _) = ptext SLIT("$") <> parens (pprExpr e)
153 \end{code}
154
155
156 %************************************************************************
157 %*                                                                      *
158 \subsection[TyDecl]{@data@, @newtype@ or @type@ (synonym) type declaration}
159 %*                                                                      *
160 %************************************************************************
161
162                 --------------------------------
163                         THE NAMING STORY
164                 --------------------------------
165
166 Here is the story about the implicit names that go with type, class, and instance
167 decls.  It's a bit tricky, so pay attention!
168
169 "Implicit" (or "system") binders
170 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
171   Each data type decl defines 
172         a worker name for each constructor
173         to-T and from-T convertors
174   Each class decl defines
175         a tycon for the class
176         a data constructor for that tycon
177         the worker for that constructor
178         a selector for each superclass
179
180 All have occurrence names that are derived uniquely from their parent declaration.
181
182 None of these get separate definitions in an interface file; they are
183 fully defined by the data or class decl.  But they may *occur* in
184 interface files, of course.  Any such occurrence must haul in the
185 relevant type or class decl.
186
187 Plan of attack:
188  - Ensure they "point to" the parent data/class decl 
189    when loading that decl from an interface file
190    (See RnHiFiles.getSysBinders)
191
192  - When typechecking the decl, we build the implicit TyCons and Ids.
193    When doing so we look them up in the name cache (RnEnv.lookupSysName),
194    to ensure correct module and provenance is set
195
196 These are the two places that we have to conjure up the magic derived
197 names.  (The actual magic is in OccName.mkWorkerOcc, etc.)
198
199 Default methods
200 ~~~~~~~~~~~~~~~
201  - Occurrence name is derived uniquely from the method name
202    E.g. $dmmax
203
204  - If there is a default method name at all, it's recorded in
205    the ClassOpSig (in HsBinds), in the DefMeth field.
206    (DefMeth is defined in Class.lhs)
207
208 Source-code class decls and interface-code class decls are treated subtly
209 differently, which has given me a great deal of confusion over the years.
210 Here's the deal.  (We distinguish the two cases because source-code decls
211 have (Just binds) in the tcdMeths field, whereas interface decls have Nothing.
212
213 In *source-code* class declarations:
214  - When parsing, every ClassOpSig gets a DefMeth with a suitable RdrName
215    This is done by RdrHsSyn.mkClassOpSigDM
216
217  - The renamer renames it to a Name
218
219  - During typechecking, we generate a binding for each $dm for 
220    which there's a programmer-supplied default method:
221         class Foo a where
222           op1 :: <type>
223           op2 :: <type>
224           op1 = ...
225    We generate a binding for $dmop1 but not for $dmop2.
226    The Class for Foo has a NoDefMeth for op2 and a DefMeth for op1.
227    The Name for $dmop2 is simply discarded.
228
229 In *interface-file* class declarations:
230   - When parsing, we see if there's an explicit programmer-supplied default method
231     because there's an '=' sign to indicate it:
232         class Foo a where
233           op1 = :: <type>       -- NB the '='
234           op2   :: <type>
235     We use this info to generate a DefMeth with a suitable RdrName for op1,
236     and a NoDefMeth for op2
237   - The interface file has a separate definition for $dmop1, with unfolding etc.
238   - The renamer renames it to a Name.
239   - The renamer treats $dmop1 as a free variable of the declaration, so that
240     the binding for $dmop1 will be sucked in.  (See RnHsSyn.tyClDeclFVs)  
241     This doesn't happen for source code class decls, because they *bind* the default method.
242
243 Dictionary functions
244 ~~~~~~~~~~~~~~~~~~~~
245 Each instance declaration gives rise to one dictionary function binding.
246
247 The type checker makes up new source-code instance declarations
248 (e.g. from 'deriving' or generic default methods --- see
249 TcInstDcls.tcInstDecls1).  So we can't generate the names for
250 dictionary functions in advance (we don't know how many we need).
251
252 On the other hand for interface-file instance declarations, the decl
253 specifies the name of the dictionary function, and it has a binding elsewhere
254 in the interface file:
255         instance {Eq Int} = dEqInt
256         dEqInt :: {Eq Int} <pragma info>
257
258 So again we treat source code and interface file code slightly differently.
259
260 Source code:
261   - Source code instance decls have a Nothing in the (Maybe name) field
262     (see data InstDecl below)
263
264   - The typechecker makes up a Local name for the dict fun for any source-code
265     instance decl, whether it comes from a source-code instance decl, or whether
266     the instance decl is derived from some other construct (e.g. 'deriving').
267
268   - The occurrence name it chooses is derived from the instance decl (just for 
269     documentation really) --- e.g. dNumInt.  Two dict funs may share a common
270     occurrence name, but will have different uniques.  E.g.
271         instance Foo [Int]  where ...
272         instance Foo [Bool] where ...
273     These might both be dFooList
274
275   - The CoreTidy phase externalises the name, and ensures the occurrence name is
276     unique (this isn't special to dict funs).  So we'd get dFooList and dFooList1.
277
278   - We can take this relaxed approach (changing the occurrence name later) 
279     because dict fun Ids are not captured in a TyCon or Class (unlike default
280     methods, say).  Instead, they are kept separately in the InstEnv.  This
281     makes it easy to adjust them after compiling a module.  (Once we've finished
282     compiling that module, they don't change any more.)
283
284
285 Interface file code:
286   - The instance decl gives the dict fun name, so the InstDecl has a (Just name)
287     in the (Maybe name) field.
288
289   - RnHsSyn.instDeclFVs treats the dict fun name as free in the decl, so that we
290     suck in the dfun binding
291
292
293 \begin{code}
294 -- TyClDecls are precisely the kind of declarations that can 
295 -- appear in interface files; or (internally) in GHC's interface
296 -- for a module.  That's why (despite the misnomer) IfaceSig and ForeignType
297 -- are both in TyClDecl
298
299 data TyClDecl name
300   = IfaceSig {  tcdName :: name,                -- It may seem odd to classify an interface-file signature
301                 tcdType :: HsType name,         -- as a 'TyClDecl', but it's very convenient.  
302                 tcdIdInfo :: [HsIdInfo name],
303                 tcdLoc :: SrcLoc
304     }
305
306   | ForeignType { tcdName    :: name,           -- See remarks about IfaceSig above
307                   tcdExtName :: Maybe FastString,
308                   tcdFoType  :: FoType,
309                   tcdLoc     :: SrcLoc }
310
311   | TyData {    tcdND     :: NewOrData,
312                 tcdCtxt   :: HsContext name,     -- Context
313                 tcdName   :: name,               -- Type constructor
314                 tcdTyVars :: [HsTyVarBndr name], -- Type variables
315                 tcdCons   :: DataConDetails (ConDecl name),      -- Data constructors
316                 tcdDerivs :: Maybe (HsContext name),    -- Derivings; Nothing => not specified
317                                                         -- Just [] => derive exactly what is asked
318                 tcdGeneric :: Maybe Bool,       -- Nothing <=> source decl
319                                                 -- Just x  <=> interface-file decl;
320                                                 --      x=True <=> generic converter functions available
321                                                 -- We need this for imported data decls, since the
322                                                 -- imported modules may have been compiled with
323                                                 -- different flags to the current compilation unit
324                 tcdLoc     :: SrcLoc
325     }
326
327   | TySynonym { tcdName :: name,                        -- type constructor
328                 tcdTyVars :: [HsTyVarBndr name],        -- type variables
329                 tcdSynRhs :: HsType name,               -- synonym expansion
330                 tcdLoc    :: SrcLoc
331     }
332
333   | ClassDecl { tcdCtxt    :: HsContext name,           -- Context...
334                 tcdName    :: name,                     -- Name of the class
335                 tcdTyVars  :: [HsTyVarBndr name],       -- The class type variables
336                 tcdFDs     :: [FunDep name],            -- Functional dependencies
337                 tcdSigs    :: [Sig name],               -- Methods' signatures
338                 tcdMeths   :: Maybe (MonoBinds name),   -- Default methods
339                                                         --      Nothing for imported class decls
340                                                         --      Just bs for source   class decls
341                 tcdLoc      :: SrcLoc
342     }
343 \end{code}
344
345 Simple classifiers
346
347 \begin{code}
348 isIfaceSigDecl, isDataDecl, isSynDecl, isClassDecl :: TyClDecl name -> Bool
349
350 isIfaceSigDecl (IfaceSig {}) = True
351 isIfaceSigDecl other         = False
352
353 isSynDecl (TySynonym {}) = True
354 isSynDecl other          = False
355
356 isDataDecl (TyData {}) = True
357 isDataDecl other       = False
358
359 isClassDecl (ClassDecl {}) = True
360 isClassDecl other          = False
361
362 isTypeOrClassDecl (ClassDecl   {}) = True
363 isTypeOrClassDecl (TyData      {}) = True
364 isTypeOrClassDecl (TySynonym   {}) = True
365 isTypeOrClassDecl (ForeignType {}) = True
366 isTypeOrClassDecl other            = False
367 \end{code}
368
369 Dealing with names
370
371 \begin{code}
372 --------------------------------
373 tyClDeclName :: TyClDecl name -> name
374 tyClDeclName tycl_decl = tcdName tycl_decl
375
376 --------------------------------
377 tyClDeclNames :: Eq name => TyClDecl name -> [(name, SrcLoc)]
378 -- Returns all the *binding* names of the decl, along with their SrcLocs
379 -- The first one is guaranteed to be the name of the decl
380 -- For record fields, the first one counts as the SrcLoc
381 -- We use the equality to filter out duplicate field names
382
383 tyClDeclNames (TySynonym   {tcdName = name, tcdLoc = loc})  = [(name,loc)]
384 tyClDeclNames (IfaceSig    {tcdName = name, tcdLoc = loc})  = [(name,loc)]
385 tyClDeclNames (ForeignType {tcdName = name, tcdLoc = loc})  = [(name,loc)]
386
387 tyClDeclNames (ClassDecl {tcdName = cls_name, tcdSigs = sigs, tcdLoc = loc})
388   = (cls_name,loc) : [(n,loc) | ClassOpSig n _ _ loc <- sigs]
389
390 tyClDeclNames (TyData {tcdName = tc_name, tcdCons = cons, tcdLoc = loc})
391   = (tc_name,loc) : conDeclsNames cons
392
393
394 tyClDeclTyVars (TySynonym {tcdTyVars = tvs}) = tvs
395 tyClDeclTyVars (TyData    {tcdTyVars = tvs}) = tvs
396 tyClDeclTyVars (ClassDecl {tcdTyVars = tvs}) = tvs
397 tyClDeclTyVars (ForeignType {})              = []
398 tyClDeclTyVars (IfaceSig {})                 = []
399 \end{code}
400
401 \begin{code}
402 instance (NamedThing name, Ord name) => Eq (TyClDecl name) where
403         -- Used only when building interface files
404   (==) d1@(IfaceSig {}) d2@(IfaceSig {})
405       = tcdName d1 == tcdName d2 && 
406         tcdType d1 == tcdType d2 && 
407         tcdIdInfo d1 == tcdIdInfo d2
408
409   (==) d1@(ForeignType {}) d2@(ForeignType {})
410       = tcdName d1 == tcdName d2 && 
411         tcdFoType d1 == tcdFoType d2
412
413   (==) d1@(TyData {}) d2@(TyData {})
414       = tcdName d1 == tcdName d2 && 
415         tcdND d1   == tcdND   d2 && 
416         eqWithHsTyVars (tcdTyVars d1) (tcdTyVars d2) (\ env -> 
417           eq_hsContext env (tcdCtxt d1) (tcdCtxt d2)  &&
418           eq_hsCD      env (tcdCons d1) (tcdCons d2)
419         )
420
421   (==) d1@(TySynonym {}) d2@(TySynonym {})
422       = tcdName d1 == tcdName d2 && 
423         eqWithHsTyVars (tcdTyVars d1) (tcdTyVars d2) (\ env -> 
424           eq_hsType env (tcdSynRhs d1) (tcdSynRhs d2)
425         )
426
427   (==) d1@(ClassDecl {}) d2@(ClassDecl {})
428     = tcdName d1 == tcdName d2 && 
429       eqWithHsTyVars (tcdTyVars d1) (tcdTyVars d2) (\ env -> 
430           eq_hsContext env (tcdCtxt d1) (tcdCtxt d2)  &&
431           eqListBy (eq_hsFD env) (tcdFDs d1) (tcdFDs d2) &&
432           eqListBy (eq_cls_sig env) (tcdSigs d1) (tcdSigs d2)
433        )
434
435   (==) _ _ = False      -- default case
436
437 eq_hsCD env (DataCons c1) (DataCons c2) = eqListBy (eq_ConDecl env) c1 c2
438 eq_hsCD env Unknown       Unknown       = True
439 eq_hsCD env (HasCons n1)  (HasCons n2)  = n1 == n2
440 eq_hsCD env d1            d2            = False
441
442 eq_hsFD env (ns1,ms1) (ns2,ms2)
443   = eqListBy (eq_hsVar env) ns1 ns2 && eqListBy (eq_hsVar env) ms1 ms2
444
445 eq_cls_sig env (ClassOpSig n1 dm1 ty1 _) (ClassOpSig n2 dm2 ty2 _)
446   = n1==n2 && dm1 `eq_dm` dm2 && eq_hsType env ty1 ty2
447   where
448         -- Ignore the name of the default method for (DefMeth id)
449         -- This is used for comparing declarations before putting
450         -- them into interface files, and the name of the default 
451         -- method isn't relevant
452     NoDefMeth  `eq_dm` NoDefMeth  = True
453     GenDefMeth `eq_dm` GenDefMeth = True
454     DefMeth _  `eq_dm` DefMeth _  = True
455     dm1        `eq_dm` dm2        = False
456 \end{code}
457
458 \begin{code}
459 countTyClDecls :: [TyClDecl name] -> (Int, Int, Int, Int, Int)
460         -- class, data, newtype, synonym decls
461 countTyClDecls decls 
462  = (count isClassDecl     decls,
463     count isSynDecl       decls,
464     count isIfaceSigDecl  decls,
465     count isDataTy        decls,
466     count isNewTy         decls) 
467  where
468    isDataTy TyData{tcdND=DataType} = True
469    isDataTy _                      = False
470    
471    isNewTy TyData{tcdND=NewType} = True
472    isNewTy _                     = False
473 \end{code}
474
475 \begin{code}
476 instance OutputableBndr name
477               => Outputable (TyClDecl name) where
478
479     ppr (IfaceSig {tcdName = var, tcdType = ty, tcdIdInfo = info})
480         = getPprStyle $ \ sty ->
481            hsep [ pprHsVar var, dcolon, ppr ty, pprHsIdInfo info ]
482
483     ppr (ForeignType {tcdName = tycon})
484         = hsep [ptext SLIT("foreign import type dotnet"), ppr tycon]
485
486     ppr (TySynonym {tcdName = tycon, tcdTyVars = tyvars, tcdSynRhs = mono_ty})
487       = hang (ptext SLIT("type") <+> pp_decl_head [] tycon tyvars <+> equals)
488              4 (ppr mono_ty)
489
490     ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdName = tycon,
491                  tcdTyVars = tyvars, tcdCons = condecls, 
492                  tcdDerivs = derivings})
493       = pp_tydecl (ptext keyword <+> pp_decl_head context tycon tyvars)
494                   (pp_condecls condecls)
495                   derivings
496       where
497         keyword = case new_or_data of
498                         NewType  -> SLIT("newtype")
499                         DataType -> SLIT("data")
500
501     ppr (ClassDecl {tcdCtxt = context, tcdName = clas, tcdTyVars = tyvars, tcdFDs = fds,
502                     tcdSigs = sigs, tcdMeths = methods})
503       | null sigs       -- No "where" part
504       = top_matter
505
506       | otherwise       -- Laid out
507       = sep [hsep [top_matter, ptext SLIT("where {")],
508              nest 4 (sep [sep (map ppr_sig sigs), pp_methods, char '}'])]
509       where
510         top_matter  = ptext SLIT("class") <+> pp_decl_head context clas tyvars <+> pprFundeps fds
511         ppr_sig sig = ppr sig <> semi
512
513         pp_methods = if isNothing methods
514                         then empty
515                         else ppr (fromJust methods)
516
517 pp_decl_head :: OutputableBndr name => HsContext name -> name -> [HsTyVarBndr name] -> SDoc
518 pp_decl_head context thing tyvars = hsep [pprHsContext context, ppr thing, interppSP tyvars]
519
520 pp_condecls Unknown       = ptext SLIT("{- abstract -}")
521 pp_condecls (HasCons n)   = ptext SLIT("{- abstract with") <+> int n <+> ptext SLIT("constructors -}")
522 pp_condecls (DataCons cs) = equals <+> sep (punctuate (ptext SLIT(" |")) (map ppr cs))
523
524 pp_tydecl pp_head pp_decl_rhs derivings
525   = hang pp_head 4 (sep [
526         pp_decl_rhs,
527         case derivings of
528           Nothing          -> empty
529           Just ds          -> hsep [ptext SLIT("deriving"), ppr_hs_context ds]
530     ])
531 \end{code}
532
533
534 %************************************************************************
535 %*                                                                      *
536 \subsection[ConDecl]{A data-constructor declaration}
537 %*                                                                      *
538 %************************************************************************
539
540 \begin{code}
541 data ConDecl name
542   = ConDecl     name                    -- Constructor name; this is used for the
543                                         -- DataCon itself, and for the user-callable wrapper Id
544
545                 [HsTyVarBndr name]      -- Existentially quantified type variables
546                 (HsContext name)        -- ...and context
547                                         -- If both are empty then there are no existentials
548
549                 (HsConDetails name (BangType name))
550                 SrcLoc
551 \end{code}
552
553 \begin{code}
554 conDeclsNames :: Eq name => DataConDetails (ConDecl name) -> [(name,SrcLoc)]
555   -- See tyClDeclNames for what this does
556   -- The function is boringly complicated because of the records
557   -- And since we only have equality, we have to be a little careful
558 conDeclsNames cons
559   = snd (foldl do_one ([], []) (visibleDataCons cons))
560   where
561     do_one (flds_seen, acc) (ConDecl name _ _ (RecCon flds) loc)
562         = (new_flds ++ flds_seen, (name,loc) : [(f,loc) | f <- new_flds] ++ acc)
563         where
564           new_flds = [ f | (f,_) <- flds, not (f `elem` flds_seen) ]
565
566     do_one (flds_seen, acc) (ConDecl name _ _ _ loc)
567         = (flds_seen, (name,loc):acc)
568 \end{code}
569
570 \begin{code}
571 conDetailsTys details = map getBangType (hsConArgs details)
572
573 eq_ConDecl env (ConDecl n1 tvs1 cxt1 cds1 _)
574                (ConDecl n2 tvs2 cxt2 cds2 _)
575   = n1 == n2 &&
576     (eq_hsTyVars env tvs1 tvs2  $ \ env ->
577      eq_hsContext env cxt1 cxt2 &&
578      eq_ConDetails env cds1 cds2)
579
580 eq_ConDetails env (PrefixCon bts1) (PrefixCon bts2)
581   = eqListBy (eq_btype env) bts1 bts2
582 eq_ConDetails env (InfixCon bta1 btb1) (InfixCon bta2 btb2)
583   = eq_btype env bta1 bta2 && eq_btype env btb1 btb2
584 eq_ConDetails env (RecCon fs1) (RecCon fs2)
585   = eqListBy (eq_fld env) fs1 fs2
586 eq_ConDetails env _ _ = False
587
588 eq_fld env (ns1,bt1) (ns2, bt2) = ns1==ns2 && eq_btype env bt1 bt2
589 \end{code}
590   
591 \begin{code}
592 data BangType name = BangType StrictnessMark (HsType name)
593
594 getBangType       (BangType _ ty) = ty
595 getBangStrictness (BangType s _)  = s
596
597 unbangedType ty = BangType NotMarkedStrict ty
598
599 eq_btype env (BangType s1 t1) (BangType s2 t2) = s1==s2 && eq_hsType env t1 t2
600 \end{code}
601
602 \begin{code}
603 instance (OutputableBndr name) => Outputable (ConDecl name) where
604     ppr (ConDecl con tvs cxt con_details loc)
605       = sep [pprHsForAll tvs cxt, ppr_con_details con con_details]
606
607 ppr_con_details con (InfixCon ty1 ty2)
608   = hsep [ppr_bang ty1, ppr con, ppr_bang ty2]
609
610 -- ConDecls generated by MkIface.ifaceTyThing always have a PrefixCon, even
611 -- if the constructor is an infix one.  This is because in an interface file
612 -- we don't distinguish between the two.  Hence when printing these for the
613 -- user, we need to parenthesise infix constructor names.
614 ppr_con_details con (PrefixCon tys)
615   = hsep (pprHsVar con : map ppr_bang tys)
616
617 ppr_con_details con (RecCon fields)
618   = ppr con <+> braces (sep (punctuate comma (map ppr_field fields)))
619   where
620     ppr_field (n, ty) = ppr n <+> dcolon <+> ppr_bang ty
621
622 instance OutputableBndr name => Outputable (BangType name) where
623     ppr = ppr_bang
624
625 ppr_bang (BangType s ty) = ppr s <> pprParendHsType ty
626 \end{code}
627
628
629 %************************************************************************
630 %*                                                                      *
631 \subsection[InstDecl]{An instance declaration
632 %*                                                                      *
633 %************************************************************************
634
635 \begin{code}
636 data InstDecl name
637   = InstDecl    (HsType name)   -- Context => Class Instance-type
638                                 -- Using a polytype means that the renamer conveniently
639                                 -- figures out the quantified type variables for us.
640
641                 (MonoBinds name)
642
643                 [Sig name]              -- User-supplied pragmatic info
644
645                 (Maybe name)            -- Name for the dictionary function
646                                         -- Nothing for source-file instance decls
647
648                 SrcLoc
649
650 isSourceInstDecl :: InstDecl name -> Bool
651 isSourceInstDecl (InstDecl _ _ _ maybe_dfun _) = isNothing maybe_dfun
652 \end{code}
653
654 \begin{code}
655 instance (OutputableBndr name) => Outputable (InstDecl name) where
656
657     ppr (InstDecl inst_ty binds uprags maybe_dfun_name src_loc)
658       = vcat [hsep [ptext SLIT("instance"), ppr inst_ty, ptext SLIT("where")],
659               nest 4 (ppr uprags),
660               nest 4 (ppr binds) ]
661       where
662         pp_dfun = case maybe_dfun_name of
663                     Just df -> ppr df
664                     Nothing -> empty
665 \end{code}
666
667 \begin{code}
668 instance Ord name => Eq (InstDecl name) where
669         -- Used for interface comparison only, so don't compare bindings
670   (==) (InstDecl inst_ty1 _ _ dfun1 _) (InstDecl inst_ty2 _ _ dfun2 _)
671        = inst_ty1 == inst_ty2 && dfun1 == dfun2
672 \end{code}
673
674
675 %************************************************************************
676 %*                                                                      *
677 \subsection[DefaultDecl]{A @default@ declaration}
678 %*                                                                      *
679 %************************************************************************
680
681 There can only be one default declaration per module, but it is hard
682 for the parser to check that; we pass them all through in the abstract
683 syntax, and that restriction must be checked in the front end.
684
685 \begin{code}
686 data DefaultDecl name
687   = DefaultDecl [HsType name]
688                 SrcLoc
689
690 instance (OutputableBndr name)
691               => Outputable (DefaultDecl name) where
692
693     ppr (DefaultDecl tys src_loc)
694       = ptext SLIT("default") <+> parens (interpp'SP tys)
695 \end{code}
696
697 %************************************************************************
698 %*                                                                      *
699 \subsection{Foreign function interface declaration}
700 %*                                                                      *
701 %************************************************************************
702
703 \begin{code}
704
705 -- foreign declarations are distinguished as to whether they define or use a
706 -- Haskell name
707 --
708 -- * the Boolean value indicates whether the pre-standard deprecated syntax
709 --   has been used
710 --
711 data ForeignDecl name
712   = ForeignImport name (HsType name) ForeignImport Bool SrcLoc  -- defines name
713   | ForeignExport name (HsType name) ForeignExport Bool SrcLoc  -- uses name
714
715 -- yield the Haskell name defined or used in a foreign declaration
716 --
717 foreignDeclName                           :: ForeignDecl name -> name
718 foreignDeclName (ForeignImport n _ _ _ _)  = n
719 foreignDeclName (ForeignExport n _ _ _ _)  = n
720
721 -- specification of an imported external entity in dependence on the calling
722 -- convention 
723 --
724 data ForeignImport = -- import of a C entity
725                      --
726                      -- * the two strings specifying a header file or library
727                      --   may be empty, which indicates the absence of a
728                      --   header or object specification (both are not used
729                      --   in the case of `CWrapper' and when `CFunction'
730                      --   has a dynamic target)
731                      --
732                      -- * the calling convention is irrelevant for code
733                      --   generation in the case of `CLabel', but is needed
734                      --   for pretty printing 
735                      --
736                      -- * `Safety' is irrelevant for `CLabel' and `CWrapper'
737                      --
738                      CImport  CCallConv       -- ccall or stdcall
739                               Safety          -- safe or unsafe
740                               FastString      -- name of C header
741                               FastString      -- name of library object
742                               CImportSpec     -- details of the C entity
743
744                      -- import of a .NET function
745                      --
746                    | DNImport DNCallSpec
747
748 -- details of an external C entity
749 --
750 data CImportSpec = CLabel    CLabelString     -- import address of a C label
751                  | CFunction CCallTarget      -- static or dynamic function
752                  | CWrapper                   -- wrapper to expose closures
753                                               -- (former f.e.d.)
754
755 -- specification of an externally exported entity in dependence on the calling
756 -- convention
757 --
758 data ForeignExport = CExport  CExportSpec    -- contains the calling convention
759                    | DNExport                -- presently unused
760
761 -- abstract type imported from .NET
762 --
763 data FoType = DNType            -- In due course we'll add subtype stuff
764             deriving (Eq)       -- Used for equality instance for TyClDecl
765
766
767 -- pretty printing of foreign declarations
768 --
769
770 instance OutputableBndr name => Outputable (ForeignDecl name) where
771   ppr (ForeignImport n ty fimport _ _) =
772     ptext SLIT("foreign import") <+> ppr fimport <+> 
773     ppr n <+> dcolon <+> ppr ty
774   ppr (ForeignExport n ty fexport _ _) =
775     ptext SLIT("foreign export") <+> ppr fexport <+> 
776     ppr n <+> dcolon <+> ppr ty
777
778 instance Outputable ForeignImport where
779   ppr (DNImport                         spec) = 
780     ptext SLIT("dotnet") <+> ppr spec
781   ppr (CImport  cconv safety header lib spec) =
782     ppr cconv <+> ppr safety <+> 
783     char '"' <> pprCEntity header lib spec <> char '"'
784     where
785       pprCEntity header lib (CLabel lbl) = 
786         ptext SLIT("static") <+> ftext header <+> char '&' <>
787         pprLib lib <> ppr lbl
788       pprCEntity header lib (CFunction (StaticTarget lbl)) = 
789         ptext SLIT("static") <+> ftext header <+> char '&' <>
790         pprLib lib <> ppr lbl
791       pprCEntity header lib (CFunction (DynamicTarget)) = 
792         ptext SLIT("dynamic")
793       pprCEntity header lib (CFunction (CasmTarget _)) = 
794         panic "HsDecls.pprCEntity: malformed C function target"
795       pprCEntity _      _   (CWrapper) = ptext SLIT("wrapper")
796       --
797       pprLib lib | nullFastString lib = empty
798                  | otherwise          = char '[' <> ppr lib <> char ']'
799
800 instance Outputable ForeignExport where
801   ppr (CExport  (CExportStatic lbl cconv)) = 
802     ppr cconv <+> char '"' <> ppr lbl <> char '"'
803   ppr (DNExport                          ) = 
804     ptext SLIT("dotnet") <+> ptext SLIT("\"<unused>\"")
805
806 instance Outputable FoType where
807   ppr DNType = ptext SLIT("type dotnet")
808 \end{code}
809
810
811 %************************************************************************
812 %*                                                                      *
813 \subsection{Transformation rules}
814 %*                                                                      *
815 %************************************************************************
816
817 \begin{code}
818 data RuleDecl name
819   = HsRule                      -- Source rule
820         RuleName                -- Rule name
821         Activation
822         [RuleBndr name]         -- Forall'd vars; after typechecking this includes tyvars
823         (HsExpr name)   -- LHS
824         (HsExpr name)   -- RHS
825         SrcLoc          
826
827   | IfaceRule                   -- One that's come in from an interface file; pre-typecheck
828         RuleName
829         Activation
830         [UfBinder name]         -- Tyvars and term vars
831         name                    -- Head of lhs
832         [UfExpr name]           -- Args of LHS
833         (UfExpr name)           -- Pre typecheck
834         SrcLoc          
835
836   | IfaceRuleOut                -- Post typecheck
837         name                    -- Head of LHS
838         CoreRule
839
840 isSrcRule (HsRule _ _ _ _ _ _) = True
841 isSrcRule other                = False
842
843 ifaceRuleDeclName :: RuleDecl name -> name
844 ifaceRuleDeclName (IfaceRule _ _ _ n _ _ _) = n
845 ifaceRuleDeclName (IfaceRuleOut n r)        = n
846 ifaceRuleDeclName (HsRule fs _ _ _ _ _)     = pprPanic "ifaceRuleDeclName" (ppr fs)
847
848 data RuleBndr name
849   = RuleBndr name
850   | RuleBndrSig name (HsType name)
851
852 collectRuleBndrSigTys :: [RuleBndr name] -> [HsType name]
853 collectRuleBndrSigTys bndrs = [ty | RuleBndrSig _ ty <- bndrs]
854
855 instance (NamedThing name, Ord name) => Eq (RuleDecl name) where
856   -- Works for IfaceRules only; used when comparing interface file versions
857   (IfaceRule n1 a1 bs1 f1 es1 rhs1 _) == (IfaceRule n2 a2 bs2 f2 es2 rhs2 _)
858      = n1==n2 && f1 == f2 && a1==a2 &&
859        eq_ufBinders emptyEqHsEnv bs1 bs2 (\env -> 
860        eqListBy (eq_ufExpr env) (rhs1:es1) (rhs2:es2))
861
862 instance OutputableBndr name => Outputable (RuleDecl name) where
863   ppr (HsRule name act ns lhs rhs loc)
864         = sep [text "{-# RULES" <+> doubleQuotes (ftext name) <+> ppr act,
865                pp_forall, pprExpr lhs, equals <+> pprExpr rhs,
866                text "#-}" ]
867         where
868           pp_forall | null ns   = empty
869                     | otherwise = text "forall" <+> fsep (map ppr ns) <> dot
870
871   ppr (IfaceRule name act tpl_vars fn tpl_args rhs loc) 
872     = hsep [ doubleQuotes (ftext name), ppr act,
873            ptext SLIT("__forall") <+> braces (interppSP tpl_vars),
874            ppr fn <+> sep (map (pprUfExpr parens) tpl_args),
875            ptext SLIT("=") <+> ppr rhs
876       ] <+> semi
877
878   ppr (IfaceRuleOut fn rule) = pprCoreRule (ppr fn) rule
879
880 instance OutputableBndr name => Outputable (RuleBndr name) where
881    ppr (RuleBndr name) = ppr name
882    ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty
883 \end{code}
884
885
886 %************************************************************************
887 %*                                                                      *
888 \subsection[DeprecDecl]{Deprecations}
889 %*                                                                      *
890 %************************************************************************
891
892 We use exported entities for things to deprecate.
893
894 \begin{code}
895 data DeprecDecl name = Deprecation name DeprecTxt SrcLoc
896
897 type DeprecTxt = FastString     -- reason/explanation for deprecation
898
899 instance OutputableBndr name => Outputable (DeprecDecl name) where
900     ppr (Deprecation thing txt _)
901       = hsep [text "{-# DEPRECATED", ppr thing, doubleQuotes (ppr txt), text "#-}"]
902 \end{code}
903
904
905 %************************************************************************
906 %*                                                                      *
907                 External-core declarations
908 %*                                                                      *
909 %************************************************************************
910
911 \begin{code}
912 data CoreDecl name      -- a Core value binding (from 'external Core' input)
913   = CoreDecl    name
914                 (HsType name)
915                 (UfExpr name)
916                 SrcLoc
917         
918 instance OutputableBndr name => Outputable (CoreDecl name) where
919     ppr (CoreDecl var ty rhs loc)
920         = getPprStyle $ \ sty ->
921           hsep [ pprHsVar var, dcolon, ppr ty, ppr rhs ]
922 \end{code}