ghc-7.0.3: The GHC API

HsDecls

Contents

- Toplevel declarations
  - Class or type declarations
  - Instance declarations
  - Standalone deriving declarations
  - `RULE` declarations
  - `default` declarations
  - Top-level template haskell splice
  - Foreign function interface declarations
  - Data-constructor declarations
  - Document comments
  - Deprecations
  - Annotations
- Grouping

Description

Abstract syntax of global declarations.

Definitions for: `TyDecl` and `ConDecl`, `ClassDecl`, `InstDecl`, `DefaultDecl` and `ForeignDecl`.

Synopsis

- data HsDecl id
  - = TyClD (TyClDecl id)
  - | InstD (InstDecl id)
  - | DerivD (DerivDecl id)
  - | ValD (HsBind id)
  - | SigD (Sig id)
  - | DefD (DefaultDecl id)
  - | ForD (ForeignDecl id)
  - | WarningD (WarnDecl id)
  - | AnnD (AnnDecl id)
  - | RuleD (RuleDecl id)
  - | SpliceD (SpliceDecl id)
  - | DocD DocDecl
  - | QuasiQuoteD (HsQuasiQuote id)
- type LHsDecl id = Located (HsDecl id)
- data TyClDecl name
  - = ForeignType {
    - tcdLName :: Located name
    - tcdExtName :: Maybe FastString
    }
  - | TyFamily {
    - tcdFlavour :: FamilyFlavour
    - tcdLName :: Located name
    - tcdTyVars :: [LHsTyVarBndr name]
    - tcdKind :: Maybe Kind
    }
  - | TyData {
    - tcdND :: NewOrData
    - tcdCtxt :: LHsContext name
    - tcdLName :: Located name
    - tcdTyVars :: [LHsTyVarBndr name]
    - tcdTyPats :: Maybe [LHsType name]
    - tcdKindSig :: Maybe Kind
    - tcdCons :: [LConDecl name]
    - tcdDerivs :: Maybe [LHsType name]
    }
  - | TySynonym {
    - tcdLName :: Located name
    - tcdTyVars :: [LHsTyVarBndr name]
    - tcdTyPats :: Maybe [LHsType name]
    - tcdSynRhs :: LHsType name
    }
  - | ClassDecl {
    - tcdCtxt :: LHsContext name
    - tcdLName :: Located name
    - tcdTyVars :: [LHsTyVarBndr name]
    - tcdFDs :: [Located (FunDep name)]
    - tcdSigs :: [LSig name]
    - tcdMeths :: LHsBinds name
    - tcdATs :: [LTyClDecl name]
    - tcdDocs :: [LDocDecl]
    }
- type LTyClDecl name = Located (TyClDecl name)
- isClassDecl :: TyClDecl name -> Bool
- isSynDecl :: TyClDecl name -> Bool
- isDataDecl :: TyClDecl name -> Bool
- isTypeDecl :: TyClDecl name -> Bool
- isFamilyDecl :: TyClDecl name -> Bool
- isFamInstDecl :: TyClDecl name -> Bool
- tcdName :: TyClDecl name -> name
- tyClDeclTyVars :: TyClDecl name -> [LHsTyVarBndr name]
- countTyClDecls :: [TyClDecl name] -> (Int, Int, Int, Int, Int, Int)
- data InstDecl name = InstDecl (LHsType name) (LHsBinds name) [LSig name] [LTyClDecl name]
- type LInstDecl name = Located (InstDecl name)
- data NewOrData
  - = NewType
  - | DataType
- data FamilyFlavour
  - = TypeFamily
  - | DataFamily
- instDeclATs :: [LInstDecl name] -> [LTyClDecl name]
- data DerivDecl name = DerivDecl (LHsType name)
- type LDerivDecl name = Located (DerivDecl name)
- data RuleDecl name = HsRule RuleName Activation [RuleBndr name] (Located (HsExpr name)) NameSet (Located (HsExpr name)) NameSet
- type LRuleDecl name = Located (RuleDecl name)
- data RuleBndr name
  - = RuleBndr (Located name)
  - | RuleBndrSig (Located name) (LHsType name)
- collectRuleBndrSigTys :: [RuleBndr name] -> [LHsType name]
- data DefaultDecl name = DefaultDecl [LHsType name]
- type LDefaultDecl name = Located (DefaultDecl name)
- data SpliceDecl id = SpliceDecl (Located (HsExpr id)) HsExplicitFlag
- data ForeignDecl name
  - = ForeignImport (Located name) (LHsType name) ForeignImport
  - | ForeignExport (Located name) (LHsType name) ForeignExport
