HsDecls.lhs 30.9 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(..), HsGroup(..), SpliceDecl(..),
chak's avatar
chak committed
13 14
	ForeignDecl(..), ForeignImport(..), ForeignExport(..),
	CImportSpec(..), FoType(..),
15
	ConDecl(..), CoreDecl(..),
16
	BangType(..), getBangType, getBangStrictness, unbangedType,
17
	DeprecDecl(..), DeprecTxt,
18 19
	tyClDeclName, tyClDeclNames, tyClDeclTyVars,
	isClassDecl, isSynDecl, isDataDecl, isIfaceSigDecl, 
20
	isTypeOrClassDecl, countTyClDecls,
21
	isSourceInstDecl, instDeclDFun, ifaceRuleDeclName,
22 23
	conDetailsTys,
	collectRuleBndrSigTys, isSrcRule
24
    ) where
25

26
#include "HsVersions.h"
27 28

-- friends:
29 30 31 32 33 34
import {-# SOURCE #-}	HsExpr( HsExpr, pprExpr )
	-- Because Expr imports Decls via HsBracket

import HsBinds		( HsBinds, MonoBinds, Sig(..) )
import HsPat		( HsConDetails(..), hsConArgs )
import HsImpExp		( pprHsVar )
35
import HsTypes
36
import PprCore		( pprCoreRule )
37 38
import HsCore		( UfExpr, UfBinder, HsIdInfo, pprHsIdInfo,
			  eq_ufBinders, eq_ufExpr, pprUfExpr 
39
			)
40
import CoreSyn		( CoreRule(..), RuleName )
41
import BasicTypes	( NewOrData(..), StrictnessMark(..), Activation(..), FixitySig(..) )
chak's avatar
chak committed
42 43
import ForeignCall	( CCallTarget(..), DNCallSpec, CCallConv, Safety,
			  CExportSpec(..)) 
44 45

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

56
import Maybe		( isNothing, fromJust )	
57 58
\end{code}

59 60 61 62 63 64 65 66

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

\begin{code}
67 68 69
data HsDecl id
  = TyClD	(TyClDecl id)
  | InstD	(InstDecl  id)
70 71
  | ValD	(MonoBinds id)
  | SigD	(Sig id)
72 73 74 75 76
  | DefD	(DefaultDecl id)
  | ForD        (ForeignDecl id)
  | DeprecD	(DeprecDecl id)
  | RuleD	(RuleDecl id)
  | CoreD	(CoreDecl id)
77
  | SpliceD	(SpliceDecl id)
78 79

-- NB: all top-level fixity decls are contained EITHER
80
-- EITHER SigDs
81 82 83 84 85 86 87 88 89 90
-- 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
91

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
-- A [HsDecl] is categorised into a HsGroup before being 
-- fed to the renamer.
data HsGroup id
  = HsGroup {
	hs_valds  :: HsBinds id,	
		-- Before the renamer, this is a single big MonoBinds, 
		-- with all the bindings, and all the signatures.
		-- The renamer does dependency analysis, using ThenBinds
		-- to give the structure

	hs_tyclds :: [TyClDecl id],
	hs_instds :: [InstDecl id],

	hs_fixds  :: [FixitySig id],
		-- Snaffled out of both top-level fixity signatures,
		-- and those in class declarations

	hs_defds  :: [DefaultDecl id],
	hs_fords  :: [ForeignDecl id],
	hs_depds  :: [DeprecDecl id],
	hs_ruleds :: [RuleDecl id],
	hs_coreds :: [CoreDecl id]
  }
115 116 117
\end{code}

\begin{code}
118
instance OutputableBndr name => Outputable (HsDecl name) where
119
    ppr (TyClD dcl)  = ppr dcl
120 121 122
    ppr (ValD binds) = ppr binds
    ppr (DefD def)   = ppr def
    ppr (InstD inst) = ppr inst
sof's avatar
sof committed
123
    ppr (ForD fd)    = ppr fd
124
    ppr (SigD sd)    = ppr sd
125
    ppr (RuleD rd)   = ppr rd
126
    ppr (DeprecD dd) = ppr dd
127
    ppr (CoreD dd)   = ppr dd
128
    ppr (SpliceD dd) = ppr dd
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147

instance OutputableBndr name => Outputable (HsGroup name) where
    ppr (HsGroup { hs_valds  = val_decls,
		   hs_tyclds = tycl_decls,
		   hs_instds = inst_decls,
		   hs_fixds  = fix_decls,
		   hs_depds  = deprec_decls,
		   hs_fords  = foreign_decls,
		   hs_defds  = default_decls,
		   hs_ruleds = rule_decls,
		   hs_coreds = core_decls })
	= vcat [ppr_ds fix_decls, ppr_ds default_decls, 
		ppr_ds deprec_decls, ppr_ds rule_decls,
		ppr val_decls,
		ppr_ds tycl_decls, ppr_ds inst_decls,
		ppr_ds foreign_decls, ppr_ds core_decls]
	where
	  ppr_ds [] = empty
	  ppr_ds ds = text "" $$ vcat (map ppr ds)
148 149 150 151 152

data SpliceDecl id = SpliceDecl (HsExpr id) SrcLoc	-- Top level splice

instance OutputableBndr name => Outputable (SpliceDecl name) where
   ppr (SpliceDecl e _) = ptext SLIT("$") <> parens (pprExpr e)
153 154
\end{code}

155

156 157 158 159 160 161
%************************************************************************
%*									*
\subsection[TyDecl]{@data@, @newtype@ or @type@ (synonym) type declaration}
%*									*
%************************************************************************

162 163 164
		--------------------------------
			THE NAMING STORY
		--------------------------------
165

166 167 168 169 170
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
  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:
 - Ensure they "point to" the parent data/class decl 
   when loading that decl from an interface file
190 191 192 193 194
   (See RnHiFiles.getSysBinders)

 - When typechecking the decl, we build the implicit TyCons and Ids.
   When doing so we look them up in the name cache (RnEnv.lookupSysName),
   to ensure correct module and provenance is set
195

196 197
These are the two places that we have to conjure up the magic derived
names.  (The actual magic is in OccName.mkWorkerOcc, etc.)
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 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
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

275
  - The CoreTidy phase externalises the name, and ensures the occurrence name is
276 277 278 279 280 281 282 283 284 285 286 287
    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.
288

289 290
  - RnHsSyn.instDeclFVs treats the dict fun name as free in the decl, so that we
    suck in the dfun binding
291 292


293
\begin{code}
294 295 296 297 298
-- 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

299
data TyClDecl name
300
  = IfaceSig {	tcdName :: name,		-- It may seem odd to classify an interface-file signature
301 302
		tcdType :: HsType name,		-- as a 'TyClDecl', but it's very convenient.  
		tcdIdInfo :: [HsIdInfo name],
303 304 305
		tcdLoc :: SrcLoc
    }

rrt's avatar
rrt committed
306 307 308 309
  | ForeignType { tcdName    :: name,		-- See remarks about IfaceSig above
		  tcdExtName :: Maybe FastString,
		  tcdFoType  :: FoType,
		  tcdLoc     :: SrcLoc }
310

311
  | TyData {	tcdND     :: NewOrData,
312 313 314 315 316
		tcdCtxt   :: HsContext name,	 -- Context
		tcdName   :: name,		 -- Type constructor
		tcdTyVars :: [HsTyVarBndr name], -- Type variables
		tcdCons	  :: DataConDetails (ConDecl name),	 -- Data constructors
		tcdDerivs :: Maybe (HsContext name),	-- Derivings; Nothing => not specified
317
							-- Just [] => derive exactly what is asked
318 319 320 321 322 323 324
		tcdGeneric :: Maybe Bool,	-- Nothing <=> source decl
						-- Just x  <=> interface-file decl;
						-- 	x=True <=> generic converter functions available
						-- We need this for imported data decls, since the
						-- imported modules may have been compiled with
						-- different flags to the current compilation unit
		tcdLoc	   :: SrcLoc
325 326 327 328 329 330 331 332 333 334 335 336 337
    }

  | 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
338 339 340
		tcdMeths   :: Maybe (MonoBinds name),	-- Default methods
							-- 	Nothing for imported class decls
							-- 	Just bs for source   class decls
341 342
		tcdLoc      :: SrcLoc
    }
