HsDecls.lhs 26.5 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
	DefaultDecl(..), ForeignDecl(..), ForKind(..),
13
	ExtName(..), isDynamicExtName, extNameStatic,
14
	ConDecl(..), ConDetails(..), 
15
	BangType(..), getBangType, getBangStrictness, unbangedType,
16
	DeprecDecl(..), DeprecTxt,
17
	hsDeclName, instDeclName, tyClDeclName, tyClDeclNames, tyClDeclSysNames,
18
	isClassDecl, isSynDecl, isDataDecl, isIfaceSigDecl, countTyClDecls,
19
	mkClassDeclSysNames, isIfaceRuleDecl, ifaceRuleDeclName,
20
	getClassDeclSysNames, conDetailsTys
21
    ) where
22

23
#include "HsVersions.h"
24 25

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

-- others:
39
import ForeignCall	( Safety )
40
import Name		( NamedThing )
41
import FunDeps		( pprFundeps )
42
import Class		( FunDep, DefMeth(..) )
43
import CStrings		( CLabelString, pprCLabelString )
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    (ForeignDecl name _ _ _ _ _))   = name
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
data TyClDecl name pat
253 254 255 256 257 258 259 260 261 262 263 264 265
  = IfaceSig {	tcdName :: name,		-- It may seem odd to classify an interface-file signature
		tcdType :: HsType name,		-- as a 'TyClDecl', but it's very convenient.  These three
		tcdIdInfo :: [HsIdInfo name],	-- are the kind that appear in interface files.
		tcdLoc :: SrcLoc
    }

  | 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
266 267 268
				 -- (i.e., derive default); Just [] => derive
				 -- *nothing*; Just <list> => as you would
				 -- expect...
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
		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
    }
290 291 292 293 294 295 296
\end{code}

Simple classifiers

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

297 298
isIfaceSigDecl (IfaceSig {}) = True
isIfaceSigDecl other	     = False
299

300 301
isSynDecl (TySynonym {}) = True
isSynDecl other		 = False
302

303 304
isDataDecl (TyData {}) = True
isDataDecl other       = False
305

306 307
isClassDecl (ClassDecl {}) = True
isClassDecl other	   = False
308 309 310
\end{code}

Dealing with names
311

312
\begin{code}
313
--------------------------------
314
tyClDeclName :: TyClDecl name pat -> name
315
tyClDeclName tycl_decl = tcdName tycl_decl
316

317
--------------------------------
318
tyClDeclNames :: Eq name => TyClDecl name pat -> [(name, SrcLoc)]
319
-- Returns all the *binding* names of the decl, along with their SrcLocs
320 321 322 323
-- 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

324 325
tyClDeclNames (TySynonym {tcdName = name, tcdLoc = loc})  = [(name,loc)]
tyClDeclNames (IfaceSig  {tcdName = name, tcdLoc = loc})  = [(name,loc)]
326

327
tyClDeclNames (ClassDecl {tcdName = cls_name, tcdSigs = sigs, tcdLoc = loc})
328
  = (cls_name,loc) : [(n,loc) | ClassOpSig n _ _ loc <- sigs]
329

330
tyClDeclNames (TyData {tcdName = tc_name, tcdCons = cons, tcdLoc = loc})
331
  = (tc_name,loc) : conDeclsNames cons
332 333


334
--------------------------------
335
-- The "system names" are extra implicit names *bound* by the decl.
336 337 338 339 340 341 342 343 344 345 346 347 348 349
-- 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

350 351 352 353
tyClDeclSysNames :: TyClDecl name pat -> [(name, SrcLoc)]
-- Similar to tyClDeclNames, but returns the "implicit" 
-- or "system" names of the declaration

354
tyClDeclSysNames (ClassDecl {tcdSysNames = names, tcdLoc = loc})
355
  = [(n,loc) | n <- names]
356 357 358 359
tyClDeclSysNames (TyData {tcdCons = cons, tcdSysNames = names, tcdLoc = loc})
  = [(n,loc) | n <- names] ++ 
    [(wkr_name,loc) | ConDecl _ wkr_name _ _ _ loc <- cons]
tyClDeclSysNames decl = []
360

361 362 363 364 365 366 367 368

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}
369
instance (NamedThing name, Ord name) => Eq (TyClDecl name pat) where
370
	-- Used only when building interface files
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
  (==) d1@(IfaceSig {}) d2@(IfaceSig {})
      = tcdName d1 == tcdName d2 && 
	tcdType d1 == tcdType d2 && 
	tcdIdInfo d1 == tcdIdInfo d2

  (==) 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)
