HsDecls.lhs 23.4 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 16 17
	ConDecl(..), 
	BangType(..), HsBang(..), getBangType, getBangStrictness, unbangedType, 
	DeprecDecl(..), 
18
	tyClDeclName, tyClDeclNames, tyClDeclTyVars,
19 20
	isClassDecl, isSynDecl, isDataDecl, 
	countTyClDecls,
21
	conDetailsTys,
22
	collectRuleBndrSigTys, 
23
    ) where
24

25
#include "HsVersions.h"
26 27

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

31
import HsBinds		( HsBinds, MonoBinds, Sig(..), FixitySig )
32 33
import HsPat		( HsConDetails(..), hsConArgs )
import HsImpExp		( pprHsVar )
34
import HsTypes
35 36 37
import HscTypes		( DeprecTxt )
import CoreSyn		( RuleName )
import BasicTypes	( NewOrData(..), Activation(..) )
chak's avatar
chak committed
38 39
import ForeignCall	( CCallTarget(..), DNCallSpec, CCallConv, Safety,
			  CExportSpec(..)) 
40 41

-- others:
42
import FunDeps		( pprFundeps )
43
import Class		( FunDep )
44
import CStrings		( CLabelString )
45
import Outputable	
46
import Util		( count )
47
import SrcLoc		( SrcLoc )
rrt's avatar
rrt committed
48
import FastString
49 50
\end{code}

51 52 53 54 55 56 57 58

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

\begin{code}
59 60 61
data HsDecl id
  = TyClD	(TyClDecl id)
  | InstD	(InstDecl  id)
62 63
  | ValD	(MonoBinds id)
  | SigD	(Sig id)
64 65 66 67
  | DefD	(DefaultDecl id)
  | ForD        (ForeignDecl id)
  | DeprecD	(DeprecDecl id)
  | RuleD	(RuleDecl id)
68
  | SpliceD	(SpliceDecl id)
69 70

-- NB: all top-level fixity decls are contained EITHER
71
-- EITHER SigDs
72 73 74 75 76 77 78 79 80 81
-- 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
82

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
-- 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],
103
	hs_ruleds :: [RuleDecl id]
104
  }
105 106 107
\end{code}

\begin{code}
108
instance OutputableBndr name => Outputable (HsDecl name) where
109
    ppr (TyClD dcl)  = ppr dcl
110 111 112
    ppr (ValD binds) = ppr binds
    ppr (DefD def)   = ppr def
    ppr (InstD inst) = ppr inst
sof's avatar
sof committed
113
    ppr (ForD fd)    = ppr fd
114
    ppr (SigD sd)    = ppr sd
115
    ppr (RuleD rd)   = ppr rd
116
    ppr (DeprecD dd) = ppr dd
117
    ppr (SpliceD dd) = ppr dd
118 119 120 121 122 123 124 125 126

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,
127
		   hs_ruleds = rule_decls })
128 129 130 131
	= 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,
132
		ppr_ds foreign_decls]
133 134 135
	where
	  ppr_ds [] = empty
	  ppr_ds ds = text "" $$ vcat (map ppr ds)
136 137 138 139 140

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)
141 142
\end{code}

143

144 145 146 147 148 149
%************************************************************************
%*									*
\subsection[TyDecl]{@data@, @newtype@ or @type@ (synonym) type declaration}
%*									*
%************************************************************************

150 151 152
		--------------------------------
			THE NAMING STORY
		--------------------------------
153

154 155 156 157 158
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
  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