343 344 345 346 347
\end{code}

Simple classifiers

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

350 351
isIfaceSigDecl (IfaceSig {}) = True
isIfaceSigDecl other	     = False
352

353 354
isSynDecl (TySynonym {}) = True
isSynDecl other		 = False
355

356 357
isDataDecl (TyData {}) = True
isDataDecl other       = False
358

359 360
isClassDecl (ClassDecl {}) = True
isClassDecl other	   = False
sof's avatar
sof committed
361

362 363 364 365 366
isTypeOrClassDecl (ClassDecl   {}) = True
isTypeOrClassDecl (TyData      {}) = True
isTypeOrClassDecl (TySynonym   {}) = True
isTypeOrClassDecl (ForeignType {}) = True
isTypeOrClassDecl other		   = False
367 368 369
\end{code}

Dealing with names
370

371
\begin{code}
372
--------------------------------
373
tyClDeclName :: TyClDecl name -> name
374
tyClDeclName tycl_decl = tcdName tycl_decl
375

376
--------------------------------
377
tyClDeclNames :: Eq name => TyClDecl name -> [(name, SrcLoc)]
378
-- Returns all the *binding* names of the decl, along with their SrcLocs
379 380 381 382
-- 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

383 384 385
tyClDeclNames (TySynonym   {tcdName = name, tcdLoc = loc})  = [(name,loc)]
tyClDeclNames (IfaceSig    {tcdName = name, tcdLoc = loc})  = [(name,loc)]
tyClDeclNames (ForeignType {tcdName = name, tcdLoc = loc})  = [(name,loc)]
386

