HsDecls.lhs 31.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(..), 
chak's avatar
chak committed
13 14
	ForeignDecl(..), ForeignImport(..), ForeignExport(..),
	CImportSpec(..), FoType(..),
15
	ConDecl(..), ConDetails(..), 
16
	BangType(..), getBangType, getBangStrictness, unbangedType,
17
	DeprecDecl(..), DeprecTxt,
18 19
	hsDeclName, instDeclName, 
	tyClDeclName, tyClDeclNames, tyClDeclSysNames, tyClDeclTyVars,
sof's avatar
sof committed
20
	isClassDecl, isSynDecl, isDataDecl, isIfaceSigDecl, isCoreDecl,
21
	isTypeOrClassDecl, countTyClDecls,
22
	mkClassDeclSysNames, isSourceInstDecl, ifaceRuleDeclName,
23 24
	getClassDeclSysNames, conDetailsTys,
	collectRuleBndrSigTys
25
    ) where
26

27
#include "HsVersions.h"
28 29

-- friends:
30
import HsBinds		( HsBinds, MonoBinds, Sig(..), FixitySig(..) )
31
import HsExpr		( HsExpr )
32
import HsImpExp		( ppr_var )
33
import HsTypes
34
import PprCore		( pprCoreRule )
35 36
import HsCore		( UfExpr, UfBinder, HsIdInfo, pprHsIdInfo,
			  eq_ufBinders, eq_ufExpr, pprUfExpr 
37
			)
38 39
import CoreSyn		( CoreRule(..), RuleName )
import BasicTypes	( NewOrData(..), StrictnessMark(..), Activation(..) )
chak's avatar
chak committed
40 41
import ForeignCall	( CCallTarget(..), DNCallSpec, CCallConv, Safety,
			  CExportSpec(..)) 
42 43

-- others:
44
import Name		( NamedThing )
45
import FunDeps		( pprFundeps )
46
import TyCon		( DataConDetails(..), visibleDataCons )
47
import Class		( FunDep, DefMeth(..) )
48
import CStrings		( CLabelString )
49
import Outputable	
sof's avatar
sof committed
50
import Util		( eqListBy, count )
51
import SrcLoc		( SrcLoc )
rrt's avatar
rrt committed
52
import FastString
53

54
import Maybe		( isNothing, fromJust )	
55 56
\end{code}

57 58 59 60 61 62 63 64

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

\begin{code}
65 66 67
data HsDecl name pat
  = TyClD	(TyClDecl name pat)
  | InstD	(InstDecl  name pat)
68
  | DefD	(DefaultDecl name)
69
  | ValD	(HsBinds name pat)
sof's avatar
sof committed
70
  | ForD        (ForeignDecl name)
71
  | FixD	(FixitySig name)
72
  | DeprecD	(DeprecDecl name)
73
  | RuleD	(RuleDecl name pat)
74 75 76 77 78 79 80 81 82 83 84 85 86

-- 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
87 88 89
\end{code}

\begin{code}
sof's avatar
sof committed
90
#ifdef DEBUG
91
hsDeclName :: (NamedThing name, Outputable name, Outputable pat)
92
	   => HsDecl name pat -> name
sof's avatar
sof committed
93
#endif
chak's avatar
chak committed
94 95 96 97
hsDeclName (TyClD decl)			= tyClDeclName     decl
hsDeclName (InstD decl)		        = instDeclName     decl
hsDeclName (ForD  decl)		        = foreignDeclName decl
hsDeclName (FixD  (FixitySig name _ _)) = name
98
-- Others don't make sense
sof's avatar
sof committed
99
#ifdef DEBUG
chak's avatar
chak committed
100
hsDeclName x				= pprPanic "HsDecls.hsDeclName" (ppr x)
sof's avatar
sof committed
101
#endif
102

103 104 105

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

107 108 109
\end{code}

\begin{code}
110
instance (NamedThing name, Outputable name, Outputable pat)
111
	=> Outputable (HsDecl name pat) where
112

113
    ppr (TyClD dcl)  = ppr dcl
114 115 116
    ppr (ValD binds) = ppr binds
    ppr (DefD def)   = ppr def
    ppr (InstD inst) = ppr inst
sof's avatar
sof committed
117
    ppr (ForD fd)    = ppr fd
118
    ppr (FixD fd)    = ppr fd
119
    ppr (RuleD rd)   = ppr rd
