HsDecls.lhs 24.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(..), LHsDecl, TyClDecl(..), LTyClDecl, 
12
	InstDecl(..), LInstDecl, NewOrData(..),
13 14 15
	RuleDecl(..), LRuleDecl, RuleBndr(..),
	DefaultDecl(..), LDefaultDecl, HsGroup(..), SpliceDecl(..),
	ForeignDecl(..), LForeignDecl, ForeignImport(..), ForeignExport(..),
chak's avatar
chak committed
16
	CImportSpec(..), FoType(..),
17
	ConDecl(..), LConDecl,	
18 19
	DeprecDecl(..),  LDeprecDecl,
	tcdName, tyClDeclNames, tyClDeclTyVars,
20 21
	isClassDecl, isSynDecl, isDataDecl, 
	countTyClDecls,
22
	conDetailsTys,
23
	collectRuleBndrSigTys, 
24
    ) where
25

26
#include "HsVersions.h"
27 28

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

32
import HsBinds		( HsBindGroup, HsBind, LHsBinds, 
33
			  Sig(..), LSig, LFixitySig, pprLHsBinds )
34 35
import HsPat		( HsConDetails(..), hsConArgs )
import HsImpExp		( pprHsVar )
36
import HsTypes
37 38
import HscTypes		( DeprecTxt )
import CoreSyn		( RuleName )
39
import Kind		( Kind, pprKind )
40
import BasicTypes	( Activation(..) )
chak's avatar
chak committed
41
import ForeignCall	( CCallTarget(..), DNCallSpec, CCallConv, Safety,
42
			  CExportSpec(..), CLabelString ) 
43 44

-- others:
45
import FunDeps		( pprFundeps )
46
import Class		( FunDep )
47
import Outputable	
48
import Util		( count )
49
import SrcLoc		( Located(..), unLoc )
rrt's avatar
rrt committed
50
import FastString
51 52
\end{code}

53 54 55 56 57 58 59 60

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

\begin{code}
61 62
type LHsDecl id = Located (HsDecl id)

63 64 65
data HsDecl id
  = TyClD	(TyClDecl id)
  | InstD	(InstDecl  id)
66
  | ValD	(HsBind id)
67
  | SigD	(Sig id)
68 69 70 71
  | DefD	(DefaultDecl id)
  | ForD        (ForeignDecl id)
  | DeprecD	(DeprecDecl id)
  | RuleD	(RuleDecl id)
72
  | SpliceD	(SpliceDecl id)
73 74

-- NB: all top-level fixity decls are contained EITHER
75
-- EITHER SigDs
76 77 78 79 80 81 82 83 84 85
-- 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
86

87 88 89 90
-- A [HsDecl] is categorised into a HsGroup before being 
-- fed to the renamer.
data HsGroup id
  = HsGroup {
91 92
	hs_valds  :: [HsBindGroup id],
		-- Before the renamer, this is a single big HsBindGroup,
93
		-- with all the bindings, and all the signatures.
94 95
		-- The renamer does dependency analysis, splitting it up
		-- into several HsBindGroups.
96

97 98
	hs_tyclds :: [LTyClDecl id],
	hs_instds :: [LInstDecl id],
99

100
	hs_fixds  :: [LFixitySig id],
101 102 103
		-- Snaffled out of both top-level fixity signatures,
		-- and those in class declarations

104 105 106 107
	hs_defds  :: [LDefaultDecl id],
	hs_fords  :: [LForeignDecl id],
	hs_depds  :: [LDeprecDecl id],
	hs_ruleds :: [LRuleDecl id]
108
  }
109 110 111
\end{code}

\begin{code}
112
instance OutputableBndr name => Outputable (HsDecl name) where
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 (SigD sd)    = ppr sd
119
    ppr (RuleD rd)   = ppr rd
120
    ppr (DeprecD dd) = ppr dd
121
    ppr (SpliceD dd) = ppr dd
122 123 124 125 126 127 128 129 130

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

141
data SpliceDecl id = SpliceDecl (Located (HsExpr id))	-- Top level splice
142 143

instance OutputableBndr name => Outputable (SpliceDecl name) where
144
   ppr (SpliceDecl e) = ptext SLIT("$") <> parens (pprExpr (unLoc e))