387
tyClDeclNames (ClassDecl {tcdName = cls_name, tcdSigs = sigs, tcdLoc = loc})
388
  = (cls_name,loc) : [(n,loc) | ClassOpSig n _ _ loc <- sigs]
389

390
tyClDeclNames (TyData {tcdName = tc_name, tcdCons = cons, tcdLoc = loc})
391
  = (tc_name,loc) : conDeclsNames cons
392 393


394 395 396 397 398
tyClDeclTyVars (TySynonym {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (TyData    {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ClassDecl {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ForeignType {})		     = []
tyClDeclTyVars (IfaceSig {})		     = []
399 400 401
\end{code}

\begin{code}
402
instance (NamedThing name, Ord name) => Eq (TyClDecl name) where
403
	-- Used only when building interface files
404 405 406 407 408
  (==) d1@(IfaceSig {}) d2@(IfaceSig {})
      = tcdName d1 == tcdName d2 && 
	tcdType d1 == tcdType d2 && 
	tcdIdInfo d1 == tcdIdInfo d2

409 410 411 412
  (==) d1@(ForeignType {}) d2@(ForeignType {})
      = tcdName d1 == tcdName d2 && 
	tcdFoType d1 == tcdFoType d2

413 414 415 416 417
  (==) 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)  &&
418
	  eq_hsCD      env (tcdCons d1) (tcdCons d2)
419 420 421 422 423 424 425 426 427 428 429 430 431 432
	)

  (==) 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)
433 434
       )

435 436
  (==) _ _ = False	-- default case

437 438 439 440 441
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

442 443 444
eq_hsFD env (ns1,ms1) (ns2,ms2)
  = eqListBy (eq_hsVar env) ns1 ns2 && eqListBy (eq_hsVar env) ms1 ms2