178 179 180 181 182
   (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
183

184 185
These are the two places that we have to conjure up the magic derived
names.  (The actual magic is in OccName.mkWorkerOcc, etc.)
186

187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
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:
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
 - 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

264
  - The CoreTidy phase externalises the name, and ensures the occurrence name is
265 266 267 268 269 270 271 272 273 274 275 276
    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.
277

278 279
  - RnHsSyn.instDeclFVs treats the dict fun name as free in the decl, so that we
    suck in the dfun binding
280 281


282
\begin{code}
283 284 285 286 287
-- 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

288
data TyClDecl name
289
  = ForeignType { tcdName    :: name,
rrt's avatar
rrt committed
290 291 292
		  tcdExtName :: Maybe FastString,
		  tcdFoType  :: FoType,
		  tcdLoc     :: SrcLoc }
293

294
  | TyData {	tcdND     :: NewOrData,
295 296 297
		tcdCtxt   :: HsContext name,	 -- Context
		tcdName   :: name,		 -- Type constructor
		tcdTyVars :: [HsTyVarBndr name], -- Type variables
298
		tcdCons	  :: [ConDecl name],	 -- Data constructors
299
		tcdDerivs :: Maybe (HsContext name),	-- Derivings; Nothing => not specified
300
							-- Just [] => derive exactly what is asked
301
		tcdLoc	   :: SrcLoc
302 303
    }

304
  | TySynonym {	tcdName   :: name,		        -- type constructor
305 306 307 308 309 310 311 312 313 314
		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
315 316
		tcdMeths   :: MonoBinds name,		-- Default methods
		tcdLoc     :: SrcLoc
317
    }
318 319 320 321 322
\end{code}

Simple classifiers

\begin{code}
323
isDataDecl, isSynDecl, isClassDecl :: TyClDecl name -> Bool
324

325 326
isSynDecl (TySynonym {}) = True
isSynDecl other		 = False
327

328 329
isDataDecl (TyData {}) = True
isDataDecl other       = False
330

331 332
isClassDecl (ClassDecl {}) = True
isClassDecl other	   = False
333 334 335
\end{code}

Dealing with names
336

337
\begin{code}
338
--------------------------------
339
tyClDeclName :: TyClDecl name -> name
340
tyClDeclName tycl_decl = tcdName tycl_decl
341

342
--------------------------------
343
tyClDeclNames :: Eq name => TyClDecl name -> [(name, SrcLoc)]
344
-- Returns all the *binding* names of the decl, along with their SrcLocs
345 346 347 348
-- 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

349 350
tyClDeclNames (TySynonym   {tcdName = name, tcdLoc = loc})  = [(name,loc)]
tyClDeclNames (ForeignType {tcdName = name, tcdLoc = loc})  = [(name,loc)]
351

352
tyClDeclNames (ClassDecl {tcdName = cls_name, tcdSigs = sigs, tcdLoc = loc})
353
  = (cls_name,loc) : [(n,loc) | Sig n _ loc <- sigs]
354

355
tyClDeclNames (TyData {tcdName = tc_name, tcdCons = cons, tcdLoc = loc})
356
  = (tc_name,loc) : conDeclsNames cons
357

358 359 360 361
tyClDeclTyVars (TySynonym {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (TyData    {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ClassDecl {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ForeignType {})		     = []
362 363 364
\end{code}

\begin{code}
365
countTyClDecls :: [TyClDecl name] -> (Int, Int, Int, Int)
366 367
	-- class, data, newtype, synonym decls
countTyClDecls decls 
sof's avatar
sof committed
368 369 370 371 372 373 374 375 376 377
 = (count isClassDecl     decls,
    count isSynDecl       decls,
    count isDataTy        decls,
    count isNewTy         decls) 
 where
   isDataTy TyData{tcdND=DataType} = True
   isDataTy _                      = False
   
   isNewTy TyData{tcdND=NewType} = True
   isNewTy _                     = False
378 379 380
\end{code}

\begin{code}
381 382
instance OutputableBndr name
	      => Outputable (TyClDecl name) where
383

384 385 386
    ppr (ForeignType {tcdName = tycon})
	= hsep [ptext SLIT("foreign import type dotnet"), ppr tycon]

387
    ppr (TySynonym {tcdName = tycon, tcdTyVars = tyvars, tcdSynRhs = mono_ty})
388
      = hang (ptext SLIT("type") <+> pp_decl_head [] tycon tyvars <+> equals)
389
	     4 (ppr mono_ty)
390

391
    ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdName = tycon,
392
		 tcdTyVars = tyvars, tcdCons = condecls, 
393
		 tcdDerivs = derivings})
394
      = pp_tydecl (ppr new_or_data <+> pp_decl_head context tycon tyvars)
395
		  (pp_condecls condecls)
396 397
		  derivings

398 399
    ppr (ClassDecl {tcdCtxt = context, tcdName = clas, tcdTyVars = tyvars, tcdFDs = fds,
		    tcdSigs = sigs, tcdMeths = methods})
400 401 402 403 404
      | null sigs	-- No "where" part
      = top_matter

      | otherwise	-- Laid out
      = sep [hsep [top_matter, ptext SLIT("where {")],
405
	     nest 4 (sep [sep (map ppr_sig sigs), ppr methods, char '}'])]
406
      where
407
        top_matter  = ptext SLIT("class") <+> pp_decl_head context clas tyvars <+> pprFundeps fds
408
	ppr_sig sig = ppr sig <> semi
409

410
pp_decl_head :: OutputableBndr name => HsContext name -> name -> [HsTyVarBndr name] -> SDoc
411
pp_decl_head context thing tyvars = hsep [pprHsContext context, ppr thing, interppSP tyvars]
412

413
pp_condecls cs = equals <+> sep (punctuate (ptext SLIT(" |")) (map ppr cs))
414

415
pp_tydecl pp_head pp_decl_rhs derivings
sof's avatar
sof committed
416
  = hang pp_head 4 (sep [
417
	pp_decl_rhs,
418 419
	case derivings of
	  Nothing 	   -> empty
420
	  Just ds	   -> hsep [ptext SLIT("deriving"), ppr_hs_context ds]
421
    ])
422 423 424 425 426 427 428 429 430 431 432
\end{code}


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

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

436
		[HsTyVarBndr name]	-- Existentially quantified type variables
437
		(HsContext name)	-- ...and context
438 439
					-- If both are empty then there are no existentials

440
		(HsConDetails name (BangType name))
441
		SrcLoc
442 443 444
\end{code}

\begin{code}
445
conDeclsNames :: Eq name => [ConDecl name] -> [(name,SrcLoc)]
446 447 448 449
  -- 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
450
  = snd (foldl do_one ([], []) cons)
451
  where
452 453
    do_one (flds_seen, acc) (ConDecl name _ _ (RecCon flds) loc)
	= (new_flds ++ flds_seen, (name,loc) : [(f,loc) | f <- new_flds] ++ acc)
454
	where
455
	  new_flds = [ f | (f,_) <- flds, not (f `elem` flds_seen) ]
456

457 458
    do_one (flds_seen, acc) (ConDecl name _ _ _ loc)
	= (flds_seen, (name,loc):acc)
459

460
conDetailsTys details = map getBangType (hsConArgs details)
461
\end{code}
462
  
463
\begin{code}
464 465 466 467 468
data BangType name = BangType HsBang (HsType name)

data HsBang = HsNoBang
	    | HsStrict	-- ! 
	    | HsUnbox	-- !! (GHC extension, meaning "unbox")
469 470 471 472

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

473
unbangedType ty = BangType HsNoBang ty
474 475 476
\end{code}

\begin{code}
477 478
instance (OutputableBndr name) => Outputable (ConDecl name) where
    ppr (ConDecl con tvs cxt con_details loc)
479
      = sep [pprHsForAll Explicit tvs cxt, ppr_con_details con con_details]
480

481
ppr_con_details con (InfixCon ty1 ty2)
482
  = hsep [ppr ty1, ppr con, ppr ty2]
483

484
-- ConDecls generated by MkIface.ifaceTyThing always have a PrefixCon, even
485 486 487
-- 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.
488
ppr_con_details con (PrefixCon tys)
489
  = hsep (pprHsVar con : map ppr tys)
sof's avatar
sof committed
490

491
ppr_con_details con (RecCon fields)
492
  = ppr con <+> braces (sep (punctuate comma (map ppr_field fields)))
sof's avatar
sof committed
493
  where
494
    ppr_field (n, ty) = ppr n <+> dcolon <+> ppr ty
sof's avatar
sof committed
495

496
instance OutputableBndr name => Outputable (BangType name) where
497 498 499 500 501 502 503
    ppr (BangType is_strict ty) 
	= bang <> pprParendHsType ty
	where
	  bang = case is_strict of
			HsNoBang -> empty
			HsStrict -> char '!'
			HsUnbox  -> ptext SLIT("!!")
504 505 506 507 508
\end{code}


%************************************************************************
%*									*
sof's avatar
sof committed
509
\subsection[InstDecl]{An instance declaration
510 511 512 513
%*									*
%************************************************************************

\begin{code}
514
data InstDecl name
515
  = InstDecl	(HsType name)	-- Context => Class Instance-type
516 517
				-- Using a polytype means that the renamer conveniently
				-- figures out the quantified type variables for us.
518
		(MonoBinds name)
519
		[Sig name]		-- User-supplied pragmatic info
520
		SrcLoc
521

522
instance (OutputableBndr name) => Outputable (InstDecl name) where
523

524
    ppr (InstDecl inst_ty binds uprags src_loc)
525 526 527
      = vcat [hsep [ptext SLIT("instance"), ppr inst_ty, ptext SLIT("where")],
	      nest 4 (ppr uprags),
	      nest 4 (ppr binds) ]
528 529
\end{code}

530 531 532 533 534 535 536 537 538 539 540 541
%************************************************************************
%*									*
\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
542
  = DefaultDecl	[HsType name]
543 544
		SrcLoc

545
instance (OutputableBndr name)
546 547
	      => Outputable (DefaultDecl name) where

548 549
    ppr (DefaultDecl tys src_loc)
      = ptext SLIT("default") <+> parens (interpp'SP tys)
550
\end{code}
551

sof's avatar
sof committed
552 553 554 555 556 557 558
%************************************************************************
%*									*
\subsection{Foreign function interface declaration}
%*									*
%************************************************************************

\begin{code}
chak's avatar
chak committed
559 560 561 562 563 564 565

-- 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
--
566
data ForeignDecl name
chak's avatar
chak committed
567 568
  = ForeignImport name (HsType name) ForeignImport Bool SrcLoc  -- defines name
  | ForeignExport name (HsType name) ForeignExport Bool SrcLoc  -- uses name
569

chak's avatar
chak committed
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
-- 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.)
603

chak's avatar
chak committed
604 605 606 607 608
-- specification of an externally exported entity in dependence on the calling
-- convention
--
data ForeignExport = CExport  CExportSpec    -- contains the calling convention
		   | DNExport		     -- presently unused
609

chak's avatar
chak committed
610 611
-- abstract type imported from .NET
--
612
data FoType = DNType 		-- In due course we'll add subtype stuff
chak's avatar
chak committed
613 614 615 616 617
	    deriving (Eq)	-- Used for equality instance for TyClDecl


-- pretty printing of foreign declarations
--
618

619
instance OutputableBndr name => Outputable (ForeignDecl name) where
chak's avatar
chak committed
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634
  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) = 
635
        ptext SLIT("static") <+> ftext header <+> char '&' <>
chak's avatar
chak committed
636 637
	pprLib lib <> ppr lbl
      pprCEntity header lib (CFunction (StaticTarget lbl)) = 
638
        ptext SLIT("static") <+> ftext header <+> char '&' <>
chak's avatar
chak committed
639 640 641 642 643 644 645 646 647 648 649 650 651
	pprLib lib <> ppr lbl
      pprCEntity header lib (CFunction (DynamicTarget)) = 
        ptext SLIT("dynamic")
      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>\"")
652 653

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

657

658 659
%************************************************************************
%*									*
660
\subsection{Transformation rules}
661 662 663 664
%*									*
%************************************************************************

\begin{code}
665
data RuleDecl name
666
  = HsRule			-- Source rule
667 668
	RuleName		-- Rule name
	Activation
669
	[RuleBndr name]		-- Forall'd vars; after typechecking this includes tyvars
670 671
	(HsExpr name)	-- LHS
	(HsExpr name)	-- RHS
672 673 674 675 676
	SrcLoc		

data RuleBndr name
  = RuleBndr name
  | RuleBndrSig name (HsType name)
677

678 679 680
collectRuleBndrSigTys :: [RuleBndr name] -> [HsType name]
collectRuleBndrSigTys bndrs = [ty | RuleBndrSig _ ty <- bndrs]

681
instance OutputableBndr name => Outputable (RuleDecl name) where
682
  ppr (HsRule name act ns lhs rhs loc)
683
	= sep [text "{-# RULES" <+> doubleQuotes (ftext name) <+> ppr act,
684 685
	       nest 4 (pp_forall <+> pprExpr lhs), 
	       nest 4 (equals <+> pprExpr rhs <+> text "#-}") ]
686
	where
687 688
	  pp_forall | null ns   = empty
		    | otherwise	= text "forall" <+> fsep (map ppr ns) <> dot
689

690
instance OutputableBndr name => Outputable (RuleBndr name) where
691 692
   ppr (RuleBndr name) = ppr name
   ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty
693 694 695 696 697 698 699 700 701
\end{code}


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

702
We use exported entities for things to deprecate.
703 704

\begin{code}
705
data DeprecDecl name = Deprecation name DeprecTxt SrcLoc
706

707
instance OutputableBndr name => Outputable (DeprecDecl name) where
708
    ppr (Deprecation thing txt _)
709
      = hsep [text "{-# DEPRECATED", ppr thing, doubleQuotes (ppr txt), text "#-}"]
710
\end{code}