HsDecls.lhs 27.3 KB
Newer Older
1
%
2
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3
4
5
%
\section[HsDecls]{Abstract syntax: global declarations}

6
Definitions for: @TyDecl@ and @oCnDecl@, @ClassDecl@,
sof's avatar
sof committed
7
@InstDecl@, @DefaultDecl@ and @ForeignDecl@.
8
9

\begin{code}
10
module HsDecls (
11
	HsDecl(..), TyClDecl(..), InstDecl(..), RuleDecl(..), RuleBndr(..),
12
13
	DefaultDecl(..), 
	ForeignDecl(..), FoImport(..), FoExport(..), FoType(..),
14
	ConDecl(..), ConDetails(..), 
15
	BangType(..), getBangType, getBangStrictness, unbangedType,
16
	DeprecDecl(..), DeprecTxt,
17
18
	hsDeclName, instDeclName, 
	tyClDeclName, tyClDeclNames, tyClDeclSysNames, tyClDeclTyVars,
19
	isClassDecl, isSynDecl, isDataDecl, isIfaceSigDecl, countTyClDecls,
20
	mkClassDeclSysNames, isIfaceRuleDecl, ifaceRuleDeclName,
21
	getClassDeclSysNames, conDetailsTys
22
    ) where
23

24
#include "HsVersions.h"
25
26

-- friends:
27
import HsBinds		( HsBinds, MonoBinds, Sig(..), FixitySig(..) )
28
import HsExpr		( HsExpr )
29
import HsTypes
30
import PprCore		( pprCoreRule )
31
32
import HsCore		( UfExpr, UfBinder, HsIdInfo, pprHsIdInfo,
			  eq_ufBinders, eq_ufExpr, pprUfExpr 
33
			)
34
import CoreSyn		( CoreRule(..) )
35
import BasicTypes	( NewOrData(..) )
36
import Demand		( StrictnessMark(..) )
37
import ForeignCall	( CExportSpec, CCallSpec, DNCallSpec, CCallConv )
38
39

-- others:
40
import Name		( NamedThing )
41
import FunDeps		( pprFundeps )
42
import Class		( FunDep, DefMeth(..) )
43
import CStrings		( CLabelString )
44
import Outputable	
45
import SrcLoc		( SrcLoc )
46
47
\end{code}

48
49
50
51
52
53
54
55

%************************************************************************
%*									*
\subsection[HsDecl]{Declarations}
%*									*
%************************************************************************

\begin{code}
56
57
58
data HsDecl name pat
  = TyClD	(TyClDecl name pat)
  | InstD	(InstDecl  name pat)
59
  | DefD	(DefaultDecl name)
60
  | ValD	(HsBinds name pat)
sof's avatar
sof committed
61
  | ForD        (ForeignDecl name)
62
  | FixD	(FixitySig name)
63
  | DeprecD	(DeprecDecl name)
64
  | RuleD	(RuleDecl name pat)
65
66
67
68
69
70
71
72
73
74
75
76
77

-- NB: all top-level fixity decls are contained EITHER
-- EITHER FixDs
-- OR     in the ClassDecls in TyClDs
--
-- The former covers
-- 	a) data constructors
-- 	b) class methods (but they can be also done in the
-- 		signatures of class decls)
--	c) imported functions (that have an IfacSig)
--	d) top level decls
--
-- The latter is for class methods only
78
79
80
\end{code}

\begin{code}
sof's avatar
sof committed
81
#ifdef DEBUG
82
hsDeclName :: (NamedThing name, Outputable name, Outputable pat)
83
	   => HsDecl name pat -> name
sof's avatar
sof committed
84
#endif
85
86
87
88
hsDeclName (TyClD decl)			  = tyClDeclName decl
hsDeclName (InstD   decl)		  = instDeclName decl
hsDeclName (ForD    decl)		  = forDeclName decl
hsDeclName (FixD    (FixitySig name _ _)) = name
89
-- Others don't make sense
sof's avatar
sof committed
90
#ifdef DEBUG
91
hsDeclName x				      = pprPanic "HsDecls.hsDeclName" (ppr x)
sof's avatar
sof committed
92
#endif
93

94
95
96

instDeclName :: InstDecl name pat -> name
instDeclName (InstDecl _ _ _ (Just name) _) = name
97

98
99
100
\end{code}

\begin{code}
101
instance (NamedThing name, Outputable name, Outputable pat)
102
	=> Outputable (HsDecl name pat) where
103

104
    ppr (TyClD dcl)  = ppr dcl