120 121 122
    ppr (DeprecD dd) = ppr dd
\end{code}

123

124 125 126 127 128 129
%************************************************************************
%*									*
\subsection[TyDecl]{@data@, @newtype@ or @type@ (synonym) type declaration}
%*									*
%************************************************************************

130 131 132
		--------------------------------
			THE NAMING STORY
		--------------------------------
133

134 135 136 137 138
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
  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
157
   This is done in RdrHsSyn.mkClassDecl, mkTyDecl, mkConDecl
158 159 160

 - Ensure they "point to" the parent data/class decl 
   when loading that decl from an interface file
161
   (See RnHiFiles.getTyClDeclSysNames)
162 163 164 165

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

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
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

242
  - The CoreTidy phase externalises the name, and ensures the occurrence name is
243 244 245 246 247 248 249 250 251 252 253 254
    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.
255

256 257
  - RnHsSyn.instDeclFVs treats the dict fun name as free in the decl, so that we
    suck in the dfun binding
258 259


260
\begin{code}
261 262 263 264 265
-- 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

266
data TyClDecl name pat
267
  = IfaceSig {	tcdName :: name,		-- It may seem odd to classify an interface-file signature
268 269
		tcdType :: HsType name,		-- as a 'TyClDecl', but it's very convenient.  
		tcdIdInfo :: [HsIdInfo name],
270 271 272
		tcdLoc :: SrcLoc
    }

rrt's avatar
rrt committed
273 274 275 276
  | ForeignType { tcdName    :: name,		-- See remarks about IfaceSig above
		  tcdExtName :: Maybe FastString,
		  tcdFoType  :: FoType,
		  tcdLoc     :: SrcLoc }
277

278 279 280 281
  | TyData {	tcdND     :: NewOrData,
		tcdCtxt   :: HsContext name,	 -- context
		tcdName   :: name,		 -- type constructor
		tcdTyVars :: [HsTyVarBndr name], -- type variables
282
		tcdCons	  :: DataConDetails (ConDecl name),	 -- data constructors (empty if abstract)
283 284
		tcdDerivs :: Maybe (HsContext name),	-- derivings; Nothing => not specified
							-- Just [] => derive exactly what is asked
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
		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
    }
sof's avatar
sof committed
306 307 308 309 310 311 312
    -- a Core value binding (coming from 'external Core' input.)
  | CoreDecl { tcdName      :: name,  
               tcdType      :: HsType name,
	       tcdRhs       :: UfExpr name,
	       tcdLoc       :: SrcLoc
    }

313 314 315 316 317
\end{code}

Simple classifiers

\begin{code}
sof's avatar
sof committed
318
isIfaceSigDecl, isCoreDecl, isDataDecl, isSynDecl, isClassDecl :: TyClDecl name pat -> Bool
319

320 321
isIfaceSigDecl (IfaceSig {}) = True
isIfaceSigDecl other	     = False
322

323 324
isSynDecl (TySynonym {}) = True
isSynDecl other		 = False
325

326 327
isDataDecl (TyData {}) = True
isDataDecl other       = False
328

329 330
isClassDecl (ClassDecl {}) = True
isClassDecl other	   = False
sof's avatar
sof committed
331

332 333 334 335 336 337
isTypeOrClassDecl (ClassDecl   {}) = True
isTypeOrClassDecl (TyData      {}) = True
isTypeOrClassDecl (TySynonym   {}) = True
isTypeOrClassDecl (ForeignType {}) = True
isTypeOrClassDecl other		   = False

sof's avatar
sof committed
338 339 340
isCoreDecl (CoreDecl {}) = True
isCoreDecl other	 = False

341 342 343
\end{code}

Dealing with names
344

345
\begin{code}
346
--------------------------------
347
tyClDeclName :: TyClDecl name pat -> name
348
tyClDeclName tycl_decl = tcdName tycl_decl
349

350
--------------------------------
351
tyClDeclNames :: Eq name => TyClDecl name pat -> [(name, SrcLoc)]
352
-- Returns all the *binding* names of the decl, along with their SrcLocs
353 354 355 356
-- 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