445 446 447
eq_cls_sig env (ClassOpSig n1 dm1 ty1 _) (ClassOpSig n2 dm2 ty2 _)
  = n1==n2 && dm1 `eq_dm` dm2 && eq_hsType env ty1 ty2
  where
448
	-- Ignore the name of the default method for (DefMeth id)
449 450 451
	-- This is used for comparing declarations before putting
	-- them into interface files, and the name of the default 
	-- method isn't relevant
452 453 454 455
    NoDefMeth  `eq_dm` NoDefMeth  = True
    GenDefMeth `eq_dm` GenDefMeth = True
    DefMeth _  `eq_dm` DefMeth _  = True
    dm1	       `eq_dm` dm2	  = False
456 457 458
\end{code}

\begin{code}
459
countTyClDecls :: [TyClDecl name] -> (Int, Int, Int, Int, Int)
460 461
	-- class, data, newtype, synonym decls
countTyClDecls decls 
sof's avatar
sof committed
462 463
 = (count isClassDecl     decls,
    count isSynDecl       decls,
464
    count isIfaceSigDecl  decls,
sof's avatar
sof committed
465 466 467 468 469 470 471 472
    count isDataTy        decls,
    count isNewTy         decls) 
 where
   isDataTy TyData{tcdND=DataType} = True
   isDataTy _                      = False
   
   isNewTy TyData{tcdND=NewType} = True
   isNewTy _                     = False
473 474 475
\end{code}

\begin{code}
476 477
instance OutputableBndr name
	      => Outputable (TyClDecl name) where
478

479
    ppr (IfaceSig {tcdName = var, tcdType = ty, tcdIdInfo = info})
480
	= getPprStyle $ \ sty ->
481
	   hsep [ pprHsVar var, dcolon, ppr ty, pprHsIdInfo info ]
482

483 484 485
    ppr (ForeignType {tcdName = tycon})
	= hsep [ptext SLIT("foreign import type dotnet"), ppr tycon]

486
    ppr (TySynonym {tcdName = tycon, tcdTyVars = tyvars, tcdSynRhs = mono_ty})
487
      = hang (ptext SLIT("type") <+> pp_decl_head [] tycon tyvars <+> equals)
488
	     4 (ppr mono_ty)
489

490
    ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdName = tycon,
491
		 tcdTyVars = tyvars, tcdCons = condecls, 
492
		 tcdDerivs = derivings})
493
      = pp_tydecl (ptext keyword <+> pp_decl_head context tycon tyvars)
494
		  (pp_condecls condecls)
495
		  derivings
sof's avatar
sof committed
496 497 498 499
      where
	keyword = case new_or_data of
			NewType  -> SLIT("newtype")
			DataType -> SLIT("data")
500

501 502
    ppr (ClassDecl {tcdCtxt = context, tcdName = clas, tcdTyVars = tyvars, tcdFDs = fds,
		    tcdSigs = sigs, tcdMeths = methods})
503 504 505 506 507
      | null sigs	-- No "where" part
      = top_matter

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

513
	pp_methods = if isNothing methods
514 515
			then empty
			else ppr (fromJust methods)
sof's avatar
sof committed
516

517
pp_decl_head :: OutputableBndr name => HsContext name -> name -> [HsTyVarBndr name] -> SDoc
518
pp_decl_head context thing tyvars = hsep [pprHsContext context, ppr thing, interppSP tyvars]
519

520 521 522
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))
523

524
pp_tydecl pp_head pp_decl_rhs derivings
sof's avatar
sof committed
525
  = hang pp_head 4 (sep [
526
	pp_decl_rhs,
527 528
	case derivings of
	  Nothing 	   -> empty
529
	  Just ds	   -> hsep [ptext SLIT("deriving"), ppr_hs_context ds]
530
    ])
531 532 533 534 535 536 537 538 539 540 541
\end{code}


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