105
106
107
    ppr (ValD binds) = ppr binds
    ppr (DefD def)   = ppr def
    ppr (InstD inst) = ppr inst
sof's avatar
sof committed
108
    ppr (ForD fd)    = ppr fd
109
    ppr (FixD fd)    = ppr fd
110
    ppr (RuleD rd)   = ppr rd
111
112
113
    ppr (DeprecD dd) = ppr dd
\end{code}

114

115
116
117
118
119
120
%************************************************************************
%*									*
\subsection[TyDecl]{@data@, @newtype@ or @type@ (synonym) type declaration}
%*									*
%************************************************************************

121
122
123
		--------------------------------
			THE NAMING STORY
		--------------------------------
124

125
126
127
128
129
Here is the story about the implicit names that go with type, class, and instance
decls.  It's a bit tricky, so pay attention!

"Implicit" (or "system") binders
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  Each data type decl defines 
	a worker name for each constructor
	to-T and from-T convertors
  Each class decl defines
	a tycon for the class
	a data constructor for that tycon
	the worker for that constructor
	a selector for each superclass

All have occurrence names that are derived uniquely from their parent declaration.

None of these get separate definitions in an interface file; they are
fully defined by the data or class decl.  But they may *occur* in
interface files, of course.  Any such occurrence must haul in the
relevant type or class decl.

Plan of attack:
 - Make up their occurrence names immediately
148
   This is done in RdrHsSyn.mkClassDecl, mkTyDecl, mkConDecl
149
150
151

 - Ensure they "point to" the parent data/class decl 
   when loading that decl from an interface file
152
   (See RnHiFiles.getTyClDeclSysNames)
153
154
155
156

 - When renaming the decl look them up in the name cache,
   ensure correct module and provenance is set

157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
Default methods
~~~~~~~~~~~~~~~
 - Occurrence name is derived uniquely from the method name
   E.g. $dmmax

 - If there is a default method name at all, it's recorded in
   the ClassOpSig (in HsBinds), in the DefMeth field.
   (DefMeth is defined in Class.lhs)

Source-code class decls and interface-code class decls are treated subtly
differently, which has given me a great deal of confusion over the years.
Here's the deal.  (We distinguish the two cases because source-code decls
have (Just binds) in the tcdMeths field, whereas interface decls have Nothing.

In *source-code* class declarations:
 - When parsing, every ClassOpSig gets a DefMeth with a suitable RdrName
   This is done by RdrHsSyn.mkClassOpSigDM

 - The renamer renames it to a Name

 - During typechecking, we generate a binding for each $dm for 
   which there's a programmer-supplied default method:
	class Foo a where
	  op1 :: <type>
	  op2 :: <type>
	  op1 = ...
   We generate a binding for $dmop1 but not for $dmop2.
   The Class for Foo has a NoDefMeth for op2 and a DefMeth for op1.
   The Name for $dmop2 is simply discarded.

In *interface-file* class declarations:
  - When parsing, we see if there's an explicit programmer-supplied default method
    because there's an '=' sign to indicate it:
	class Foo a where
	  op1 = :: <type>	-- NB the '='
  	  op2   :: <type>
    We use this info to generate a DefMeth with a suitable RdrName for op1,
    and a NoDefMeth for op2
  - The interface file has a separate definition for $dmop1, with unfolding etc.
  - The renamer renames it to a Name.
  - The renamer treats $dmop1 as a free variable of the declaration, so that
    the binding for $dmop1 will be sucked in.  (See RnHsSyn.tyClDeclFVs)  
    This doesn't happen for source code class decls, because they *bind* the default method.

Dictionary functions
~~~~~~~~~~~~~~~~~~~~
Each instance declaration gives rise to one dictionary function binding.