357 358
tyClDeclNames (TySynonym   {tcdName = name, tcdLoc = loc})  = [(name,loc)]
tyClDeclNames (IfaceSig    {tcdName = name, tcdLoc = loc})  = [(name,loc)]
sof's avatar
sof committed
359
tyClDeclNames (CoreDecl    {tcdName = name, tcdLoc = loc})  = [(name,loc)]
360
tyClDeclNames (ForeignType {tcdName = name, tcdLoc = loc})  = [(name,loc)]
361

362
tyClDeclNames (ClassDecl {tcdName = cls_name, tcdSigs = sigs, tcdLoc = loc})
363
  = (cls_name,loc) : [(n,loc) | ClassOpSig n _ _ loc <- sigs]
364

365
tyClDeclNames (TyData {tcdName = tc_name, tcdCons = cons, tcdLoc = loc})
366
  = (tc_name,loc) : conDeclsNames cons
367 368


369 370 371 372 373
tyClDeclTyVars (TySynonym {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (TyData    {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ClassDecl {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ForeignType {})		     = []
tyClDeclTyVars (IfaceSig {})		     = []
sof's avatar
sof committed
374
tyClDeclTyVars (CoreDecl {})		     = []
375 376


377
--------------------------------
378
-- The "system names" are extra implicit names *bound* by the decl.
379 380 381 382 383 384 385 386 387 388 389 390 391 392
-- 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

393 394 395 396
tyClDeclSysNames :: TyClDecl name pat -> [(name, SrcLoc)]
-- Similar to tyClDeclNames, but returns the "implicit" 
-- or "system" names of the declaration

397
tyClDeclSysNames (ClassDecl {tcdSysNames = names, tcdLoc = loc})
398
  = [(n,loc) | n <- names]
399
tyClDeclSysNames (TyData {tcdCons = DataCons cons, tcdSysNames = names, tcdLoc = loc})
400 401 402
  = [(n,loc) | n <- names] ++ 
    [(wkr_name,loc) | ConDecl _ wkr_name _ _ _ loc <- cons]
tyClDeclSysNames decl = []
403

404 405 406 407 408 409 410 411

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}
412
instance (NamedThing name, Ord name) => Eq (TyClDecl name pat) where
413
	-- Used only when building interface files
414 415 416 417 418
  (==) d1@(IfaceSig {}) d2@(IfaceSig {})
      = tcdName d1 == tcdName d2 && 
	tcdType d1 == tcdType d2 && 
	tcdIdInfo d1 == tcdIdInfo d2

sof's avatar
sof committed
419 420 421 422 423
  (==) d1@(CoreDecl {}) d2@(CoreDecl {})
      = tcdName d1 == tcdName d2 && 
	tcdType d1 == tcdType d2 && 
	tcdRhs d1  == tcdRhs  d2

424 425 426 427
  (==) d1@(ForeignType {}) d2@(ForeignType {})
      = tcdName d1 == tcdName d2 && 
	tcdFoType d1 == tcdFoType d2

428 429 430 431 432
  (==) 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)  &&
433
	  eq_hsCD      env (tcdCons d1) (tcdCons d2)
434 435 436 437 438 439 440 441 442 443 444 445 446 447
	)

  (==) 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)
448 449
       )

450 451
  (==) _ _ = False	-- default case

452 453 454 455 456
eq_hsCD env (DataCons c1) (DataCons c2) = eqListBy (eq_ConDecl env) c1 c2
eq_hsCD env Unknown	  Unknown	= True
eq_hsCD env (HasCons n1)  (HasCons n2)  = n1 == n2
eq_hsCD env d1		  d2		= False

457 458 459
eq_hsFD env (ns1,ms1) (ns2,ms2)
  = eqListBy (eq_hsVar env) ns1 ns2 && eqListBy (eq_hsVar env) ms1 ms2

460 461 462
eq_cls_sig env (ClassOpSig n1 dm1 ty1 _) (ClassOpSig n2 dm2 ty2 _)
  = n1==n2 && dm1 `eq_dm` dm2 && eq_hsType env ty1 ty2
  where
463
	-- Ignore the name of the default method for (DefMeth id)
464 465 466
	-- This is used for comparing declarations before putting
	-- them into interface files, and the name of the default 
	-- method isn't relevant
467 468 469 470
    NoDefMeth  `eq_dm` NoDefMeth  = True
    GenDefMeth `eq_dm` GenDefMeth = True
    DefMeth _  `eq_dm` DefMeth _  = True
    dm1	       `eq_dm` dm2	  = False
471 472

    
473 474 475
\end{code}

