2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[HsDecls]{Abstract syntax: global declarations}
6 Definitions for: @TyDecl@ and @oCnDecl@, @ClassDecl@,
7 @InstDecl@, @DefaultDecl@ and @ForeignDecl@.
11 HsDecl(..), LHsDecl, TyClDecl(..), LTyClDecl,
12 InstDecl(..), LInstDecl, NewOrData(..),
13 RuleDecl(..), LRuleDecl, RuleBndr(..),
14 DefaultDecl(..), LDefaultDecl, SpliceDecl(..),
15 ForeignDecl(..), LForeignDecl, ForeignImport(..), ForeignExport(..),
16 CImportSpec(..), FoType(..),
17 ConDecl(..), ResType(..), LConDecl,
18 DeprecDecl(..), LDeprecDecl,
19 HsGroup(..), emptyRdrGroup, emptyRnGroup, appendGroups,
20 tcdName, tyClDeclNames, tyClDeclTyVars,
21 isClassDecl, isSynDecl, isDataDecl,
24 collectRuleBndrSigTys,
27 #include "HsVersions.h"
30 import {-# SOURCE #-} HsExpr( HsExpr, pprExpr )
31 -- Because Expr imports Decls via HsBracket
33 import HsBinds ( HsValBinds(..), HsBind, LHsBinds, plusHsValBinds,
34 Sig(..), LSig, LFixitySig, pprLHsBinds,
35 emptyValBindsIn, emptyValBindsOut )
36 import HsPat ( HsConDetails(..), hsConArgs )
37 import HsImpExp ( pprHsVar )
39 import NameSet ( NameSet )
40 import HscTypes ( DeprecTxt )
41 import CoreSyn ( RuleName )
42 import Kind ( Kind, pprKind )
43 import BasicTypes ( Activation(..) )
44 import ForeignCall ( CCallTarget(..), DNCallSpec, CCallConv, Safety,
45 CExportSpec(..), CLabelString )
48 import FunDeps ( pprFundeps )
49 import Class ( FunDep )
52 import SrcLoc ( Located(..), unLoc, noLoc )
57 %************************************************************************
59 \subsection[HsDecl]{Declarations}
61 %************************************************************************
64 type LHsDecl id = Located (HsDecl id)
71 | DefD (DefaultDecl id)
72 | ForD (ForeignDecl id)
73 | DeprecD (DeprecDecl id)
75 | SpliceD (SpliceDecl id)
77 -- NB: all top-level fixity decls are contained EITHER
79 -- OR in the ClassDecls in TyClDs
82 -- a) data constructors
83 -- b) class methods (but they can be also done in the
84 -- signatures of class decls)
85 -- c) imported functions (that have an IfacSig)
88 -- The latter is for class methods only
90 -- A [HsDecl] is categorised into a HsGroup before being
91 -- fed to the renamer.
94 hs_valds :: HsValBinds id,
95 hs_tyclds :: [LTyClDecl id],
96 hs_instds :: [LInstDecl id],
98 hs_fixds :: [LFixitySig id],
99 -- Snaffled out of both top-level fixity signatures,
100 -- and those in class declarations
102 hs_defds :: [LDefaultDecl id],
103 hs_fords :: [LForeignDecl id],
104 hs_depds :: [LDeprecDecl id],
105 hs_ruleds :: [LRuleDecl id]
108 emptyGroup, emptyRdrGroup, emptyRnGroup :: HsGroup a
109 emptyRdrGroup = emptyGroup { hs_valds = emptyValBindsIn }
110 emptyRnGroup = emptyGroup { hs_valds = emptyValBindsOut }
112 emptyGroup = HsGroup { hs_tyclds = [], hs_instds = [],
113 hs_fixds = [], hs_defds = [], hs_fords = [],
114 hs_depds = [], hs_ruleds = [],
115 hs_valds = error "emptyGroup hs_valds: Can't happen" }
117 appendGroups :: HsGroup a -> HsGroup a -> HsGroup a
120 hs_valds = val_groups1,
129 hs_valds = val_groups2,
139 hs_valds = val_groups1 `plusHsValBinds` val_groups2,
140 hs_tyclds = tyclds1 ++ tyclds2,
141 hs_instds = instds1 ++ instds2,
142 hs_fixds = fixds1 ++ fixds2,
143 hs_defds = defds1 ++ defds2,
144 hs_fords = fords1 ++ fords2,
145 hs_depds = depds1 ++ depds2,
146 hs_ruleds = rulds1 ++ rulds2 }
150 instance OutputableBndr name => Outputable (HsDecl name) where
151 ppr (TyClD dcl) = ppr dcl
152 ppr (ValD binds) = ppr binds
153 ppr (DefD def) = ppr def
154 ppr (InstD inst) = ppr inst
155 ppr (ForD fd) = ppr fd
156 ppr (SigD sd) = ppr sd
157 ppr (RuleD rd) = ppr rd
158 ppr (DeprecD dd) = ppr dd
159 ppr (SpliceD dd) = ppr dd
161 instance OutputableBndr name => Outputable (HsGroup name) where
162 ppr (HsGroup { hs_valds = val_decls,
163 hs_tyclds = tycl_decls,
164 hs_instds = inst_decls,
165 hs_fixds = fix_decls,
166 hs_depds = deprec_decls,
167 hs_fords = foreign_decls,
168 hs_defds = default_decls,
169 hs_ruleds = rule_decls })
170 = vcat [ppr_ds fix_decls, ppr_ds default_decls,
171 ppr_ds deprec_decls, ppr_ds rule_decls,
173 ppr_ds tycl_decls, ppr_ds inst_decls,
174 ppr_ds foreign_decls]
177 ppr_ds ds = text "" $$ vcat (map ppr ds)
179 data SpliceDecl id = SpliceDecl (Located (HsExpr id)) -- Top level splice
181 instance OutputableBndr name => Outputable (SpliceDecl name) where
182 ppr (SpliceDecl e) = ptext SLIT("$") <> parens (pprExpr (unLoc e))
186 %************************************************************************
188 \subsection[TyDecl]{@data@, @newtype@ or @type@ (synonym) type declaration}
190 %************************************************************************
192 --------------------------------
194 --------------------------------
196 Here is the story about the implicit names that go with type, class,
197 and instance decls. It's a bit tricky, so pay attention!
199 "Implicit" (or "system") binders
200 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
201 Each data type decl defines
202 a worker name for each constructor
203 to-T and from-T convertors
204 Each class decl defines
205 a tycon for the class
206 a data constructor for that tycon
207 the worker for that constructor
208 a selector for each superclass
210 All have occurrence names that are derived uniquely from their parent
213 None of these get separate definitions in an interface file; they are
214 fully defined by the data or class decl. But they may *occur* in
215 interface files, of course. Any such occurrence must haul in the
216 relevant type or class decl.
219 - Ensure they "point to" the parent data/class decl
220 when loading that decl from an interface file
221 (See RnHiFiles.getSysBinders)
223 - When typechecking the decl, we build the implicit TyCons and Ids.
224 When doing so we look them up in the name cache (RnEnv.lookupSysName),
225 to ensure correct module and provenance is set
227 These are the two places that we have to conjure up the magic derived
228 names. (The actual magic is in OccName.mkWorkerOcc, etc.)
232 - Occurrence name is derived uniquely from the method name
235 - If there is a default method name at all, it's recorded in
236 the ClassOpSig (in HsBinds), in the DefMeth field.
237 (DefMeth is defined in Class.lhs)
239 Source-code class decls and interface-code class decls are treated subtly
240 differently, which has given me a great deal of confusion over the years.
241 Here's the deal. (We distinguish the two cases because source-code decls
242 have (Just binds) in the tcdMeths field, whereas interface decls have Nothing.
244 In *source-code* class declarations:
246 - When parsing, every ClassOpSig gets a DefMeth with a suitable RdrName
247 This is done by RdrHsSyn.mkClassOpSigDM
249 - The renamer renames it to a Name
251 - During typechecking, we generate a binding for each $dm for
252 which there's a programmer-supplied default method:
257 We generate a binding for $dmop1 but not for $dmop2.
258 The Class for Foo has a NoDefMeth for op2 and a DefMeth for op1.
259 The Name for $dmop2 is simply discarded.
261 In *interface-file* class declarations:
262 - When parsing, we see if there's an explicit programmer-supplied default method
263 because there's an '=' sign to indicate it:
265 op1 = :: <type> -- NB the '='
267 We use this info to generate a DefMeth with a suitable RdrName for op1,
268 and a NoDefMeth for op2
269 - The interface file has a separate definition for $dmop1, with unfolding etc.
270 - The renamer renames it to a Name.
271 - The renamer treats $dmop1 as a free variable of the declaration, so that
272 the binding for $dmop1 will be sucked in. (See RnHsSyn.tyClDeclFVs)
273 This doesn't happen for source code class decls, because they *bind* the default method.
277 Each instance declaration gives rise to one dictionary function binding.
279 The type checker makes up new source-code instance declarations
280 (e.g. from 'deriving' or generic default methods --- see
281 TcInstDcls.tcInstDecls1). So we can't generate the names for
282 dictionary functions in advance (we don't know how many we need).
284 On the other hand for interface-file instance declarations, the decl
285 specifies the name of the dictionary function, and it has a binding elsewhere
286 in the interface file:
287 instance {Eq Int} = dEqInt
288 dEqInt :: {Eq Int} <pragma info>
290 So again we treat source code and interface file code slightly differently.
293 - Source code instance decls have a Nothing in the (Maybe name) field
294 (see data InstDecl below)
296 - The typechecker makes up a Local name for the dict fun for any source-code
297 instance decl, whether it comes from a source-code instance decl, or whether
298 the instance decl is derived from some other construct (e.g. 'deriving').
300 - The occurrence name it chooses is derived from the instance decl (just for
301 documentation really) --- e.g. dNumInt. Two dict funs may share a common
302 occurrence name, but will have different uniques. E.g.
303 instance Foo [Int] where ...
304 instance Foo [Bool] where ...
305 These might both be dFooList
307 - The CoreTidy phase externalises the name, and ensures the occurrence name is
308 unique (this isn't special to dict funs). So we'd get dFooList and dFooList1.
310 - We can take this relaxed approach (changing the occurrence name later)
311 because dict fun Ids are not captured in a TyCon or Class (unlike default
312 methods, say). Instead, they are kept separately in the InstEnv. This
313 makes it easy to adjust them after compiling a module. (Once we've finished
314 compiling that module, they don't change any more.)
318 - The instance decl gives the dict fun name, so the InstDecl has a (Just name)
319 in the (Maybe name) field.
321 - RnHsSyn.instDeclFVs treats the dict fun name as free in the decl, so that we
322 suck in the dfun binding
326 -- TyClDecls are precisely the kind of declarations that can
327 -- appear in interface files; or (internally) in GHC's interface
328 -- for a module. That's why (despite the misnomer) IfaceSig and ForeignType
329 -- are both in TyClDecl
331 type LTyClDecl name = Located (TyClDecl name)
335 tcdLName :: Located name,
336 tcdExtName :: Maybe FastString,
340 | TyData { tcdND :: NewOrData,
341 tcdCtxt :: LHsContext name, -- Context
342 tcdLName :: Located name, -- Type constructor
343 tcdTyVars :: [LHsTyVarBndr name], -- Type variables
344 tcdKindSig :: Maybe Kind, -- Optional kind sig;
345 -- (only for the 'where' form)
347 tcdCons :: [LConDecl name], -- Data constructors
348 -- For data T a = T1 | T2 a the LConDecls all have ResTyH98
349 -- For data T a where { T1 :: T a } the LConDecls all have ResTyGADT
351 tcdDerivs :: Maybe [LHsType name]
352 -- Derivings; Nothing => not specified
353 -- Just [] => derive exactly what is asked
354 -- These "types" must be of form
355 -- forall ab. C ty1 ty2
356 -- Typically the foralls and ty args are empty, but they
357 -- are non-empty for the newtype-deriving case
360 | TySynonym { tcdLName :: Located name, -- type constructor
361 tcdTyVars :: [LHsTyVarBndr name], -- type variables
362 tcdSynRhs :: LHsType name -- synonym expansion
365 | ClassDecl { tcdCtxt :: LHsContext name, -- Context...
366 tcdLName :: Located name, -- Name of the class
367 tcdTyVars :: [LHsTyVarBndr name], -- Class type variables
368 tcdFDs :: [Located (FunDep name)], -- Functional deps
369 tcdSigs :: [LSig name], -- Methods' signatures
370 tcdMeths :: LHsBinds name -- Default methods
374 = NewType -- "newtype Blah ..."
375 | DataType -- "data Blah ..."
376 deriving( Eq ) -- Needed because Demand derives Eq
382 isDataDecl, isSynDecl, isClassDecl :: TyClDecl name -> Bool
384 isSynDecl (TySynonym {}) = True
385 isSynDecl other = False
387 isDataDecl (TyData {}) = True
388 isDataDecl other = False
390 isClassDecl (ClassDecl {}) = True
391 isClassDecl other = False
397 tcdName :: TyClDecl name -> name
398 tcdName decl = unLoc (tcdLName decl)
400 tyClDeclNames :: Eq name => TyClDecl name -> [Located name]
401 -- Returns all the *binding* names of the decl, along with their SrcLocs
402 -- The first one is guaranteed to be the name of the decl
403 -- For record fields, the first one counts as the SrcLoc
404 -- We use the equality to filter out duplicate field names
406 tyClDeclNames (TySynonym {tcdLName = name}) = [name]
407 tyClDeclNames (ForeignType {tcdLName = name}) = [name]
409 tyClDeclNames (ClassDecl {tcdLName = cls_name, tcdSigs = sigs})
410 = cls_name : [n | L _ (TypeSig n _) <- sigs]
412 tyClDeclNames (TyData {tcdLName = tc_name, tcdCons = cons})
413 = tc_name : conDeclsNames (map unLoc cons)
415 tyClDeclTyVars (TySynonym {tcdTyVars = tvs}) = tvs
416 tyClDeclTyVars (TyData {tcdTyVars = tvs}) = tvs
417 tyClDeclTyVars (ClassDecl {tcdTyVars = tvs}) = tvs
418 tyClDeclTyVars (ForeignType {}) = []
422 countTyClDecls :: [TyClDecl name] -> (Int, Int, Int, Int)
423 -- class, data, newtype, synonym decls
425 = (count isClassDecl decls,
426 count isSynDecl decls,
427 count isDataTy decls,
430 isDataTy TyData{tcdND=DataType} = True
433 isNewTy TyData{tcdND=NewType} = True
438 instance OutputableBndr name
439 => Outputable (TyClDecl name) where
441 ppr (ForeignType {tcdLName = ltycon})
442 = hsep [ptext SLIT("foreign import type dotnet"), ppr ltycon]
444 ppr (TySynonym {tcdLName = ltycon, tcdTyVars = tyvars, tcdSynRhs = mono_ty})
445 = hang (ptext SLIT("type") <+> pp_decl_head [] ltycon tyvars <+> equals)
448 ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdLName = ltycon,
449 tcdTyVars = tyvars, tcdKindSig = mb_sig, tcdCons = condecls,
450 tcdDerivs = derivings})
451 = pp_tydecl (ppr new_or_data <+> pp_decl_head (unLoc context) ltycon tyvars <+> ppr_sig mb_sig)
452 (pp_condecls condecls)
455 ppr_sig Nothing = empty
456 ppr_sig (Just kind) = dcolon <+> pprKind kind
458 ppr (ClassDecl {tcdCtxt = context, tcdLName = lclas, tcdTyVars = tyvars, tcdFDs = fds,
459 tcdSigs = sigs, tcdMeths = methods})
460 | null sigs -- No "where" part
463 | otherwise -- Laid out
464 = sep [hsep [top_matter, ptext SLIT("where {")],
465 nest 4 (sep [sep (map ppr_sig sigs), ppr methods, char '}'])]
467 top_matter = ptext SLIT("class") <+> pp_decl_head (unLoc context) lclas tyvars <+> pprFundeps (map unLoc fds)
468 ppr_sig sig = ppr sig <> semi
470 pp_decl_head :: OutputableBndr name
473 -> [LHsTyVarBndr name]
475 pp_decl_head context thing tyvars
476 = hsep [pprHsContext context, ppr thing, interppSP tyvars]
477 pp_condecls cs@(L _ ConDecl{ con_res = ResTyGADT _ } : _) -- In GADT syntax
478 = hang (ptext SLIT("where")) 2 (vcat (map ppr cs))
479 pp_condecls cs -- In H98 syntax
480 = equals <+> sep (punctuate (ptext SLIT(" |")) (map ppr cs))
482 pp_tydecl pp_head pp_decl_rhs derivings
483 = hang pp_head 4 (sep [
487 Just ds -> hsep [ptext SLIT("deriving"), parens (interpp'SP ds)]
490 instance Outputable NewOrData where
491 ppr NewType = ptext SLIT("newtype")
492 ppr DataType = ptext SLIT("data")
496 %************************************************************************
498 \subsection[ConDecl]{A data-constructor declaration}
500 %************************************************************************
503 type LConDecl name = Located (ConDecl name)
505 -- data T b = forall a. Eq a => MkT a b
506 -- MkT :: forall b a. Eq a => MkT a b
509 -- MkT1 :: Int -> T Int
511 -- data T = Int `MkT` Int
515 -- Int `MkT` Int :: T Int
519 { con_name :: Located name -- Constructor name; this is used for the
520 -- DataCon itself, and for the user-callable wrapper Id
522 , con_explicit :: HsExplicitForAll -- Is there an user-written forall? (cf. HStypes.HsForAllTy)
524 , con_qvars :: [LHsTyVarBndr name] -- ResTyH98: the constructor's existential type variables
525 -- ResTyGADT: all the constructor's quantified type variables
527 , con_cxt :: LHsContext name -- The context. This *does not* include the
528 -- "stupid theta" which lives only in the TyData decl
530 , con_details :: HsConDetails name (LBangType name) -- The main payload
532 , con_res :: ResType name -- Result type of the constructor
536 = ResTyH98 -- Constructor was declared using Haskell 98 syntax
537 | ResTyGADT (LHsType name) -- Constructor was declared using GADT-style syntax,
538 -- and here is its result type
542 conDeclsNames :: Eq name => [ConDecl name] -> [Located name]
543 -- See tyClDeclNames for what this does
544 -- The function is boringly complicated because of the records
545 -- And since we only have equality, we have to be a little careful
547 = snd (foldl do_one ([], []) cons)
549 do_one (flds_seen, acc) (ConDecl { con_name = lname, con_details = RecCon flds })
550 = (map unLoc new_flds ++ flds_seen, lname : [f | f <- new_flds] ++ acc)
552 new_flds = [ f | (f,_) <- flds, not (unLoc f `elem` flds_seen) ]
554 do_one (flds_seen, acc) c
555 = (flds_seen, (con_name c):acc)
557 conDetailsTys details = map getBangType (hsConArgs details)
562 instance (OutputableBndr name) => Outputable (ConDecl name) where
565 pprConDecl (ConDecl con expl tvs cxt details ResTyH98)
566 = sep [pprHsForAll expl tvs cxt, ppr_details con details]
568 ppr_details con (InfixCon t1 t2) = hsep [ppr t1, pprHsVar con, ppr t2]
569 ppr_details con (PrefixCon tys) = hsep (pprHsVar con : map ppr tys)
570 ppr_details con (RecCon fields) = ppr con <+> ppr_fields fields
572 pprConDecl (ConDecl con expl tvs cxt details (ResTyGADT res_ty))
573 = sep [pprHsForAll expl tvs cxt, ppr con <+> ppr_details details]
575 ppr_details (PrefixCon arg_tys) = dcolon <+> ppr (foldr mk_fun_ty res_ty arg_tys)
576 ppr_details (RecCon fields) = ppr fields <+> dcolon <+> ppr res_ty
578 mk_fun_ty a b = noLoc (HsFunTy a b)
580 ppr_fields fields = braces (sep (punctuate comma (map ppr_field fields)))
581 ppr_field (n, ty) = ppr n <+> dcolon <+> ppr ty
584 %************************************************************************
586 \subsection[InstDecl]{An instance declaration
588 %************************************************************************
591 type LInstDecl name = Located (InstDecl name)
594 = InstDecl (LHsType name) -- Context => Class Instance-type
595 -- Using a polytype means that the renamer conveniently
596 -- figures out the quantified type variables for us.
598 [LSig name] -- User-supplied pragmatic info
600 instance (OutputableBndr name) => Outputable (InstDecl name) where
602 ppr (InstDecl inst_ty binds uprags)
603 = vcat [hsep [ptext SLIT("instance"), ppr inst_ty, ptext SLIT("where")],
605 nest 4 (pprLHsBinds binds) ]
608 %************************************************************************
610 \subsection[DefaultDecl]{A @default@ declaration}
612 %************************************************************************
614 There can only be one default declaration per module, but it is hard
615 for the parser to check that; we pass them all through in the abstract
616 syntax, and that restriction must be checked in the front end.
619 type LDefaultDecl name = Located (DefaultDecl name)
621 data DefaultDecl name
622 = DefaultDecl [LHsType name]
624 instance (OutputableBndr name)
625 => Outputable (DefaultDecl name) where
627 ppr (DefaultDecl tys)
628 = ptext SLIT("default") <+> parens (interpp'SP tys)
631 %************************************************************************
633 \subsection{Foreign function interface declaration}
635 %************************************************************************
639 -- foreign declarations are distinguished as to whether they define or use a
642 -- * the Boolean value indicates whether the pre-standard deprecated syntax
645 type LForeignDecl name = Located (ForeignDecl name)
647 data ForeignDecl name
648 = ForeignImport (Located name) (LHsType name) ForeignImport Bool -- defines name
649 | ForeignExport (Located name) (LHsType name) ForeignExport Bool -- uses name
651 -- specification of an imported external entity in dependence on the calling
654 data ForeignImport = -- import of a C entity
656 -- * the two strings specifying a header file or library
657 -- may be empty, which indicates the absence of a
658 -- header or object specification (both are not used
659 -- in the case of `CWrapper' and when `CFunction'
660 -- has a dynamic target)
662 -- * the calling convention is irrelevant for code
663 -- generation in the case of `CLabel', but is needed
664 -- for pretty printing
666 -- * `Safety' is irrelevant for `CLabel' and `CWrapper'
668 CImport CCallConv -- ccall or stdcall
669 Safety -- safe or unsafe
670 FastString -- name of C header
671 FastString -- name of library object
672 CImportSpec -- details of the C entity
674 -- import of a .NET function
676 | DNImport DNCallSpec
678 -- details of an external C entity
680 data CImportSpec = CLabel CLabelString -- import address of a C label
681 | CFunction CCallTarget -- static or dynamic function
682 | CWrapper -- wrapper to expose closures
685 -- specification of an externally exported entity in dependence on the calling
688 data ForeignExport = CExport CExportSpec -- contains the calling convention
689 | DNExport -- presently unused
691 -- abstract type imported from .NET
693 data FoType = DNType -- In due course we'll add subtype stuff
694 deriving (Eq) -- Used for equality instance for TyClDecl
697 -- pretty printing of foreign declarations
700 instance OutputableBndr name => Outputable (ForeignDecl name) where
701 ppr (ForeignImport n ty fimport _) =
702 ptext SLIT("foreign import") <+> ppr fimport <+>
703 ppr n <+> dcolon <+> ppr ty
704 ppr (ForeignExport n ty fexport _) =
705 ptext SLIT("foreign export") <+> ppr fexport <+>
706 ppr n <+> dcolon <+> ppr ty
708 instance Outputable ForeignImport where
709 ppr (DNImport spec) =
710 ptext SLIT("dotnet") <+> ppr spec
711 ppr (CImport cconv safety header lib spec) =
712 ppr cconv <+> ppr safety <+>
713 char '"' <> pprCEntity header lib spec <> char '"'
715 pprCEntity header lib (CLabel lbl) =
716 ptext SLIT("static") <+> ftext header <+> char '&' <>
717 pprLib lib <> ppr lbl
718 pprCEntity header lib (CFunction (StaticTarget lbl)) =
719 ptext SLIT("static") <+> ftext header <+> char '&' <>
720 pprLib lib <> ppr lbl
721 pprCEntity header lib (CFunction (DynamicTarget)) =
722 ptext SLIT("dynamic")
723 pprCEntity _ _ (CWrapper) = ptext SLIT("wrapper")
725 pprLib lib | nullFS lib = empty
726 | otherwise = char '[' <> ppr lib <> char ']'
728 instance Outputable ForeignExport where
729 ppr (CExport (CExportStatic lbl cconv)) =
730 ppr cconv <+> char '"' <> ppr lbl <> char '"'
732 ptext SLIT("dotnet") <+> ptext SLIT("\"<unused>\"")
734 instance Outputable FoType where
735 ppr DNType = ptext SLIT("type dotnet")
739 %************************************************************************
741 \subsection{Transformation rules}
743 %************************************************************************
746 type LRuleDecl name = Located (RuleDecl name)
749 = HsRule -- Source rule
750 RuleName -- Rule name
752 [RuleBndr name] -- Forall'd vars; after typechecking this includes tyvars
753 (Located (HsExpr name)) -- LHS
754 NameSet -- Free-vars from the LHS
755 (Located (HsExpr name)) -- RHS
756 NameSet -- Free-vars from the RHS
759 = RuleBndr (Located name)
760 | RuleBndrSig (Located name) (LHsType name)
762 collectRuleBndrSigTys :: [RuleBndr name] -> [LHsType name]
763 collectRuleBndrSigTys bndrs = [ty | RuleBndrSig _ ty <- bndrs]
765 instance OutputableBndr name => Outputable (RuleDecl name) where
766 ppr (HsRule name act ns lhs fv_lhs rhs fv_rhs)
767 = sep [text "{-# RULES" <+> doubleQuotes (ftext name) <+> ppr act,
768 nest 4 (pp_forall <+> pprExpr (unLoc lhs)),
769 nest 4 (equals <+> pprExpr (unLoc rhs) <+> text "#-}") ]
771 pp_forall | null ns = empty
772 | otherwise = text "forall" <+> fsep (map ppr ns) <> dot
774 instance OutputableBndr name => Outputable (RuleBndr name) where
775 ppr (RuleBndr name) = ppr name
776 ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty
780 %************************************************************************
782 \subsection[DeprecDecl]{Deprecations}
784 %************************************************************************
786 We use exported entities for things to deprecate.
789 type LDeprecDecl name = Located (DeprecDecl name)
791 data DeprecDecl name = Deprecation name DeprecTxt
793 instance OutputableBndr name => Outputable (DeprecDecl name) where
794 ppr (Deprecation thing txt)
795 = hsep [text "{-# DEPRECATED", ppr thing, doubleQuotes (ppr txt), text "#-}"]