- type LForeignDecl name = Located (ForeignDecl name)
- data ForeignImport = CImport CCallConv Safety FastString CImportSpec
- data ForeignExport = CExport CExportSpec
- data CImportSpec
  - = CLabel CLabelString
  - | CFunction CCallTarget
  - | CWrapper
- data ConDecl name = ConDecl {
  - con_name :: Located name
  - con_explicit :: HsExplicitFlag
  - con_qvars :: [LHsTyVarBndr name]
  - con_cxt :: LHsContext name
  - con_details :: HsConDeclDetails name
  - con_res :: ResType name
  - con_doc :: Maybe LHsDocString
  - con_old_rec :: Bool
  }
- type LConDecl name = Located (ConDecl name)
- data ResType name
  - = ResTyH98
  - | ResTyGADT (LHsType name)
- type HsConDeclDetails name = HsConDetails (LBangType name) [ConDeclField name]
- hsConDeclArgTys :: HsConDeclDetails name -> [LBangType name]
- data DocDecl
  - = DocCommentNext HsDocString
  - | DocCommentPrev HsDocString
  - | DocCommentNamed String HsDocString
  - | DocGroup Int HsDocString
- type LDocDecl = Located DocDecl
- docDeclDoc :: DocDecl -> HsDocString
- data WarnDecl name = Warning name WarningTxt
- type LWarnDecl name = Located (WarnDecl name)
- data AnnDecl name = HsAnnotation (AnnProvenance name) (Located (HsExpr name))
- type LAnnDecl name = Located (AnnDecl name)
- data AnnProvenance name
  - = ValueAnnProvenance name
  - | TypeAnnProvenance name
  - | ModuleAnnProvenance
- annProvenanceName_maybe :: AnnProvenance name -> Maybe name
- modifyAnnProvenanceNameM :: Monad m => (before -> m after) -> AnnProvenance before -> m (AnnProvenance after)
- data HsGroup id = HsGroup {
  - hs_valds :: HsValBinds id
  - hs_tyclds :: [[LTyClDecl id]]
  - hs_instds :: [LInstDecl id]
  - hs_derivds :: [LDerivDecl id]
  - hs_fixds :: [LFixitySig id]
  - hs_defds :: [LDefaultDecl id]
  - hs_fords :: [LForeignDecl id]
  - hs_warnds :: [LWarnDecl id]
  - hs_annds :: [LAnnDecl id]
  - hs_ruleds :: [LRuleDecl id]
  - hs_docs :: [LDocDecl]
  }
- emptyRdrGroup :: HsGroup a
- emptyRnGroup :: HsGroup a
- appendGroups :: HsGroup a -> HsGroup a -> HsGroup a

# Toplevel declarations

data HsDecl id

A Haskell Declaration

Constructors

TyClD (TyClDecl id) | A type or class declaration.
InstD (InstDecl id) | An instance declaration.
DerivD (DerivDecl id) |
ValD (HsBind id) |
SigD (Sig id) |
DefD (DefaultDecl id) |
ForD (ForeignDecl id) |
WarningD (WarnDecl id) |
AnnD (AnnDecl id) |
RuleD (RuleDecl id) |
SpliceD (SpliceDecl id) |
DocD DocDecl |
QuasiQuoteD (HsQuasiQuote id) |

Instances

Typeable1 HsDecl |
Data id => Data (HsDecl id) |
OutputableBndr name => Outputable (HsDecl name) |

type LHsDecl id = Located (HsDecl id)

## Class or type declarations

data TyClDecl name

A type or class declaration.

Constructors

ForeignType |

Fields

tcdLName :: Located name
tcdExtName :: Maybe FastString

TyFamily

    type/data family T :: *->*

Fields

tcdFlavour :: FamilyFlavour
tcdLName :: Located name
tcdTyVars :: [LHsTyVarBndr name]
tcdKind :: Maybe Kind

TyData | Declares a data type or newtype, giving its construcors `data/newtype T a = constrs data/newtype instance T [a] = constrs`

Fields

tcdND :: NewOrData
tcdCtxt :: LHsContext name

  Context

tcdLName :: Located name
tcdTyVars :: [LHsTyVarBndr name]
tcdTyPats :: Maybe [LHsType name]

  Type patterns.

  `Just [t1..tn]` for `data instance T t1..tn = ...` in this case `tcdTyVars = fv( tcdTyPats )`. `Nothing` for everything else.

tcdKindSig :: Maybe Kind

  Optional kind signature.

  `(Just k)` for a GADT-style `data`, or `data instance` decl with explicit kind sig

tcdCons :: [LConDecl name]

  Data constructors

  For `data T a = T1 | T2 a` the `LConDecl`s all have `ResTyH98`. For `data T a where { T1 :: T a }` the `LConDecls` all have `ResTyGADT`.