\begin{code}
476
countTyClDecls :: [TyClDecl name pat] -> (Int, Int, Int, Int, Int)
477 478
	-- class, data, newtype, synonym decls
countTyClDecls decls 
sof's avatar
sof committed
479 480
 = (count isClassDecl     decls,
    count isSynDecl       decls,
sof's avatar
sof committed
481
    count (\ x -> isIfaceSigDecl x || isCoreDecl x) decls,
sof's avatar
sof committed
482 483 484 485 486 487 488 489
    count isDataTy        decls,
    count isNewTy         decls) 
 where
   isDataTy TyData{tcdND=DataType} = True
   isDataTy _                      = False
   
   isNewTy TyData{tcdND=NewType} = True
   isNewTy _                     = False
490 491 492
\end{code}

\begin{code}
493
instance (NamedThing name, Outputable name, Outputable pat)
494
	      => Outputable (TyClDecl name pat) where
495

496
    ppr (IfaceSig {tcdName = var, tcdType = ty, tcdIdInfo = info})
497
	= getPprStyle $ \ sty ->
498
	   hsep [ ppr_var var, dcolon, ppr ty, pprHsIdInfo info ]
499

500 501 502
    ppr (ForeignType {tcdName = tycon})
	= hsep [ptext SLIT("foreign import type dotnet"), ppr tycon]

503
    ppr (TySynonym {tcdName = tycon, tcdTyVars = tyvars, tcdSynRhs = mono_ty})
504
      = hang (ptext SLIT("type") <+> pp_decl_head [] tycon tyvars <+> equals)
505
	     4 (ppr mono_ty)
506

507
    ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdName = tycon,
508
		 tcdTyVars = tyvars, tcdCons = condecls, 
509
		 tcdDerivs = derivings})
510
      = pp_tydecl (ptext keyword <+> pp_decl_head context tycon tyvars)
511
		  (pp_condecls condecls)
512
		  derivings
sof's avatar
sof committed
513 514 515 516
      where
	keyword = case new_or_data of
			NewType  -> SLIT("newtype")
			DataType -> SLIT("data")
517

518 519
    ppr (ClassDecl {tcdCtxt = context, tcdName = clas, tcdTyVars = tyvars, tcdFDs = fds,
		    tcdSigs = sigs, tcdMeths = methods})
520 521 522 523 524
      | null sigs	-- No "where" part
      = top_matter

      | otherwise	-- Laid out
      = sep [hsep [top_matter, ptext SLIT("where {")],
525
	     nest 4 (sep [sep (map ppr_sig sigs), pp_methods, char '}'])]
526
      where
527
        top_matter  = ptext SLIT("class") <+> pp_decl_head context clas tyvars <+> pprFundeps fds
528
	ppr_sig sig = ppr sig <> semi
529

530
	pp_methods = if isNothing methods
531 532
			then empty
			else ppr (fromJust methods)
533
        
sof's avatar
sof committed
534 535 536 537
    ppr (CoreDecl {tcdName = var, tcdType = ty, tcdRhs = rhs})
	= getPprStyle $ \ sty ->
	   hsep [ ppr_var var, dcolon, ppr ty, ppr rhs ]

538 539
pp_decl_head :: Outputable name => HsContext name -> name -> [HsTyVarBndr name] -> SDoc
pp_decl_head context thing tyvars = hsep [pprHsContext context, ppr thing, interppSP tyvars]
540

541 542 543
pp_condecls Unknown	  = ptext SLIT("{- abstract -}")
pp_condecls (HasCons n)   = ptext SLIT("{- abstract with") <+> int n <+> ptext SLIT("constructors -}")
pp_condecls (DataCons cs) = equals <+> sep (punctuate (ptext SLIT(" |")) (map ppr cs))
544

545
pp_tydecl pp_head pp_decl_rhs derivings
sof's avatar
sof committed
546
  = hang pp_head 4 (sep [
547
	pp_decl_rhs,
548 549
	case derivings of
	  Nothing 	   -> empty
550
	  Just ds	   -> hsep [ptext SLIT("deriving"), ppr_hs_context ds]
551
    ])
552 553 554 555 556 557 558 559 560 561 562
\end{code}


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

\begin{code}
data ConDecl name
563 564 565 566 567
  = 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
568

569
		[HsTyVarBndr name]	-- Existentially quantified type variables
570
		(HsContext name)	-- ...and context