396 397
       )

398 399
  (==) _ _ = False	-- default case

400 401 402
eq_hsFD env (ns1,ms1) (ns2,ms2)
  = eqListBy (eq_hsVar env) ns1 ns2 && eqListBy (eq_hsVar env) ms1 ms2

403 404 405
eq_cls_sig env (ClassOpSig n1 dm1 ty1 _) (ClassOpSig n2 dm2 ty2 _)
  = n1==n2 && dm1 `eq_dm` dm2 && eq_hsType env ty1 ty2
  where
406
	-- Ignore the name of the default method for (DefMeth id)
407 408 409
	-- This is used for comparing declarations before putting
	-- them into interface files, and the name of the default 
	-- method isn't relevant
410 411 412 413
    NoDefMeth  `eq_dm` NoDefMeth  = True
    GenDefMeth `eq_dm` GenDefMeth = True
    DefMeth _  `eq_dm` DefMeth _  = True
    dm1	       `eq_dm` dm2	  = False
414 415

    
416 417 418
\end{code}

\begin{code}
419
countTyClDecls :: [TyClDecl name pat] -> (Int, Int, Int, Int, Int)
420 421
	-- class, data, newtype, synonym decls
countTyClDecls decls 
422 423 424 425 426
 = (length [() | ClassDecl {} <- decls],
    length [() | TySynonym {} <- decls],
    length [() | IfaceSig  {} <- decls],
    length [() | TyData {tcdND = DataType} <- decls],
    length [() | TyData {tcdND = NewType} <- decls])
427 428 429
\end{code}

\begin{code}
430
instance (NamedThing name, Outputable name, Outputable pat)
431
	      => Outputable (TyClDecl name pat) where
432

433 434
    ppr (IfaceSig {tcdName = var, tcdType = ty, tcdIdInfo = info})
	= hsep [ppr var, dcolon, ppr ty, pprHsIdInfo info]
435

436
    ppr (TySynonym {tcdName = tycon, tcdTyVars = tyvars, tcdSynRhs = mono_ty})
437
      = hang (ptext SLIT("type") <+> pp_decl_head [] tycon tyvars <+> equals)
438
	     4 (ppr mono_ty)
439

440 441 442 443
    ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdName = tycon,
		 tcdTyVars = tyvars, tcdCons = condecls, tcdNCons = ncons,
		 tcdDerivs = derivings})
      = pp_tydecl (ptext keyword <+> pp_decl_head context tycon tyvars <+> equals)
444
		  (pp_condecls condecls ncons)
445
		  derivings
sof's avatar
sof committed
446 447 448 449
      where
	keyword = case new_or_data of
			NewType  -> SLIT("newtype")
			DataType -> SLIT("data")
450

451 452
    ppr (ClassDecl {tcdCtxt = context, tcdName = clas, tcdTyVars = tyvars, tcdFDs = fds,
		    tcdSigs = sigs, tcdMeths = methods})
453 454 455 456 457
      | null sigs	-- No "where" part
      = top_matter

      | otherwise	-- Laid out
      = sep [hsep [top_matter, ptext SLIT("where {")],
458
	     nest 4 (sep [sep (map ppr_sig sigs), pp_methods, char '}'])]
459
      where
460
        top_matter  = ptext SLIT("class") <+> pp_decl_head context clas tyvars <+> pprFundeps fds
461
	ppr_sig sig = ppr sig <> semi
462 463 464 465 466
	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]
467

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