The type checker makes up new source-code instance declarations
(e.g. from 'deriving' or generic default methods --- see
TcInstDcls.tcInstDecls1).  So we can't generate the names for
dictionary functions in advance (we don't know how many we need).

On the other hand for interface-file instance declarations, the decl
specifies the name of the dictionary function, and it has a binding elsewhere
in the interface file:
	instance {Eq Int} = dEqInt
	dEqInt :: {Eq Int} <pragma info>

So again we treat source code and interface file code slightly differently.

Source code:
  - Source code instance decls have a Nothing in the (Maybe name) field
    (see data InstDecl below)

  - The typechecker makes up a Local name for the dict fun for any source-code
    instance decl, whether it comes from a source-code instance decl, or whether
    the instance decl is derived from some other construct (e.g. 'deriving').

  - The occurrence name it chooses is derived from the instance decl (just for 
    documentation really) --- e.g. dNumInt.  Two dict funs may share a common
    occurrence name, but will have different uniques.  E.g.
	instance Foo [Int]  where ...
	instance Foo [Bool] where ...
    These might both be dFooList

  - The CoreTidy phase globalises the name, and ensures the occurrence name is
    unique (this isn't special to dict funs).  So we'd get dFooList and dFooList1.

  - We can take this relaxed approach (changing the occurrence name later) 
    because dict fun Ids are not captured in a TyCon or Class (unlike default
    methods, say).  Instead, they are kept separately in the InstEnv.  This
    makes it easy to adjust them after compiling a module.  (Once we've finished
    compiling that module, they don't change any more.)


Interface file code:
  - The instance decl gives the dict fun name, so the InstDecl has a (Just name)
    in the (Maybe name) field.
246

247
248
  - RnHsSyn.instDeclFVs treats the dict fun name as free in the decl, so that we
    suck in the dfun binding
249
250


251
\begin{code}
252
253
254
255
256
-- TyClDecls are precisely the kind of declarations that can 
-- appear in interface files; or (internally) in GHC's interface
-- for a module.  That's why (despite the misnomer) IfaceSig and ForeignType
-- are both in TyClDecl

257
data TyClDecl name pat
258
  = IfaceSig {	tcdName :: name,		-- It may seem odd to classify an interface-file signature
259
260
		tcdType :: HsType name,		-- as a 'TyClDecl', but it's very convenient.  
		tcdIdInfo :: [HsIdInfo name],
261
262
263
		tcdLoc :: SrcLoc
    }

264
265
266
267
  | ForeignType { tcdName   :: name,		-- See remarks about IfaceSig above
		  tcdFoType :: FoType,
		  tcdLoc    :: SrcLoc }

268
269
270
271
272
273
274
  | TyData {	tcdND     :: NewOrData,
		tcdCtxt   :: HsContext name,	 -- context
		tcdName   :: name,		 -- type constructor
		tcdTyVars :: [HsTyVarBndr name], -- type variables
		tcdCons	  :: [ConDecl name],	 -- data constructors (empty if abstract)
		tcdNCons  :: Int,		 -- Number of data constructors (valid even if type is abstract)
		tcdDerivs :: Maybe [name],	 -- derivings; Nothing => not specified
275
276
277
				 -- (i.e., derive default); Just [] => derive
				 -- *nothing*; Just <list> => as you would
				 -- expect...
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
		tcdSysNames :: DataSysNames name,	-- Generic converter functions
		tcdLoc	    :: SrcLoc
    }

  | TySynonym {	tcdName :: name,		        -- type constructor
		tcdTyVars :: [HsTyVarBndr name],	-- type variables
		tcdSynRhs :: HsType name,	        -- synonym expansion
		tcdLoc    :: SrcLoc
    }

  | ClassDecl {	tcdCtxt    :: HsContext name, 	 	-- Context...
		tcdName    :: name,		    	-- Name of the class
		tcdTyVars  :: [HsTyVarBndr name],	-- The class type variables
		tcdFDs     :: [FunDep name],		-- Functional dependencies
		tcdSigs    :: [Sig name],		-- Methods' signatures
		tcdMeths   :: Maybe (MonoBinds name pat),	-- Default methods
								-- Nothing for imported class decls
								-- Just bs for source   class decls
		tcdSysNames :: ClassSysNames name,
		tcdLoc      :: SrcLoc
    }
299
300
301
302
303
304
305
\end{code}

Simple classifiers

\begin{code}
isIfaceSigDecl, isDataDecl, isSynDecl, isClassDecl :: TyClDecl name pat -> Bool

306
307
isIfaceSigDecl (IfaceSig {}) = True
isIfaceSigDecl other	     = False
308

309
310
isSynDecl (TySynonym {}) = True
isSynDecl other		 = False
311

312
313
isDataDecl (TyData {}) = True
isDataDecl other       = False
314

315
316
isClassDecl (ClassDecl {}) = True
isClassDecl other	   = False
317
318
319
\end{code}

Dealing with names
320

321
\begin{code}
322
--------------------------------
323
tyClDeclName :: TyClDecl name pat -> name
324
tyClDeclName tycl_decl = tcdName tycl_decl
325

326
--------------------------------
327
tyClDeclNames :: Eq name => TyClDecl name pat -> [(name, SrcLoc)]
328
-- Returns all the *binding* names of the decl, along with their SrcLocs
329
330
331
332
-- The first one is guaranteed to be the name of the decl
-- For record fields, the first one counts as the SrcLoc
-- We use the equality to filter out duplicate field names

333
334
335
tyClDeclNames (TySynonym   {tcdName = name, tcdLoc = loc})  = [(name,loc)]
tyClDeclNames (IfaceSig    {tcdName = name, tcdLoc = loc})  = [(name,loc)]
tyClDeclNames (ForeignType {tcdName = name, tcdLoc = loc})  = [(name,loc)]
336

337
tyClDeclNames (ClassDecl {tcdName = cls_name, tcdSigs = sigs, tcdLoc = loc})
338
  = (cls_name,loc) : [(n,loc) | ClassOpSig n _ _ loc <- sigs]
339

340
tyClDeclNames (TyData {tcdName = tc_name, tcdCons = cons, tcdLoc = loc})
341
  = (tc_name,loc) : conDeclsNames cons
342
343


344
345
346
347
348
349
350
tyClDeclTyVars (TySynonym {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (TyData    {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ClassDecl {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ForeignType {})		     = []
tyClDeclTyVars (IfaceSig {})		     = []


351
--------------------------------
352
-- The "system names" are extra implicit names *bound* by the decl.
353
354
355
356
357
358
359
360
361
362
363
364
365
366
-- They are kept in a list rather than a tuple 
-- to make the renamer easier.

type ClassSysNames name = [name]
-- For class decls they are:
-- 	[tycon, datacon wrapper, datacon worker, 
--	 superclass selector 1, ..., superclass selector n]

type DataSysNames name =  [name]
-- For data decls they are
--	[from, to]
-- where from :: T -> Tring
--	 to   :: Tring -> T

367
368
369
370
tyClDeclSysNames :: TyClDecl name pat -> [(name, SrcLoc)]
-- Similar to tyClDeclNames, but returns the "implicit" 
-- or "system" names of the declaration

371
tyClDeclSysNames (ClassDecl {tcdSysNames = names, tcdLoc = loc})
372
  = [(n,loc) | n <- names]
373
374
375
376
tyClDeclSysNames (TyData {tcdCons = cons, tcdSysNames = names, tcdLoc = loc})
  = [(n,loc) | n <- names] ++ 
    [(wkr_name,loc) | ConDecl _ wkr_name _ _ _ loc <- cons]
tyClDeclSysNames decl = []
377

378
379
380
381
382
383
384
385

mkClassDeclSysNames  :: (name, name, name, [name]) -> [name]
getClassDeclSysNames :: [name] -> (name, name, name, [name])
mkClassDeclSysNames  (a,b,c,ds) = a:b:c:ds
getClassDeclSysNames (a:b:c:ds) = (a,b,c,ds)
\end{code}

\begin{code}
386
instance (NamedThing name, Ord name) => Eq (TyClDecl name pat) where
387
	-- Used only when building interface files
388
389
390
391
392
  (==) d1@(IfaceSig {}) d2@(IfaceSig {})
      = tcdName d1 == tcdName d2 && 
	tcdType d1 == tcdType d2 && 
	tcdIdInfo d1 == tcdIdInfo d2

393
394
395
396
  (==) d1@(ForeignType {}) d2@(ForeignType {})
      = tcdName d1 == tcdName d2 && 
	tcdFoType d1 == tcdFoType d2

397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
  (==) d1@(TyData {}) d2@(TyData {})
      = tcdName d1 == tcdName d2 && 
	tcdND d1   == tcdND   d2 && 
	eqWithHsTyVars (tcdTyVars d1) (tcdTyVars d2) (\ env -> 
   	  eq_hsContext env (tcdCtxt d1) (tcdCtxt d2)  &&
	  eqListBy (eq_ConDecl env) (tcdCons d1) (tcdCons d2)
	)

  (==) d1@(TySynonym {}) d2@(TySynonym {})
      = tcdName d1 == tcdName d2 && 
	eqWithHsTyVars (tcdTyVars d1) (tcdTyVars d2) (\ env -> 
          eq_hsType env (tcdSynRhs d1) (tcdSynRhs d2)
        )

  (==) d1@(ClassDecl {}) d2@(ClassDecl {})
    = tcdName d1 == tcdName d2 && 
      eqWithHsTyVars (tcdTyVars d1) (tcdTyVars d2) (\ env -> 
   	  eq_hsContext env (tcdCtxt d1) (tcdCtxt d2)  &&
	  eqListBy (eq_hsFD env) (tcdFDs d1) (tcdFDs d2) &&
	  eqListBy (eq_cls_sig env) (tcdSigs d1) (tcdSigs d2)
417
418
       )

419
420
  (==) _ _ = False	-- default case

421
422
423
eq_hsFD env (ns1,ms1) (ns2,ms2)
  = eqListBy (eq_hsVar env) ns1 ns2 && eqListBy (eq_hsVar env) ms1 ms2

424
425
426
eq_cls_sig env (ClassOpSig n1 dm1 ty1 _) (ClassOpSig n2 dm2 ty2 _)
  = n1==n2 && dm1 `eq_dm` dm2 && eq_hsType env ty1 ty2
  where
427
	-- Ignore the name of the default method for (DefMeth id)
428
429
430
	-- This is used for comparing declarations before putting
	-- them into interface files, and the name of the default 
	-- method isn't relevant
431
432
433
434
    NoDefMeth  `eq_dm` NoDefMeth  = True
    GenDefMeth `eq_dm` GenDefMeth = True
    DefMeth _  `eq_dm` DefMeth _  = True
    dm1	       `eq_dm` dm2	  = False
435
436

    
437
438
439
\end{code}

\begin{code}
440
countTyClDecls :: [TyClDecl name pat] -> (Int, Int, Int, Int, Int)
441
442
	-- class, data, newtype, synonym decls
countTyClDecls decls 
443
444
445
446
447
 = (length [() | ClassDecl {} <- decls],
    length [() | TySynonym {} <- decls],
    length [() | IfaceSig  {} <- decls],
    length [() | TyData {tcdND = DataType} <- decls],
    length [() | TyData {tcdND = NewType} <- decls])
448
449
450
\end{code}

\begin{code}
451
instance (NamedThing name, Outputable name, Outputable pat)
452
	      => Outputable (TyClDecl name pat) where
453

454
455
    ppr (IfaceSig {tcdName = var, tcdType = ty, tcdIdInfo = info})
	= hsep [ppr var, dcolon, ppr ty, pprHsIdInfo info]
456

457
458
459
    ppr (ForeignType {tcdName = tycon})
	= hsep [ptext SLIT("foreign import type dotnet"), ppr tycon]

460
    ppr (TySynonym {tcdName = tycon, tcdTyVars = tyvars, tcdSynRhs = mono_ty})
461
      = hang (ptext SLIT("type") <+> pp_decl_head [] tycon tyvars <+> equals)
462
	     4 (ppr mono_ty)
463

464
465
466
    ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdName = tycon,
		 tcdTyVars = tyvars, tcdCons = condecls, tcdNCons = ncons,
		 tcdDerivs = derivings})
467
      = pp_tydecl (ptext keyword <+> pp_decl_head context tycon tyvars)
468
		  (pp_condecls condecls ncons)
469
		  derivings
sof's avatar
sof committed
470
471
472
473
      where
	keyword = case new_or_data of
			NewType  -> SLIT("newtype")
			DataType -> SLIT("data")
474

475
476
    ppr (ClassDecl {tcdCtxt = context, tcdName = clas, tcdTyVars = tyvars, tcdFDs = fds,
		    tcdSigs = sigs, tcdMeths = methods})
477
478
479
480
481
      | null sigs	-- No "where" part
      = top_matter

      | otherwise	-- Laid out
      = sep [hsep [top_matter, ptext SLIT("where {")],
482
	     nest 4 (sep [sep (map ppr_sig sigs), pp_methods, char '}'])]
483
      where
484
        top_matter  = ptext SLIT("class") <+> pp_decl_head context clas tyvars <+> pprFundeps fds
485
	ppr_sig sig = ppr sig <> semi
486
487
488
489
490
	pp_methods = getPprStyle $ \ sty ->
        	     if ifaceStyle sty then empty else ppr methods
        
pp_decl_head :: Outputable name => HsContext name -> name -> [HsTyVarBndr name] -> SDoc
pp_decl_head context thing tyvars = hsep [pprHsContext context, ppr thing, interppSP tyvars]
491

492
pp_condecls []     ncons = ptext SLIT("{- abstract with") <+> int ncons <+> ptext SLIT("constructors -}")
493
pp_condecls (c:cs) ncons = equals <+> sep (ppr c : map (\ c -> ptext SLIT("|") <+> ppr c) cs)
494

495
pp_tydecl pp_head pp_decl_rhs derivings
sof's avatar
sof committed
496
  = hang pp_head 4 (sep [
497
	pp_decl_rhs,
498
499
500
	case derivings of
	  Nothing 	   -> empty
	  Just ds	   -> hsep [ptext SLIT("deriving"), parens (interpp'SP ds)]
501
    ])
502
503
504
505
506
507
508
509
510
511
512
\end{code}


%************************************************************************
%*									*
\subsection[ConDecl]{A data-constructor declaration}
%*									*
%************************************************************************

\begin{code}
data ConDecl name
513
514
515
516
517
  = ConDecl 	name			-- Constructor name; this is used for the
					-- DataCon itself, and for the user-callable wrapper Id

		name			-- Name of the constructor's 'worker Id'
					-- Filled in as the ConDecl is built
518

519
		[HsTyVarBndr name]	-- Existentially quantified type variables
520
		(HsContext name)	-- ...and context
521
522
					-- If both are empty then there are no existentials

sof's avatar
sof committed
523
		(ConDetails name)
524
525
		SrcLoc

sof's avatar
sof committed
526
527
528
529
530
531
data ConDetails name
  = VanillaCon			-- prefix-style con decl
		[BangType name]

  | InfixCon			-- infix-style con decl
		(BangType name)
532
533
		(BangType name)

sof's avatar
sof committed
534
  | RecCon			-- record-style con decl
535
		[([name], BangType name)]	-- list of "fields"
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
\end{code}

\begin{code}
conDeclsNames :: Eq name => [ConDecl name] -> [(name,SrcLoc)]
  -- See tyClDeclNames for what this does
  -- The function is boringly complicated because of the records
  -- And since we only have equality, we have to be a little careful
conDeclsNames cons
  = snd (foldl do_one ([], []) cons)
  where
    do_one (flds_seen, acc) (ConDecl name _ _ _ details loc)
	= do_details ((name,loc):acc) details
	where
	  do_details acc (RecCon flds) = foldl do_fld (flds_seen, acc) flds
	  do_details acc other	       = (flds_seen, acc)

	  do_fld acc (flds, _) = foldl do_fld1 acc flds
553

554
555
556
557
558
559
	  do_fld1 (flds_seen, acc) fld
		| fld `elem` flds_seen = (flds_seen,acc)
		| otherwise	       = (fld:flds_seen, (fld,loc):acc)
\end{code}

\begin{code}
560
561
562
563
564
565
conDetailsTys :: ConDetails name -> [HsType name]
conDetailsTys (VanillaCon btys)    = map getBangType btys
conDetailsTys (InfixCon bty1 bty2) = [getBangType bty1, getBangType bty2]
conDetailsTys (RecCon fields)	   = [getBangType bty | (_, bty) <- fields]


566
567
568
eq_ConDecl env (ConDecl n1 _ tvs1 cxt1 cds1 _)
	       (ConDecl n2 _ tvs2 cxt2 cds2 _)
  = n1 == n2 &&
569
    (eq_hsTyVars env tvs1 tvs2	$ \ env ->
570
571
572
573
574
575
576
577
578
579
580
581
     eq_hsContext env cxt1 cxt2	&&
     eq_ConDetails env cds1 cds2)

eq_ConDetails env (VanillaCon bts1) (VanillaCon bts2)
  = eqListBy (eq_btype env) bts1 bts2
eq_ConDetails env (InfixCon bta1 btb1) (InfixCon bta2 btb2)
  = eq_btype env bta1 bta2 && eq_btype env btb1 btb2
eq_ConDetails env (RecCon fs1) (RecCon fs2)
  = eqListBy (eq_fld env) fs1 fs2
eq_ConDetails env _ _ = False

eq_fld env (ns1,bt1) (ns2, bt2) = ns1==ns2 && eq_btype env bt1 bt2
582
\end{code}
583
  
584
\begin{code}
585
586
587
588
589
590
591
592
data BangType name = BangType StrictnessMark (HsType name)

getBangType       (BangType _ ty) = ty
getBangStrictness (BangType s _)  = s

unbangedType ty = BangType NotMarkedStrict ty

eq_btype env (BangType s1 t1) (BangType s2 t2) = s1==s2 && eq_hsType env t1 t2
593
594
595
\end{code}

\begin{code}
596
instance (Outputable name) => Outputable (ConDecl name) where
597
    ppr (ConDecl con _ tvs cxt con_details  loc)
598
      = sep [pprHsForAll tvs cxt, ppr_con_details con con_details]
599

600
601
ppr_con_details con (InfixCon ty1 ty2)
  = hsep [ppr_bang ty1, ppr con, ppr_bang ty2]
602

603
604
ppr_con_details con (VanillaCon tys)
  = ppr con <+> hsep (map (ppr_bang) tys)
sof's avatar
sof committed
605

606
607
ppr_con_details con (RecCon fields)
  = ppr con <+> braces (hsep (punctuate comma (map ppr_field fields)))
sof's avatar
sof committed
608
  where
609
    ppr_field (ns, ty) = hsep (map (ppr) ns) <+> 
610
			 dcolon <+>
611
			 ppr_bang ty
sof's avatar
sof committed
612

613
614
615
instance Outputable name => Outputable (BangType name) where
    ppr = ppr_bang

616
ppr_bang (BangType s ty) = ppr s <> pprParendHsType ty
617
618
619
620
621
\end{code}


%************************************************************************
%*									*
sof's avatar
sof committed
622
\subsection[InstDecl]{An instance declaration
623
624
625
626
%*									*
%************************************************************************

\begin{code}
627
data InstDecl name pat
628
  = InstDecl	(HsType name)	-- Context => Class Instance-type
629
630
631
				-- Using a polytype means that the renamer conveniently
				-- figures out the quantified type variables for us.

632
		(MonoBinds name pat)
633

634
		[Sig name]		-- User-supplied pragmatic info
635

636
637
		(Maybe name)		-- Name for the dictionary function
					-- Nothing for source-file instance decls
638
639
640
641
642

		SrcLoc
\end{code}

\begin{code}
643
instance (Outputable name, Outputable pat)
644
	      => Outputable (InstDecl name pat) where
645

646
    ppr (InstDecl inst_ty binds uprags maybe_dfun_name src_loc)
647
      = getPprStyle $ \ sty ->
648
        if ifaceStyle sty then
649
           hsep [ptext SLIT("instance"), ppr inst_ty, equals, pp_dfun]
650
651
652
653
	else
	   vcat [hsep [ptext SLIT("instance"), ppr inst_ty, ptext SLIT("where")],
	         nest 4 (ppr uprags),
	         nest 4 (ppr binds) ]
654
655
656
657
      where
	pp_dfun = case maybe_dfun_name of
		    Just df -> ppr df
		    Nothing -> empty
658
659
\end{code}

660
661
662
663
664
665
666
\begin{code}
instance Ord name => Eq (InstDecl name pat) where
	-- Used for interface comparison only, so don't compare bindings
  (==) (InstDecl inst_ty1 _ _ dfun1 _) (InstDecl inst_ty2 _ _ dfun2 _)
       = inst_ty1 == inst_ty2 && dfun1 == dfun2
\end{code}

667
668
669
670
671
672
673
674
675
676
677
678
679

%************************************************************************
%*									*
\subsection[DefaultDecl]{A @default@ declaration}
%*									*
%************************************************************************

There can only be one default declaration per module, but it is hard
for the parser to check that; we pass them all through in the abstract
syntax, and that restriction must be checked in the front end.

\begin{code}
data DefaultDecl name
680
  = DefaultDecl	[HsType name]
681
682
		SrcLoc

683
instance (Outputable name)
684
685
	      => Outputable (DefaultDecl name) where

686
687
    ppr (DefaultDecl tys src_loc)
      = ptext SLIT("default") <+> parens (interpp'SP tys)
688
\end{code}
689

sof's avatar
sof committed
690
691
692
693
694
695
696
%************************************************************************
%*									*
\subsection{Foreign function interface declaration}
%*									*
%************************************************************************

\begin{code}
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
data ForeignDecl name
  = ForeignImport name (HsType name) FoImport 	  SrcLoc
  | ForeignExport name (HsType name) FoExport 	  SrcLoc

forDeclName (ForeignImport n _ _ _) = n
forDeclName (ForeignExport n _ _ _) = n

data FoImport 
  = LblImport  CLabelString	-- foreign label
  | CImport    CCallSpec	-- foreign import 
  | CDynImport CCallConv	-- foreign export dynamic
  | DNImport   DNCallSpec	-- foreign import dotnet

data FoExport = CExport CExportSpec

data FoType = DNType 		-- In due course we'll add subtype stuff
	    deriving( Eq )	-- Used for equality instance for TyClDecl

instance Outputable name => Outputable (ForeignDecl name) where
  ppr (ForeignImport nm ty (LblImport lbl) src_loc)
    = ptext SLIT("foreign label") <+> ppr lbl <+> ppr nm <+> dcolon <+> ppr ty
  ppr (ForeignImport nm ty decl src_loc)
    = ptext SLIT("foreign import") <+> ppr decl <+> ppr nm <+> dcolon <+> ppr ty
  ppr (ForeignExport nm ty decl src_loc)
    = ptext SLIT("foreign export") <+> ppr decl <+> ppr nm <+> dcolon <+> ppr ty

instance Outputable FoImport where
   ppr (CImport  d)      = ppr d
   ppr (CDynImport conv) = text "dynamic" <+> ppr conv
   ppr (DNImport d)   	 = ptext SLIT("dotnet") <+> ppr d
   ppr (LblImport l)  	 = ptext SLIT("label") <+> ppr l

instance Outputable FoExport where
   ppr (CExport d) = ppr d

instance Outputable FoType where
   ppr DNType = ptext SLIT("type dotnet")
sof's avatar
sof committed
734
735
\end{code}

736

737
738
%************************************************************************
%*									*
739
\subsection{Transformation rules}
740
741
742
743
%*									*
%************************************************************************

\begin{code}
744
data RuleDecl name pat
745
  = HsRule			-- Source rule
746
747
748
749
750
751
752
753
	FAST_STRING		-- Rule name
	[name]			-- Forall'd tyvars, filled in by the renamer with
				-- tyvars mentioned in sigs; then filled out by typechecker
	[RuleBndr name]		-- Forall'd term vars
	(HsExpr name pat)	-- LHS
	(HsExpr name pat)	-- RHS
	SrcLoc		

754
755
756
757
758
759
  | IfaceRule	 		-- One that's come in from an interface file; pre-typecheck
	FAST_STRING
	[UfBinder name]		-- Tyvars and term vars
	name			-- Head of lhs
	[UfExpr name]		-- Args of LHS
	(UfExpr name)		-- Pre typecheck
760
761
	SrcLoc		

762
763
764
765
  | IfaceRuleOut		-- Post typecheck
	name			-- Head of LHS
	CoreRule

766
767
isIfaceRuleDecl (HsRule _ _ _ _ _ _) = False
isIfaceRuleDecl other		     = True
768

769
770
771
772
773
ifaceRuleDeclName :: RuleDecl name pat -> name
ifaceRuleDeclName (IfaceRule _ _ n _ _ _) = n
ifaceRuleDeclName (IfaceRuleOut n r)	  = n
ifaceRuleDeclName (HsRule fs _ _ _ _ _)   = pprPanic "ifaceRuleDeclName" (ppr fs)

774
775
776
data RuleBndr name
  = RuleBndr name
  | RuleBndrSig name (HsType name)
777

778
instance (NamedThing name, Ord name) => Eq (RuleDecl name pat) where
779
780
781
782
783
784
  -- Works for IfaceRules only; used when comparing interface file versions
  (IfaceRule n1 bs1 f1 es1 rhs1 _) == (IfaceRule n2 bs2 f2 es2 rhs2 _)
     = n1==n2 && f1 == f2 && 
       eq_ufBinders emptyEqHsEnv bs1 bs2 (\env -> 
       eqListBy (eq_ufExpr env) (rhs1:es1) (rhs2:es2))

785
instance (NamedThing name, Outputable name, Outputable pat)
786
	      => Outputable (RuleDecl name pat) where
787
  ppr (HsRule name tvs ns lhs rhs loc)
788
789
790
	= sep [text "{-# RULES" <+> doubleQuotes (ptext name),
	       pp_forall, ppr lhs, equals <+> ppr rhs,
               text "#-}" ]
791
792
793
794
795
	where
	  pp_forall | null tvs && null ns = empty
		    | otherwise		  = text "forall" <+> 
					    fsep (map ppr tvs ++ map ppr ns)
					    <> dot
796
797
798
799
800
801
802
803
804

  ppr (IfaceRule name tpl_vars fn tpl_args rhs loc) 
    = hsep [ doubleQuotes (ptext name),
	   ptext SLIT("__forall") <+> braces (interppSP tpl_vars),
	   ppr fn <+> sep (map (pprUfExpr parens) tpl_args),
	   ptext SLIT("=") <+> ppr rhs
      ] <+> semi

  ppr (IfaceRuleOut fn rule) = pprCoreRule (ppr fn) rule
805
806
807
808

instance Outputable name => Outputable (RuleBndr name) where
   ppr (RuleBndr name) = ppr name
   ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty
809
810
811
812
813
814
815
816
817
\end{code}


%************************************************************************
%*									*
\subsection[DeprecDecl]{Deprecations}
%*									*
%************************************************************************

818
We use exported entities for things to deprecate.
819
820

\begin{code}
821
data DeprecDecl name = Deprecation name DeprecTxt SrcLoc
822
823
824
825

type DeprecTxt = FAST_STRING	-- reason/explanation for deprecation

instance Outputable name => Outputable (DeprecDecl name) where
826
    ppr (Deprecation thing txt _)
827
      = hsep [text "{-# DEPRECATED", ppr thing, doubleQuotes (ppr txt), text "#-}"]
828
\end{code}