571 572
					-- If both are empty then there are no existentials

sof's avatar
sof committed
573
		(ConDetails name)
574 575
		SrcLoc

sof's avatar
sof committed
576 577 578 579 580 581
data ConDetails name
  = VanillaCon			-- prefix-style con decl
		[BangType name]

  | InfixCon			-- infix-style con decl
		(BangType name)
582 583
		(BangType name)

sof's avatar
sof committed
584
  | RecCon			-- record-style con decl
585
		[([name], BangType name)]	-- list of "fields"
586 587 588
\end{code}

\begin{code}
589
conDeclsNames :: Eq name => DataConDetails (ConDecl name) -> [(name,SrcLoc)]
590 591 592 593
  -- 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
594
  = snd (foldl do_one ([], []) (visibleDataCons cons))
595 596 597 598 599 600 601 602
  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
603

604 605 606 607 608 609
	  do_fld1 (flds_seen, acc) fld
		| fld `elem` flds_seen = (flds_seen,acc)
		| otherwise	       = (fld:flds_seen, (fld,loc):acc)
\end{code}

\begin{code}
610 611 612 613 614 615
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]


616 617 618
eq_ConDecl env (ConDecl n1 _ tvs1 cxt1 cds1 _)
	       (ConDecl n2 _ tvs2 cxt2 cds2 _)
  = n1 == n2 &&