tcdDerivs :: Maybe [LHsType name]

  Derivings; `Nothing` => not specified, `Just []` => derive exactly what is asked

  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

TySynonym |

Fields

tcdLName :: Located name
tcdTyVars :: [LHsTyVarBndr name]
tcdTyPats :: Maybe [LHsType name]

  Type patterns.

  `Just [t1..tn]` for `data instance T t1..tn = ...` in this case `tcdTyVars = fv( tcdTyPats )`. `Nothing` for everything else.

tcdSynRhs :: LHsType name

  synonym expansion

ClassDecl |

Fields

tcdCtxt :: LHsContext name

  Context

tcdLName :: Located name
tcdTyVars :: [LHsTyVarBndr name]
tcdFDs :: [Located (FunDep name)]

  Functional deps

tcdSigs :: [LSig name]

  Methods' signatures

tcdMeths :: LHsBinds name

  Default methods

tcdATs :: [LTyClDecl name]

  Associated types; ie only `TyFamily` and `TySynonym`; the latter for defaults

tcdDocs :: [LDocDecl]

  Haddock docs

Instances

Typeable1 TyClDecl |
Data name => Data (TyClDecl name) |
OutputableBndr name => Outputable (TyClDecl name) |

type LTyClDecl name = Located (TyClDecl name)

isClassDecl :: TyClDecl name -> Bool

type class

isSynDecl :: TyClDecl name -> Bool

vanilla Haskell type synonym (ie, not a type instance)

isDataDecl :: TyClDecl name -> Bool

`True` = argument is a `data`/`newtype` or `data`/`newtype instance` declaration.

isTypeDecl :: TyClDecl name -> Bool

type or type instance declaration

isFamilyDecl :: TyClDecl name -> Bool

type family declaration

isFamInstDecl :: TyClDecl name -> Bool

family instance (types, newtypes, and data types)

tcdName :: TyClDecl name -> name

tyClDeclTyVars :: TyClDecl name -> [LHsTyVarBndr name]

countTyClDecls :: [TyClDecl name] -> (Int, Int, Int, Int, Int, Int)

## Instance declarations

data InstDecl name

Constructors

InstDecl (LHsType name) (LHsBinds name) [LSig name] [LTyClDecl name] |

Instances

Typeable1 InstDecl |
Data name => Data (InstDecl name) |
OutputableBndr name => Outputable (InstDecl name) |

type LInstDecl name = Located (InstDecl name)

data NewOrData

Constructors

NewType

    newtype Blah ...

DataType

    data Blah ...

Instances

Eq NewOrData |
Data NewOrData |
Typeable NewOrData |
Outputable NewOrData |

data FamilyFlavour

Constructors

TypeFamily

    type family ...

DataFamily

    data family ...

Instances

Data FamilyFlavour |
Typeable FamilyFlavour |

instDeclATs :: [LInstDecl name] -> [LTyClDecl name]

## Standalone deriving declarations

data DerivDecl name

Constructors

DerivDecl (LHsType name) |

Instances

Typeable1 DerivDecl |
Data name => Data (DerivDecl name) |
OutputableBndr name => Outputable (DerivDecl name) |

type LDerivDecl name = Located (DerivDecl name)

## `RULE` declarations

data RuleDecl name

Constructors

HsRule RuleName Activation [RuleBndr name] (Located (HsExpr name)) NameSet (Located (HsExpr name)) NameSet |

Instances

Typeable1 RuleDecl |
Data name => Data (RuleDecl name) |
OutputableBndr name => Outputable (RuleDecl name) |

type LRuleDecl name = Located (RuleDecl name)

data RuleBndr name

Constructors

RuleBndr (Located name) |
RuleBndrSig (Located name) (LHsType name) |

Instances

Typeable1 RuleBndr |
Data name => Data (RuleBndr name) |
OutputableBndr name => Outputable (RuleBndr name) |

collectRuleBndrSigTys :: [RuleBndr name] -> [LHsType name]

## `default` declarations

data DefaultDecl name

Constructors

DefaultDecl [LHsType name] |

Instances

Typeable1 DefaultDecl |
Data name => Data (DefaultDecl name) |
OutputableBndr name => Outputable (DefaultDecl name) |

type LDefaultDecl name = Located (DefaultDecl name)

## Top-level template haskell splice

data SpliceDecl id

Constructors

SpliceDecl (Located (HsExpr id)) HsExplicitFlag |

Instances

Typeable1 SpliceDecl |
Data id => Data (SpliceDecl id) |
OutputableBndr name => Outputable (SpliceDecl name) |

## Foreign function interface declarations

data ForeignDecl name

Constructors

ForeignImport (Located name) (LHsType name) ForeignImport |
ForeignExport (Located name) (LHsType name) ForeignExport |

Instances