\begin{code}
data ConDecl name
542 543 544
  = ConDecl 	name			-- Constructor name; this is used for the
					-- DataCon itself, and for the user-callable wrapper Id

545
		[HsTyVarBndr name]	-- Existentially quantified type variables
546
		(HsContext name)	-- ...and context
547 548
					-- If both are empty then there are no existentials

549
		(HsConDetails name (BangType name))
550
		SrcLoc
551 552 553
\end{code}

\begin{code}
554
conDeclsNames :: Eq name => DataConDetails (ConDecl name) -> [(name,SrcLoc)]
555 556 557 558
  -- 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
559
  = snd (foldl do_one ([], []) (visibleDataCons cons))
560
  where
561 562
    do_one (flds_seen, acc) (ConDecl name _ _ (RecCon flds) loc)
	= (new_flds ++ flds_seen, (name,loc) : [(f,loc) | f <- new_flds] ++ acc)
563
	where
564
	  new_flds = [ f | (f,_) <- flds, not (f `elem` flds_seen) ]
565

566 567
    do_one (flds_seen, acc) (ConDecl name _ _ _ loc)
	= (flds_seen, (name,loc):acc)
568 569 570
\end{code}

\begin{code}
571
conDetailsTys details = map getBangType (hsConArgs details)
572

573 574
eq_ConDecl env (ConDecl n1 tvs1 cxt1 cds1 _)
	       (ConDecl n2 tvs2 cxt2 cds2 _)
575
  = n1 == n2 &&
576
    (eq_hsTyVars env tvs1 tvs2	$ \ env ->
577 578 579
     eq_hsContext env cxt1 cxt2	&&
     eq_ConDetails env cds1 cds2)

580
eq_ConDetails env (PrefixCon bts1) (PrefixCon bts2)
581 582 583 584 585 586 587 588
  = 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
589
\end{code}
590
  
591
\begin{code}
592 593 594 595 596 597 598 599
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
600 601 602
\end{code}

\begin{code}
603 604
instance (OutputableBndr name) => Outputable (ConDecl name) where
    ppr (ConDecl con tvs cxt con_details loc)
605
      = sep [pprHsForAll tvs cxt, ppr_con_details con con_details]
606

607 608
ppr_con_details con (InfixCon ty1 ty2)
  = hsep [ppr_bang ty1, ppr con, ppr_bang ty2]
609

610
-- ConDecls generated by MkIface.ifaceTyThing always have a PrefixCon, even
611 612 613
-- 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.
614 615
ppr_con_details con (PrefixCon tys)
  = hsep (pprHsVar con : map ppr_bang tys)
sof's avatar
sof committed
616

617
ppr_con_details con (RecCon fields)
618
  = ppr con <+> braces (sep (punctuate comma (map ppr_field fields)))
sof's avatar
sof committed
619
  where
620
    ppr_field (n, ty) = ppr n <+> dcolon <+> ppr_bang ty
sof's avatar
sof committed
621

622
instance OutputableBndr name => Outputable (BangType name) where
623 624
    ppr = ppr_bang

625
ppr_bang (BangType s ty) = ppr s <> pprParendHsType ty
626 627 628 629 630
\end{code}