619
    (eq_hsTyVars env tvs1 tvs2	$ \ env ->
620 621 622 623 624 625 626 627 628 629 630 631
     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
632
\end{code}
633
  
634
\begin{code}
635 636 637 638 639 640 641 642
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
643 644 645
\end{code}

\begin{code}
646
instance (Outputable name) => Outputable (ConDecl name) where
647
    ppr (ConDecl con _ tvs cxt con_details  loc)
648
      = sep [pprHsForAll tvs cxt, ppr_con_details con con_details]
649

650 651
ppr_con_details con (InfixCon ty1 ty2)
  = hsep [ppr_bang ty1, ppr con, ppr_bang ty2]
652

653
-- ConDecls generated by MkIface.ifaceTyThing always have a VanillaCon, even
654 655 656
-- if the constructor is an infix one.  This is because in an interface file
-- we don't distinguish between the two.  Hence when printing these for the
-- user, we need to parenthesise infix constructor names.
657
ppr_con_details con (VanillaCon tys)
658
  = hsep (ppr_var con : map (ppr_bang) tys)
sof's avatar
sof committed
659

660
ppr_con_details con (RecCon fields)
661
  = ppr con <+> braces (sep (punctuate comma (map ppr_field fields)))
sof's avatar
sof committed
662
  where
663
    ppr_field (ns, ty) = hsep (map (ppr) ns) <+> 
664
			 dcolon <+>
665
			 ppr_bang ty
sof's avatar
sof committed
666

667 668 669
instance Outputable name => Outputable (BangType name) where
    ppr = ppr_bang

670
ppr_bang (BangType s ty) = ppr s <> pprParendHsType ty
671 672 673 674 675
\end{code}


%************************************************************************
%*									*
sof's avatar
sof committed
676
\subsection[InstDecl]{An instance declaration
677 678 679 680
%*									*
%************************************************************************

\begin{code}
681
data InstDecl name pat
682
  = InstDecl	(HsType name)	-- Context => Class Instance-type
683 684 685
				-- Using a polytype means that the renamer conveniently
				-- figures out the quantified type variables for us.

686
		(MonoBinds name pat)
687

688
		[Sig name]		-- User-supplied pragmatic info
689

690 691
		(Maybe name)		-- Name for the dictionary function
					-- Nothing for source-file instance decls
692 693

		SrcLoc
694

695 696
isSourceInstDecl :: InstDecl name pat -> Bool
isSourceInstDecl (InstDecl _ _ _ maybe_dfun _) = isNothing maybe_dfun
697 698 699
\end{code}

\begin{code}
700
instance (Outputable name, Outputable pat)
701
	      => Outputable (InstDecl name pat) where
702

703
    ppr (InstDecl inst_ty binds uprags maybe_dfun_name src_loc)
704 705 706
      = vcat [hsep [ptext SLIT("instance"), ppr inst_ty, ptext SLIT("where")],
	      nest 4 (ppr uprags),
	      nest 4 (ppr binds) ]
707 708 709 710
      where
	pp_dfun = case maybe_dfun_name of
		    Just df -> ppr df
		    Nothing -> empty
711 712
\end{code}

713 714 715 716 717 718 719
\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}

720 721 722 723 724 725 726 727 728 729 730 731 732

%************************************************************************
%*									*
\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
733
  = DefaultDecl	[HsType name]
734 735
		SrcLoc

736
instance (Outputable name)
737 738
	      => Outputable (DefaultDecl name) where

739 740
    ppr (DefaultDecl tys src_loc)
      = ptext SLIT("default") <+> parens (interpp'SP tys)
741
\end{code}
742

sof's avatar
sof committed
743 744 745 746 747 748 749
%************************************************************************
%*									*
\subsection{Foreign function interface declaration}
%*									*
%************************************************************************

\begin{code}
chak's avatar
chak committed
750 751 752 753 754 755 756

-- foreign declarations are distinguished as to whether they define or use a
-- Haskell name
--
-- * the Boolean value indicates whether the pre-standard deprecated syntax
--   has been used
--
757
data ForeignDecl name
chak's avatar
chak committed
758 759
  = ForeignImport name (HsType name) ForeignImport Bool SrcLoc  -- defines name
  | ForeignExport name (HsType name) ForeignExport Bool SrcLoc  -- uses name
760

chak's avatar
chak committed
761 762 763 764 765
-- yield the Haskell name defined or used in a foreign declaration
--
foreignDeclName                           :: ForeignDecl name -> name
foreignDeclName (ForeignImport n _ _ _ _)  = n
foreignDeclName (ForeignExport n _ _ _ _)  = n
766

chak's avatar
chak committed
767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799
-- specification of an imported external entity in dependence on the calling
-- convention 
--
data ForeignImport = -- import of a C entity
		     --
                     -- * the two strings specifying a header file or library
                     --   may be empty, which indicates the absence of a
                     --   header or object specification (both are not used
                     --   in the case of `CWrapper' and when `CFunction'
                     --   has a dynamic target)
		     --
		     -- * the calling convention is irrelevant for code
		     --   generation in the case of `CLabel', but is needed
		     --   for pretty printing 
		     --
		     -- * `Safety' is irrelevant for `CLabel' and `CWrapper'
		     --
		     CImport  CCallConv	      -- ccall or stdcall
			      Safety	      -- safe or unsafe
			      FastString      -- name of C header
			      FastString      -- name of library object
			      CImportSpec     -- details of the C entity

                     -- import of a .NET function
		     --
		   | DNImport DNCallSpec

-- details of an external C entity
--
data CImportSpec = CLabel    CLabelString     -- import address of a C label
		 | CFunction CCallTarget      -- static or dynamic function
		 | CWrapper		      -- wrapper to expose closures
					      -- (former f.e.d.)
800

chak's avatar
chak committed
801 802 803 804 805
-- specification of an externally exported entity in dependence on the calling
-- convention
--
data ForeignExport = CExport  CExportSpec    -- contains the calling convention
		   | DNExport		     -- presently unused
806

chak's avatar
chak committed
807 808
-- abstract type imported from .NET
--
809
data FoType = DNType 		-- In due course we'll add subtype stuff
chak's avatar
chak committed
810 811 812 813 814
	    deriving (Eq)	-- Used for equality instance for TyClDecl


-- pretty printing of foreign declarations
--
815 816

instance Outputable name => Outputable (ForeignDecl name) where
chak's avatar
chak committed
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850
  ppr (ForeignImport n ty fimport _ _) =
    ptext SLIT("foreign import") <+> ppr fimport <+> 
    ppr n <+> dcolon <+> ppr ty
  ppr (ForeignExport n ty fexport _ _) =
    ptext SLIT("foreign export") <+> ppr fexport <+> 
    ppr n <+> dcolon <+> ppr ty

instance Outputable ForeignImport where
  ppr (DNImport			        spec) = 
    ptext SLIT("dotnet") <+> ppr spec
  ppr (CImport  cconv safety header lib spec) =
    ppr cconv <+> ppr safety <+> 
    char '"' <> pprCEntity header lib spec <> char '"'
    where
      pprCEntity header lib (CLabel lbl) = 
        ptext SLIT("static") <+> ptext header <+> char '&' <>
	pprLib lib <> ppr lbl
      pprCEntity header lib (CFunction (StaticTarget lbl)) = 
        ptext SLIT("static") <+> ptext header <+> char '&' <>
	pprLib lib <> ppr lbl
      pprCEntity header lib (CFunction (DynamicTarget)) = 
        ptext SLIT("dynamic")
      pprCEntity header lib (CFunction (CasmTarget _)) = 
        panic "HsDecls.pprCEntity: malformed C function target"
      pprCEntity _      _   (CWrapper) = ptext SLIT("wrapper")
      --
      pprLib lib | nullFastString lib = empty
		 | otherwise	      = char '[' <> ppr lib <> char ']'

instance Outputable ForeignExport where
  ppr (CExport  (CExportStatic lbl cconv)) = 
    ppr cconv <+> char '"' <> ppr lbl <> char '"'
  ppr (DNExport                          ) = 
    ptext SLIT("dotnet") <+> ptext SLIT("\"<unused>\"")
851 852

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

856

857 858
%************************************************************************
%*									*
859
\subsection{Transformation rules}
860 861 862 863
%*									*
%************************************************************************

\begin{code}
864
data RuleDecl name pat
865
  = HsRule			-- Source rule
866 867
	RuleName		-- Rule name
	Activation
868
	[RuleBndr name]		-- Forall'd vars; after typechecking this includes tyvars
869 870 871 872
	(HsExpr name pat)	-- LHS
	(HsExpr name pat)	-- RHS
	SrcLoc		

873
  | IfaceRule	 		-- One that's come in from an interface file; pre-typecheck
874 875
	RuleName
	Activation
876 877 878 879
	[UfBinder name]		-- Tyvars and term vars
	name			-- Head of lhs
	[UfExpr name]		-- Args of LHS
	(UfExpr name)		-- Pre typecheck
880 881
	SrcLoc		

882 883 884 885
  | IfaceRuleOut		-- Post typecheck
	name			-- Head of LHS
	CoreRule

886
ifaceRuleDeclName :: RuleDecl name pat -> name
887 888
ifaceRuleDeclName (IfaceRule _ _ _ n _ _ _) = n
ifaceRuleDeclName (IfaceRuleOut n r)	    = n
889
ifaceRuleDeclName (HsRule fs _ _ _ _ _)     = pprPanic "ifaceRuleDeclName" (ppr fs)
890

891 892 893
data RuleBndr name
  = RuleBndr name
  | RuleBndrSig name (HsType name)
894

895 896 897
collectRuleBndrSigTys :: [RuleBndr name] -> [HsType name]
collectRuleBndrSigTys bndrs = [ty | RuleBndrSig _ ty <- bndrs]

898
instance (NamedThing name, Ord name) => Eq (RuleDecl name pat) where
899
  -- Works for IfaceRules only; used when comparing interface file versions
900 901
  (IfaceRule n1 a1 bs1 f1 es1 rhs1 _) == (IfaceRule n2 a2 bs2 f2 es2 rhs2 _)
     = n1==n2 && f1 == f2 && a1==a2 &&
902 903 904
       eq_ufBinders emptyEqHsEnv bs1 bs2 (\env -> 
       eqListBy (eq_ufExpr env) (rhs1:es1) (rhs2:es2))

905
instance (NamedThing name, Outputable name, Outputable pat)
906
	      => Outputable (RuleDecl name pat) where
907
  ppr (HsRule name act ns lhs rhs loc)
908
	= sep [text "{-# RULES" <+> doubleQuotes (ptext name) <+> ppr act,
909 910
	       pp_forall, ppr lhs, equals <+> ppr rhs,
               text "#-}" ]
911
	where
912 913
	  pp_forall | null ns   = empty
		    | otherwise	= text "forall" <+> fsep (map ppr ns) <> dot
914

915 916
  ppr (IfaceRule name act tpl_vars fn tpl_args rhs loc) 
    = hsep [ doubleQuotes (ptext name), ppr act,
917 918 919 920 921 922
	   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
923 924 925 926

instance Outputable name => Outputable (RuleBndr name) where
   ppr (RuleBndr name) = ppr name
   ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty
927 928 929 930 931 932 933 934 935
\end{code}


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

936
We use exported entities for things to deprecate.
937 938

\begin{code}
939
data DeprecDecl name = Deprecation name DeprecTxt SrcLoc
940 941 942 943

type DeprecTxt = FAST_STRING	-- reason/explanation for deprecation

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