Typeable1 ForeignDecl |
Data name => Data (ForeignDecl name) |
OutputableBndr name => Outputable (ForeignDecl name) |

type LForeignDecl name = Located (ForeignDecl name)

data ForeignImport

Constructors

CImport CCallConv Safety FastString CImportSpec |

Instances

Data ForeignImport |
Typeable ForeignImport |
Outputable ForeignImport |

data ForeignExport

Constructors

CExport CExportSpec |

Instances

Data ForeignExport |
Typeable ForeignExport |
Outputable ForeignExport |

data CImportSpec

Constructors

CLabel CLabelString |
CFunction CCallTarget |
CWrapper |

Instances

Data CImportSpec |
Typeable CImportSpec |

## Data-constructor declarations

data ConDecl name

Constructors

ConDecl |

Fields

con_name :: Located name

  Constructor name. This is used for the DataCon itself, and for the user-callable wrapper Id.

con_explicit :: HsExplicitFlag

  Is there an user-written forall? (cf. `HsForAllTy`)

con_qvars :: [LHsTyVarBndr name]

  Type variables. Depending on `con_res` this describes the follewing entities

  - ResTyH98: the constructor's *existential* type variables - ResTyGADT: *all* the constructor's quantified type variables
con_cxt :: LHsContext name

  The context. This does not include the "stupid theta" which lives only in the `TyData` decl.

con_details :: HsConDeclDetails name

  The main payload

con_res :: ResType name

  Result type of the constructor

con_doc :: Maybe LHsDocString

  A possible Haddock comment.

con_old_rec :: Bool

  TEMPORARY field; True = user has employed now-deprecated syntax for GADT-style record decl C { blah } :: T a b Remove this when we no longer parse this stuff, and hence do not need to report decprecated use

Instances

Typeable1 ConDecl |
Data name => Data (ConDecl name) |
OutputableBndr name => Outputable (ConDecl name) |

type LConDecl name = Located (ConDecl name)

data ResType name

Constructors

ResTyH98 |
ResTyGADT (LHsType name) |

Instances

Typeable1 ResType |
Data name => Data (ResType name) |
OutputableBndr name => Outputable (ResType name) |

type HsConDeclDetails name = HsConDetails (LBangType name) [ConDeclField name]

hsConDeclArgTys :: HsConDeclDetails name -> [LBangType name]

## Document comments

data DocDecl

Constructors

DocCommentNext HsDocString |
DocCommentPrev HsDocString |
DocCommentNamed String HsDocString |
DocGroup Int HsDocString |

Instances

Data DocDecl |
Typeable DocDecl |
Outputable DocDecl |

type LDocDecl = Located DocDecl

docDeclDoc :: DocDecl -> HsDocString

## Deprecations

data WarnDecl name

Constructors

Warning name WarningTxt |

Instances

Typeable1 WarnDecl |
Data name => Data (WarnDecl name) |
OutputableBndr name => Outputable (WarnDecl name) |

type LWarnDecl name = Located (WarnDecl name)

## Annotations

data AnnDecl name

Constructors

HsAnnotation (AnnProvenance name) (Located (HsExpr name)) |

Instances

Typeable1 AnnDecl |
Data name => Data (AnnDecl name) |
OutputableBndr name => Outputable (AnnDecl name) |

type LAnnDecl name = Located (AnnDecl name)

data AnnProvenance name

Constructors

ValueAnnProvenance name |
TypeAnnProvenance name |
ModuleAnnProvenance |

Instances

Typeable1 AnnProvenance |
Data name => Data (AnnProvenance name) |

annProvenanceName_maybe :: AnnProvenance name -> Maybe name

modifyAnnProvenanceNameM :: Monad m => (before -> m after) -> AnnProvenance before -> m (AnnProvenance after)

# Grouping

data HsGroup id

A `HsDecl` is categorised into a `HsGroup` before being fed to the renamer.

Constructors

HsGroup |

Fields

hs_valds :: HsValBinds id
hs_tyclds :: [[LTyClDecl id]]
hs_instds :: [LInstDecl id]
hs_derivds :: [LDerivDecl id]
hs_fixds :: [LFixitySig id]
hs_defds :: [LDefaultDecl id]
hs_fords :: [LForeignDecl id]
hs_warnds :: [LWarnDecl id]
hs_annds :: [LAnnDecl id]
hs_ruleds :: [LRuleDecl id]
hs_docs :: [LDocDecl]

Instances

Typeable1 HsGroup |
Data id => Data (HsGroup id) |
OutputableBndr name => Outputable (HsGroup name) |

emptyRdrGroup :: HsGroup a

emptyRnGroup :: HsGroup a

appendGroups :: HsGroup a -> HsGroup a -> HsGroup a