%************************************************************************
%*									*
sof's avatar
sof committed
631
\subsection[InstDecl]{An instance declaration
632 633 634 635
%*									*
%************************************************************************

\begin{code}
636
data InstDecl name
637
  = InstDecl	(HsType name)	-- Context => Class Instance-type
638 639 640
				-- Using a polytype means that the renamer conveniently
				-- figures out the quantified type variables for us.

641
		(MonoBinds name)
642

643
		[Sig name]		-- User-supplied pragmatic info
644

645 646
		(Maybe name)		-- Name for the dictionary function
					-- Nothing for source-file instance decls
647 648

		SrcLoc
649

650
isSourceInstDecl :: InstDecl name -> Bool
651
isSourceInstDecl (InstDecl _ _ _ maybe_dfun _) = isNothing maybe_dfun
652 653 654

instDeclDFun :: InstDecl name -> Maybe name
instDeclDFun (InstDecl _ _ _ df _) = df	-- A Maybe, but that's ok
655 656 657
\end{code}

\begin{code}
658
instance (OutputableBndr name) => Outputable (InstDecl name) where
659

660
    ppr (InstDecl inst_ty binds uprags maybe_dfun_name src_loc)
661 662 663
      = vcat [hsep [ptext SLIT("instance"), ppr inst_ty, ptext SLIT("where")],
	      nest 4 (ppr uprags),
	      nest 4 (ppr binds) ]
664 665 666 667
      where
	pp_dfun = case maybe_dfun_name of
		    Just df -> ppr df
		    Nothing -> empty
668 669
\end{code}

670
\begin{code}
671
instance Ord name => Eq (InstDecl name) where
672 673 674 675 676
	-- 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}

677 678 679 680 681 682 683 684 685 686 687 688 689

%************************************************************************
%*									*
\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
690
  = DefaultDecl	[HsType name]
691 692
		SrcLoc

693
instance (OutputableBndr name)
694 695
	      => Outputable (DefaultDecl name) where

696 697
    ppr (DefaultDecl tys src_loc)
      = ptext SLIT("default") <+> parens (interpp'SP tys)
698
\end{code}
699

sof's avatar
sof committed
700 701 702 703 704 705 706
%************************************************************************
%*									*
\subsection{Foreign function interface declaration}
%*									*
%************************************************************************

\begin{code}
chak's avatar
chak committed
707 708 709 710 711 712 713

-- 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
--
714
data ForeignDecl name
chak's avatar
chak committed
715 716
  = ForeignImport name (HsType name) ForeignImport Bool SrcLoc  -- defines name
  | ForeignExport name (HsType name) ForeignExport Bool SrcLoc  -- uses name
717

chak's avatar
chak committed
718 719 720 721 722
-- yield the Haskell name defined or used in a foreign declaration
--
foreignDeclName                           :: ForeignDecl name -> name
foreignDeclName (ForeignImport n _ _ _ _)  = n
foreignDeclName (ForeignExport n _ _ _ _)  = n
723

chak's avatar
chak committed
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
-- 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.)
757

chak's avatar
chak committed
758 759 760 761 762
-- specification of an externally exported entity in dependence on the calling
-- convention
--
data ForeignExport = CExport  CExportSpec    -- contains the calling convention
		   | DNExport		     -- presently unused
763

chak's avatar
chak committed
764 765
-- abstract type imported from .NET
--
766
data FoType = DNType 		-- In due course we'll add subtype stuff
chak's avatar
chak committed
767 768 769 770 771
	    deriving (Eq)	-- Used for equality instance for TyClDecl


-- pretty printing of foreign declarations
--
772

773
instance OutputableBndr name => Outputable (ForeignDecl name) where
chak's avatar
chak committed
774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
  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) = 
789
        ptext SLIT("static") <+> ftext header <+> char '&' <>
chak's avatar
chak committed
790 791
	pprLib lib <> ppr lbl
      pprCEntity header lib (CFunction (StaticTarget lbl)) = 
792
        ptext SLIT("static") <+> ftext header <+> char '&' <>
chak's avatar
chak committed
793 794 795 796 797 798 799 800 801 802 803 804 805 806 807
	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>\"")
808 809

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

813

814 815
%************************************************************************
%*									*
816
\subsection{Transformation rules}
817 818 819 820
%*									*
%************************************************************************

\begin{code}
821
data RuleDecl name
822
  = HsRule			-- Source rule
823 824
	RuleName		-- Rule name
	Activation
825
	[RuleBndr name]		-- Forall'd vars; after typechecking this includes tyvars
826 827
	(HsExpr name)	-- LHS
	(HsExpr name)	-- RHS