145 146
\end{code}

147

148 149 150 151 152 153
%************************************************************************
%*									*
\subsection[TyDecl]{@data@, @newtype@ or @type@ (synonym) type declaration}
%*									*
%************************************************************************

154 155 156
		--------------------------------
			THE NAMING STORY
		--------------------------------
157

158 159
Here is the story about the implicit names that go with type, class,
and instance decls.  It's a bit tricky, so pay attention!
160 161 162

"Implicit" (or "system") binders
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
163 164 165 166 167 168 169 170 171
  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

172 173
All have occurrence names that are derived uniquely from their parent
declaration.
174 175 176 177 178 179 180 181 182

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
183 184 185 186 187
   (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
188

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

192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
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:
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
 - 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

269
  - The CoreTidy phase externalises the name, and ensures the occurrence name is
270 271 272 273 274 275 276 277 278 279 280 281
    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.
282

283 284
  - RnHsSyn.instDeclFVs treats the dict fun name as free in the decl, so that we
    suck in the dfun binding
285 286


287
\begin{code}
288 289 290 291 292
-- 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

293 294
type LTyClDecl name = Located (TyClDecl name)

295
data TyClDecl name
296 297 298 299 300
  = ForeignType { 
		tcdLName    :: Located name,
		tcdExtName  :: Maybe FastString,
		tcdFoType   :: FoType
  }
301

302
  | TyData {	tcdND     :: NewOrData,
303 304 305
		tcdCtxt   :: LHsContext name,	 	-- Context
		tcdLName  :: Located name,	 	-- Type constructor
		tcdTyVars :: [LHsTyVarBndr name], 	-- Type variables
306 307 308
		tcdKindSig :: Maybe Kind,		-- Optional kind sig; 
							-- (only for the 'where' form)

309
		tcdCons	  :: [LConDecl name],	 	-- Data constructors
310 311 312
			-- For data T a = T1 | T2 a          the LConDecls are all ConDecls
			-- For data T a where { T1 :: T a }  the LConDecls are all GadtDecls

313
		tcdDerivs :: Maybe [LHsType name]
314 315
			-- Derivings; Nothing => not specified
			-- 	      Just [] => derive exactly what is asked
316 317 318 319
			-- These "types" must be of form
			--	forall ab. C ty1 ty2
			-- Typically the foralls and ty args are empty, but they
			-- are non-empty for the newtype-deriving case
320 321
    }

322 323 324
  | TySynonym {	tcdLName  :: Located name,	        -- type constructor
		tcdTyVars :: [LHsTyVarBndr name],	-- type variables
		tcdSynRhs :: LHsType name	        -- synonym expansion
325 326
    }

327 328 329 330 331 332
  | ClassDecl {	tcdCtxt    :: LHsContext name, 	 	-- Context...
		tcdLName   :: Located name,	    	-- Name of the class
		tcdTyVars  :: [LHsTyVarBndr name],	-- Class type variables
		tcdFDs     :: [Located (FunDep name)],	-- Functional deps
		tcdSigs    :: [LSig name],		-- Methods' signatures
		tcdMeths   :: LHsBinds name		-- Default methods
333
    }
334 335 336 337 338

data NewOrData
  = NewType  	-- "newtype Blah ..."
  | DataType 	-- "data Blah ..."
  deriving( Eq )	-- Needed because Demand derives Eq
339 340 341 342 343
\end{code}

Simple classifiers

\begin{code}
344
isDataDecl, isSynDecl, isClassDecl :: TyClDecl name -> Bool
345

346 347
isSynDecl (TySynonym {}) = True
isSynDecl other		 = False
348

349 350
isDataDecl (TyData {}) = True
isDataDecl other       = False
351

352 353
isClassDecl (ClassDecl {}) = True
isClassDecl other	   = False
354 355 356
\end{code}

Dealing with names
357

358
\begin{code}
359 360
tcdName :: TyClDecl name -> name
tcdName decl = unLoc (tcdLName decl)
361

362
tyClDeclNames :: Eq name => TyClDecl name -> [Located name]
363
-- Returns all the *binding* names of the decl, along with their SrcLocs
364 365 366 367
-- 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

368 369
tyClDeclNames (TySynonym   {tcdLName = name})  = [name]
tyClDeclNames (ForeignType {tcdLName = name})  = [name]
370

371 372
tyClDeclNames (ClassDecl {tcdLName = cls_name, tcdSigs = sigs})
  = cls_name : [n | L _ (Sig n _) <- sigs]
373

374 375
tyClDeclNames (TyData {tcdLName = tc_name, tcdCons = cons})
  = tc_name : conDeclsNames (map unLoc cons)
376

377 378 379 380
tyClDeclTyVars (TySynonym {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (TyData    {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ClassDecl {tcdTyVars = tvs}) = tvs
tyClDeclTyVars (ForeignType {})		     = []
381 382 383
\end{code}

\begin{code}
384
countTyClDecls :: [TyClDecl name] -> (Int, Int, Int, Int)
385 386
	-- class, data, newtype, synonym decls
countTyClDecls decls 
sof's avatar
sof committed
387 388 389 390 391 392 393 394 395 396
 = (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
397 398 399
\end{code}

\begin{code}
400 401
instance OutputableBndr name
	      => Outputable (TyClDecl name) where
402

403 404
    ppr (ForeignType {tcdLName = ltycon})
	= hsep [ptext SLIT("foreign import type dotnet"), ppr ltycon]
405

406 407
    ppr (TySynonym {tcdLName = ltycon, tcdTyVars = tyvars, tcdSynRhs = mono_ty})
      = hang (ptext SLIT("type") <+> pp_decl_head [] ltycon tyvars <+> equals)
408
	     4 (ppr mono_ty)
409

410
    ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdLName = ltycon,
411
		 tcdTyVars = tyvars, tcdKindSig = mb_sig, tcdCons = condecls, 
412
		 tcdDerivs = derivings})
413
      = pp_tydecl (ppr new_or_data <+> pp_decl_head (unLoc context) ltycon tyvars <+> ppr_sig mb_sig)
414
		  (pp_condecls condecls)
415
		  derivings
416 417 418
      where
	ppr_sig Nothing = empty
	ppr_sig (Just kind) = dcolon <+> pprKind kind
419

420
    ppr (ClassDecl {tcdCtxt = context, tcdLName = lclas, tcdTyVars = tyvars, tcdFDs = fds,
421
		    tcdSigs = sigs, tcdMeths = methods})
422 423 424 425 426
      | null sigs	-- No "where" part
      = top_matter

      | otherwise	-- Laid out
      = sep [hsep [top_matter, ptext SLIT("where {")],
427
	     nest 4 (sep [sep (map ppr_sig sigs), ppr methods, char '}'])]
428
      where
429
        top_matter  = ptext SLIT("class") <+> pp_decl_head (unLoc context) lclas tyvars <+> pprFundeps (map unLoc fds)
430
	ppr_sig sig = ppr sig <> semi
431

432 433 434 435 436 437 438
pp_decl_head :: OutputableBndr name
   => HsContext name
   -> Located name
   -> [LHsTyVarBndr name]
   -> SDoc
pp_decl_head context thing tyvars
  = hsep [pprHsContext context, ppr thing, interppSP tyvars]
439

440 441 442 443
pp_condecls cs@(L _ (GadtDecl _ _) : _) -- In GADT syntax
  = hang (ptext SLIT("where")) 2 (vcat (map ppr cs))
pp_condecls cs 			  -- In H98 syntax
  = equals <+> sep (punctuate (ptext SLIT(" |")) (map ppr cs))
444

445
pp_tydecl pp_head pp_decl_rhs derivings
sof's avatar
sof committed
446
  = hang pp_head 4 (sep [
447
	pp_decl_rhs,
448 449
	case derivings of
	  Nothing 	   -> empty
450
	  Just ds	   -> hsep [ptext SLIT("deriving"), parens (interpp'SP ds)]
451
    ])
452 453 454 455

instance Outputable NewOrData where
  ppr NewType  = ptext SLIT("newtype")
  ppr DataType = ptext SLIT("data")
456 457 458 459 460 461 462 463 464 465
\end{code}


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

\begin{code}
466 467
type LConDecl name = Located (ConDecl name)

468
data ConDecl name
469
  = ConDecl 	(Located name)		-- Constructor name; this is used for the
470 471
					-- DataCon itself, and for the user-callable wrapper Id

472 473
		[LHsTyVarBndr name]	-- Existentially quantified type variables
		(LHsContext name)	-- ...and context
474
					-- If both are empty then there are no existentials
475
		(HsConDetails name (LBangType name))
476 477 478 479 480

  | GadtDecl    (Located name)          -- Constructor name; this is used for the
					-- DataCon itself, and for the user-callable wrapper Id
                (LHsType name)          -- Constructor type; it may have HsBangs on the 
					-- argument types
481 482 483
\end{code}

\begin{code}
484
conDeclsNames :: Eq name => [ConDecl name] -> [Located name]
485 486 487 488
  -- 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
489
  = snd (foldl do_one ([], []) cons)
490
  where
491 492
    do_one (flds_seen, acc) (ConDecl lname _ _ (RecCon flds))
	= (map unLoc new_flds ++ flds_seen, lname : [f | f <- new_flds] ++ acc)
493
	where
494
	  new_flds = [ f | (f,_) <- flds, not (unLoc f `elem` flds_seen) ]
495

496 497
    do_one (flds_seen, acc) (ConDecl lname _ _ _)
	= (flds_seen, lname:acc)
498

499 500 501 502
-- gaw 2004
    do_one (flds_seen, acc) (GadtDecl lname _)
	= (flds_seen, lname:acc)

503
conDetailsTys details = map getBangType (hsConArgs details)
504
\end{code}
505
  
506 507

\begin{code}
508
instance (OutputableBndr name) => Outputable (ConDecl name) where
509
    ppr (ConDecl con tvs cxt con_details)
510
      = sep [pprHsForAll Explicit tvs cxt, ppr_con_details con con_details]
511 512
    ppr (GadtDecl con ty)
      = ppr con <+> dcolon <+> ppr ty
513

514
ppr_con_details con (InfixCon ty1 ty2)
515
  = hsep [ppr ty1, pprHsVar con, ppr ty2]
516

517
-- ConDecls generated by MkIface.ifaceTyThing always have a PrefixCon, even
518 519 520
-- 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.
521
ppr_con_details con (PrefixCon tys)
522
  = hsep (pprHsVar con : map ppr tys)
sof's avatar
sof committed
523

524
ppr_con_details con (RecCon fields)
525
  = ppr con <+> braces (sep (punctuate comma (map ppr_field fields)))
sof's avatar
sof committed
526
  where
527
    ppr_field (n, ty) = ppr n <+> dcolon <+> ppr ty
sof's avatar
sof committed
528

529 530 531 532
\end{code}

%************************************************************************
%*									*
sof's avatar
sof committed
533
\subsection[InstDecl]{An instance declaration
534 535 536 537
%*									*
%************************************************************************

\begin{code}
538 539
type LInstDecl name = Located (InstDecl name)

540
data InstDecl name
541
  = InstDecl	(LHsType name)	-- Context => Class Instance-type
542 543
				-- Using a polytype means that the renamer conveniently
				-- figures out the quantified type variables for us.
544 545
		(LHsBinds name)
		[LSig name]		-- User-supplied pragmatic info
546

547
instance (OutputableBndr name) => Outputable (InstDecl name) where
548

549
    ppr (InstDecl inst_ty binds uprags)
550 551
      = vcat [hsep [ptext SLIT("instance"), ppr inst_ty, ptext SLIT("where")],
	      nest 4 (ppr uprags),
552
	      nest 4 (pprLHsBinds binds) ]
553 554
\end{code}

555 556 557 558 559 560 561 562 563 564 565
%************************************************************************
%*									*
\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}
566 567
type LDefaultDecl name = Located (DefaultDecl name)

568
data DefaultDecl name
569
  = DefaultDecl	[LHsType name]
570

571
instance (OutputableBndr name)
572 573
	      => Outputable (DefaultDecl name) where

574
    ppr (DefaultDecl tys)
575
      = ptext SLIT("default") <+> parens (interpp'SP tys)
576
\end{code}
577

sof's avatar
sof committed
578 579 580 581 582 583 584
%************************************************************************
%*									*
\subsection{Foreign function interface declaration}
%*									*
%************************************************************************

\begin{code}
chak's avatar
chak committed
585 586 587 588 589 590 591

-- 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
--
592 593
type LForeignDecl name = Located (ForeignDecl name)

594
data ForeignDecl name
595 596
  = ForeignImport (Located name) (LHsType name) ForeignImport Bool  -- defines name
  | ForeignExport (Located name) (LHsType name) ForeignExport Bool  -- uses name
597

chak's avatar
chak committed
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630
-- 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.)
631

chak's avatar
chak committed
632 633 634 635 636
-- specification of an externally exported entity in dependence on the calling
-- convention
--
data ForeignExport = CExport  CExportSpec    -- contains the calling convention
		   | DNExport		     -- presently unused
637

chak's avatar
chak committed
638 639
-- abstract type imported from .NET
--
640
data FoType = DNType 		-- In due course we'll add subtype stuff
chak's avatar
chak committed
641 642 643 644 645
	    deriving (Eq)	-- Used for equality instance for TyClDecl


-- pretty printing of foreign declarations
--
646

647
instance OutputableBndr name => Outputable (ForeignDecl name) where
648
  ppr (ForeignImport n ty fimport _) =
chak's avatar
chak committed
649 650
    ptext SLIT("foreign import") <+> ppr fimport <+> 
    ppr n <+> dcolon <+> ppr ty
651
  ppr (ForeignExport n ty fexport _) =
chak's avatar
chak committed
652 653 654 655 656 657 658 659 660 661 662
    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) = 
663
        ptext SLIT("static") <+> ftext header <+> char '&' <>
chak's avatar
chak committed
664 665
	pprLib lib <> ppr lbl
      pprCEntity header lib (CFunction (StaticTarget lbl)) = 
666
        ptext SLIT("static") <+> ftext header <+> char '&' <>
chak's avatar
chak committed
667 668 669 670 671 672 673 674 675 676 677 678 679
	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>\"")
680 681

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

685

686 687
%************************************************************************
%*									*
688
\subsection{Transformation rules}
689 690 691 692
%*									*
%************************************************************************

\begin{code}
693 694
type LRuleDecl name = Located (RuleDecl name)

695
data RuleDecl name
696
  = HsRule			-- Source rule
697 698
	RuleName		-- Rule name
	Activation
699
	[RuleBndr name]		-- Forall'd vars; after typechecking this includes tyvars
700 701
	(Located (HsExpr name))	-- LHS
	(Located (HsExpr name))	-- RHS
702 703

data RuleBndr name
704 705
  = RuleBndr (Located name)
  | RuleBndrSig (Located name) (LHsType name)
706

707
collectRuleBndrSigTys :: [RuleBndr name] -> [LHsType name]
708 709
collectRuleBndrSigTys bndrs = [ty | RuleBndrSig _ ty <- bndrs]

710
instance OutputableBndr name => Outputable (RuleDecl name) where
711
  ppr (HsRule name act ns lhs rhs)
712
	= sep [text "{-# RULES" <+> doubleQuotes (ftext name) <+> ppr act,
713 714
	       nest 4 (pp_forall <+> pprExpr (unLoc lhs)), 
	       nest 4 (equals <+> pprExpr (unLoc rhs) <+> text "#-}") ]
715
	where
716 717
	  pp_forall | null ns   = empty
		    | otherwise	= text "forall" <+> fsep (map ppr ns) <> dot
718

719
instance OutputableBndr name => Outputable (RuleBndr name) where
720 721
   ppr (RuleBndr name) = ppr name
   ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty
722 723 724 725 726 727 728 729 730
\end{code}


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

731
We use exported entities for things to deprecate.
732 733

\begin{code}
734 735 736
type LDeprecDecl name = Located (DeprecDecl name)

data DeprecDecl name = Deprecation name DeprecTxt
737

738
instance OutputableBndr name => Outputable (DeprecDecl name) where
739
    ppr (Deprecation thing txt)
740
      = hsep [text "{-# DEPRECATED", ppr thing, doubleQuotes (ppr txt), text "#-}"]
741
\end{code}