471
pp_tydecl pp_head pp_decl_rhs derivings
sof's avatar
sof committed
472
  = hang pp_head 4 (sep [
473
	pp_decl_rhs,
474 475 476
	case derivings of
	  Nothing 	   -> empty
	  Just ds	   -> hsep [ptext SLIT("deriving"), parens (interpp'SP ds)]
477
    ])
478 479 480 481 482 483 484 485 486 487 488
\end{code}


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

\begin{code}
data ConDecl name
489 490 491 492 493
  = 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
494

495
		[HsTyVarBndr name]	-- Existentially quantified type variables
496
		(HsContext name)	-- ...and context
497 498
					-- If both are empty then there are no existentials

sof's avatar
sof committed
499
		(ConDetails name)
500 501
		SrcLoc

sof's avatar
sof committed
502 503 504 505 506 507
data ConDetails name
  = VanillaCon			-- prefix-style con decl
		[BangType name]

  | InfixCon			-- infix-style con decl
		(BangType name)
508 509
		(BangType name)

sof's avatar
sof committed
510
  | RecCon			-- record-style con decl
511
		[([name], BangType name)]	-- list of "fields"
512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
\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
529

530 531 532 533 534 535
	  do_fld1 (flds_seen, acc) fld
		| fld `elem` flds_seen = (flds_seen,acc)
		| otherwise	       = (fld:flds_seen, (fld,loc):acc)
\end{code}

\begin{code}
536 537 538 539 540 541
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]


542 543 544
eq_ConDecl env (ConDecl n1 _ tvs1 cxt1 cds1 _)
	       (ConDecl n2 _ tvs2 cxt2 cds2 _)
  = n1 == n2 &&
545
    (eq_hsTyVars env tvs1 tvs2	$ \ env ->
546 547 548 549 550 551 552 553 554 555 556 557
     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
558
\end{code}
559
  
560
\begin{code}
561 562 563 564 565 566 567 568
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
569 570 571
\end{code}

\begin{code}
572
instance (Outputable name) => Outputable (ConDecl name) where
573
    ppr (ConDecl con _ tvs cxt con_details  loc)
574
      = sep [pprHsForAll tvs cxt, ppr_con_details con con_details]
575

576 577
ppr_con_details con (InfixCon ty1 ty2)
  = hsep [ppr_bang ty1, ppr con, ppr_bang ty2]
578

579 580
ppr_con_details con (VanillaCon tys)
  = ppr con <+> hsep (map (ppr_bang) tys)
sof's avatar
sof committed
581

582 583
ppr_con_details con (RecCon fields)
  = ppr con <+> braces (hsep (punctuate comma (map ppr_field fields)))
sof's avatar
sof committed
584
  where
585
    ppr_field (ns, ty) = hsep (map (ppr) ns) <+> 
586
			 dcolon <+>
587
			 ppr_bang ty
sof's avatar
sof committed
588

589 590 591
instance Outputable name => Outputable (BangType name) where
    ppr = ppr_bang

592
ppr_bang (BangType s ty) = ppr s <> pprParendHsType ty
593 594 595 596 597
\end{code}


%************************************************************************
%*									*
sof's avatar
sof committed
598
\subsection[InstDecl]{An instance declaration
599 600 601 602
%*									*
%************************************************************************

\begin{code}
603
data InstDecl name pat
604
  = InstDecl	(HsType name)	-- Context => Class Instance-type
605 606 607
				-- Using a polytype means that the renamer conveniently
				-- figures out the quantified type variables for us.

608
		(MonoBinds name pat)
609

610
		[Sig name]		-- User-supplied pragmatic info
611

612 613
		(Maybe name)		-- Name for the dictionary function
					-- Nothing for source-file instance decls
614 615 616 617 618

		SrcLoc
\end{code}

\begin{code}
619
instance (Outputable name, Outputable pat)
620
	      => Outputable (InstDecl name pat) where
621

622
    ppr (InstDecl inst_ty binds uprags maybe_dfun_name src_loc)
623
      = getPprStyle $ \ sty ->
624
        if ifaceStyle sty then
625
           hsep [ptext SLIT("instance"), ppr inst_ty, equals, pp_dfun]
626 627 628 629
	else
	   vcat [hsep [ptext SLIT("instance"), ppr inst_ty, ptext SLIT("where")],
	         nest 4 (ppr uprags),
	         nest 4 (ppr binds) ]
630 631 632 633
      where
	pp_dfun = case maybe_dfun_name of
		    Just df -> ppr df
		    Nothing -> empty
634 635
\end{code}

636 637 638 639 640 641 642
\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}

643 644 645 646 647 648 649 650 651 652 653 654 655

%************************************************************************
%*									*
\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
656
  = DefaultDecl	[HsType name]
657 658
		SrcLoc

659
instance (Outputable name)
660 661
	      => Outputable (DefaultDecl name) where

662 663
    ppr (DefaultDecl tys src_loc)
      = ptext SLIT("default") <+> parens (interpp'SP tys)
664
\end{code}
665

sof's avatar
sof committed
666 667 668 669 670 671 672 673 674 675
%************************************************************************
%*									*
\subsection{Foreign function interface declaration}
%*									*
%************************************************************************

\begin{code}
data ForeignDecl name = 
   ForeignDecl 
        name 
sof's avatar
sof committed
676
	ForKind   
sof's avatar
sof committed
677 678
	(HsType name)
	ExtName
679
	CCallConv
sof's avatar
sof committed
680 681
	SrcLoc

682
instance (Outputable name)
sof's avatar
sof committed
683 684 685
	      => Outputable (ForeignDecl name) where

    ppr (ForeignDecl nm imp_exp ty ext_name cconv src_loc)
686
      = ptext SLIT("foreign") <+> ppr_imp_exp <+> ppr cconv <+> 
687
        ppr ext_name <+> ppr_unsafe <+> ppr nm <+> dcolon <+> ppr ty
sof's avatar
sof committed
688 689 690
        where
         (ppr_imp_exp, ppr_unsafe) =
	   case imp_exp of
sof's avatar
sof committed
691 692
	     FoLabel     -> (ptext SLIT("label"), empty)
	     FoExport    -> (ptext SLIT("export"), empty)
693
	     FoImport us -> (ptext SLIT("import"), ppr us)
sof's avatar
sof committed
694 695 696 697

data ForKind
 = FoLabel
 | FoExport
698
 | FoImport Safety
sof's avatar
sof committed
699 700 701

data ExtName
 = Dynamic 
702 703 704 705 706 707 708 709 710 711 712 713
 | ExtName CLabelString 	-- The external name of the foreign thing,
	   (Maybe CLabelString)	-- and optionally its DLL or module name
				-- Both of these are completely unencoded; 
				-- we just print them as they are

isDynamicExtName :: ExtName -> Bool
isDynamicExtName Dynamic = True
isDynamicExtName _	 = False

extNameStatic :: ExtName -> CLabelString
extNameStatic (ExtName f _) = f
extNameStatic Dynamic	    = panic "staticExtName: Dynamic - shouldn't ever happen."
sof's avatar
sof committed
714 715 716 717 718

instance Outputable ExtName where
  ppr Dynamic	   = ptext SLIT("dynamic")
  ppr (ExtName nm mb_mod) = 
     case mb_mod of { Nothing -> empty; Just m -> doubleQuotes (ptext m) } <+> 
719
     doubleQuotes (pprCLabelString nm)
sof's avatar
sof committed
720 721
\end{code}

722 723
%************************************************************************
%*									*
724
\subsection{Transformation rules}
725 726 727 728
%*									*
%************************************************************************

\begin{code}
729
data RuleDecl name pat
730
  = HsRule			-- Source rule
731 732 733 734 735 736 737 738
	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		

739 740 741 742 743 744
  | 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
745 746
	SrcLoc		

747 748 749 750
  | IfaceRuleOut		-- Post typecheck
	name			-- Head of LHS
	CoreRule

751 752
isIfaceRuleDecl (HsRule _ _ _ _ _ _) = False
isIfaceRuleDecl other		     = True
753

754 755 756 757 758
ifaceRuleDeclName :: RuleDecl name pat -> name
ifaceRuleDeclName (IfaceRule _ _ n _ _ _) = n
ifaceRuleDeclName (IfaceRuleOut n r)	  = n
ifaceRuleDeclName (HsRule fs _ _ _ _ _)   = pprPanic "ifaceRuleDeclName" (ppr fs)

759 760 761
data RuleBndr name
  = RuleBndr name
  | RuleBndrSig name (HsType name)
762

763
instance (NamedThing name, Ord name) => Eq (RuleDecl name pat) where
764 765 766 767 768 769
  -- 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))

770
instance (NamedThing name, Outputable name, Outputable pat)
771
	      => Outputable (RuleDecl name pat) where
772
  ppr (HsRule name tvs ns lhs rhs loc)
773 774 775
	= sep [text "{-# RULES" <+> doubleQuotes (ptext name),
	       pp_forall, ppr lhs, equals <+> ppr rhs,
               text "#-}" ]
776 777 778 779 780
	where
	  pp_forall | null tvs && null ns = empty
		    | otherwise		  = text "forall" <+> 
					    fsep (map ppr tvs ++ map ppr ns)
					    <> dot
781 782 783 784 785 786 787 788 789

  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
790 791 792 793

instance Outputable name => Outputable (RuleBndr name) where
   ppr (RuleBndr name) = ppr name
   ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty
794 795 796 797 798 799 800 801 802
\end{code}


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

803
We use exported entities for things to deprecate.
804 805

\begin{code}
806
data DeprecDecl name = Deprecation name DeprecTxt SrcLoc
807 808 809 810

type DeprecTxt = FAST_STRING	-- reason/explanation for deprecation

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