828 829
	SrcLoc		

830
  | IfaceRule	 		-- One that's come in from an interface file; pre-typecheck
831 832
	RuleName
	Activation
833 834 835 836
	[UfBinder name]		-- Tyvars and term vars
	name			-- Head of lhs
	[UfExpr name]		-- Args of LHS
	(UfExpr name)		-- Pre typecheck
837 838
	SrcLoc		

839 840 841 842
  | IfaceRuleOut		-- Post typecheck
	name			-- Head of LHS
	CoreRule

843
isSrcRule :: RuleDecl name -> Bool
844 845 846 847
isSrcRule (HsRule _ _ _ _ _ _) = True
isSrcRule other		       = False

ifaceRuleDeclName :: RuleDecl name -> name
848 849
ifaceRuleDeclName (IfaceRule _ _ _ n _ _ _) = n
ifaceRuleDeclName (IfaceRuleOut n r)	    = n
850
ifaceRuleDeclName (HsRule fs _ _ _ _ _)     = pprPanic "ifaceRuleDeclName" (ppr fs)
851

852 853 854
data RuleBndr name
  = RuleBndr name
  | RuleBndrSig name (HsType name)
855

856 857 858
collectRuleBndrSigTys :: [RuleBndr name] -> [HsType name]
collectRuleBndrSigTys bndrs = [ty | RuleBndrSig _ ty <- bndrs]

859
instance (NamedThing name, Ord name) => Eq (RuleDecl name) where
860
  -- Works for IfaceRules only; used when comparing interface file versions
861 862
  (IfaceRule n1 a1 bs1 f1 es1 rhs1 _) == (IfaceRule n2 a2 bs2 f2 es2 rhs2 _)
     = n1==n2 && f1 == f2 && a1==a2 &&
863 864 865
       eq_ufBinders emptyEqHsEnv bs1 bs2 (\env -> 
       eqListBy (eq_ufExpr env) (rhs1:es1) (rhs2:es2))

866
instance OutputableBndr name => Outputable (RuleDecl name) where
867
  ppr (HsRule name act ns lhs rhs loc)
868
	= sep [text "{-# RULES" <+> doubleQuotes (ftext name) <+> ppr act,
869
	       pp_forall, pprExpr lhs, equals <+> pprExpr rhs,
870
               text "#-}" ]
871
	where
872 873
	  pp_forall | null ns   = empty
		    | otherwise	= text "forall" <+> fsep (map ppr ns) <> dot
874

875
  ppr (IfaceRule name act tpl_vars fn tpl_args rhs loc) 
876
    = hsep [ doubleQuotes (ftext name), ppr act,
877 878 879 880 881 882
	   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
883

884
instance OutputableBndr name => Outputable (RuleBndr name) where
885 886
   ppr (RuleBndr name) = ppr name
   ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty
887 888 889 890 891 892 893 894 895
\end{code}


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

896
We use exported entities for things to deprecate.
897 898

\begin{code}
899
data DeprecDecl name = Deprecation name DeprecTxt SrcLoc
900

901
type DeprecTxt = FastString	-- reason/explanation for deprecation
902

903
instance OutputableBndr name => Outputable (DeprecDecl name) where
904
    ppr (Deprecation thing txt _)
905
      = hsep [text "{-# DEPRECATED", ppr thing, doubleQuotes (ppr txt), text "#-}"]
906
\end{code}
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926


%************************************************************************
%*									*
		External-core declarations
%*									*
%************************************************************************

\begin{code}
data CoreDecl name	-- a Core value binding (from 'external Core' input)
  = CoreDecl 	name
		(HsType name)
		(UfExpr name)
		SrcLoc
        
instance OutputableBndr name => Outputable (CoreDecl name) where
    ppr (CoreDecl var ty rhs loc)
	= getPprStyle $ \ sty ->
	  hsep [ pprHsVar var, dcolon, ppr ty, ppr rhs ]
\end{code}