ghc-7.10.3: The GHC API

Safe Haskell | None
Language | Haskell2010

TcRnTypes

Synopsis

- type TcRnIf a b = IOEnv (Env a b)
- type TcRn = TcRnIf TcGblEnv TcLclEnv
- type TcM = TcRn
- type RnM = TcRn
- type IfM lcl = TcRnIf IfGblEnv lcl
- type IfL = IfM IfLclEnv
- type IfG = IfM ()
- type TcRef a = IORef a
- data Env gbl lcl = Env {
  - env_top :: HscEnv
  - env_us :: !(IORef UniqSupply)
  - env_gbl :: gbl
  - env_lcl :: lcl
  }
- data TcGblEnv = TcGblEnv {
  - tcg_mod :: Module
  - tcg_src :: HscSource
  - tcg_sig_of :: Maybe Module
  - tcg_impl_rdr_env :: Maybe GlobalRdrEnv
  - tcg_rdr_env :: GlobalRdrEnv
  - tcg_default :: Maybe [Type]
  - tcg_fix_env :: FixityEnv
  - tcg_field_env :: RecFieldEnv
  - tcg_type_env :: TypeEnv
  - tcg_type_env_var :: TcRef TypeEnv
  - tcg_inst_env :: InstEnv
  - tcg_fam_inst_env :: FamInstEnv
  - tcg_ann_env :: AnnEnv
  - tcg_visible_orphan_mods :: ModuleSet
  - tcg_exports :: [AvailInfo]
  - tcg_imports :: ImportAvails
  - tcg_dus :: DefUses
  - tcg_used_rdrnames :: TcRef (Set RdrName)
  - tcg_keep :: TcRef NameSet
  - tcg_th_used :: TcRef Bool
  - tcg_th_splice_used :: TcRef Bool
  - tcg_dfun_n :: TcRef OccSet
  - tcg_rn_exports :: Maybe [Located (IE Name)]
  - tcg_rn_imports :: [LImportDecl Name]
  - tcg_rn_decls :: Maybe (HsGroup Name)
  - tcg_dependent_files :: TcRef [FilePath]
  - tcg_th_topdecls :: TcRef [LHsDecl RdrName]
  - tcg_th_topnames :: TcRef NameSet
  - tcg_th_modfinalizers :: TcRef [Q ()]
  - tcg_th_state :: TcRef (Map TypeRep Dynamic)
  - tcg_ev_binds :: Bag EvBind
  - tcg_binds :: LHsBinds Id
  - tcg_sigs :: NameSet
  - tcg_imp_specs :: [LTcSpecPrag]
  - tcg_warns :: Warnings
  - tcg_anns :: [Annotation]
  - tcg_tcs :: [TyCon]
  - tcg_insts :: [ClsInst]
  - tcg_fam_insts :: [FamInst]
  - tcg_rules :: [LRuleDecl Id]
  - tcg_fords :: [LForeignDecl Id]
  - tcg_vects :: [LVectDecl Id]
  - tcg_patsyns :: [PatSyn]
  - tcg_doc_hdr :: Maybe LHsDocString
  - tcg_hpc :: AnyHpcUsage
  - tcg_main :: Maybe Name
  - tcg_safeInfer :: TcRef Bool
  - tcg_tc_plugins :: [TcPluginSolver]
  - tcg_static_wc :: TcRef WantedConstraints
  }
- data TcLclEnv = TcLclEnv {
  - tcl_loc :: RealSrcSpan
  - tcl_ctxt :: [ErrCtxt]
  - tcl_tclvl :: TcLevel
  - tcl_th_ctxt :: ThStage
  - tcl_th_bndrs :: ThBindEnv
  - tcl_arrow_ctxt :: ArrowCtxt
  - tcl_rdr :: LocalRdrEnv
  - tcl_env :: TcTypeEnv
  - tcl_bndrs :: [TcIdBinder]
  - tcl_tidy :: TidyEnv
  - tcl_tyvars :: TcRef TcTyVarSet
  - tcl_lie :: TcRef WantedConstraints
  - tcl_errs :: TcRef Messages
  }
- data IfGblEnv = IfGblEnv {
  - if_rec_types :: Maybe (Module, IfG TypeEnv)
  }
- data IfLclEnv = IfLclEnv {
  - if_mod :: Module
  - if_loc :: SDoc
  - if_tv_env :: UniqFM TyVar
  - if_id_env :: UniqFM Id
  }
- type ErrCtxt = (Bool, TidyEnv -> TcM (TidyEnv, MsgDoc))
- data RecFieldEnv = RecFields (NameEnv [Name]) NameSet
- data ImportAvails = ImportAvails {
  - imp_mods :: ImportedMods
  - imp_dep_mods :: ModuleNameEnv (ModuleName, IsBootInterface)
  - imp_dep_pkgs :: [PackageKey]
  - imp_trust_pkgs :: [PackageKey]
  - imp_trust_own_pkg :: Bool
  - imp_orphs :: [Module]
  - imp_finsts :: [Module]
  }
- emptyImportAvails :: ImportAvails
- plusImportAvails :: ImportAvails -> ImportAvails -> ImportAvails
- data WhereFrom
  - = ImportByUser IsBootInterface
  - | ImportBySystem
  - | ImportByPlugin
- mkModDeps :: [(ModuleName, IsBootInterface)] -> ModuleNameEnv (ModuleName, IsBootInterface)
- type TcTypeEnv = NameEnv TcTyThing
- data TcIdBinder = TcIdBndr TcId TopLevelFlag
- data TcTyThing
  - = AGlobal TyThing
  - | ATcId {
    - tct_id :: TcId
    - tct_closed :: TopLevelFlag
    }
  - | ATyVar Name TcTyVar
  - | AThing TcKind
  - | APromotionErr PromotionErr
- data PromotionErr
  - = TyConPE
  - | ClassPE
  - | FamDataConPE
  - | RecDataConPE
  - | NoDataKinds
- pprTcTyThingCategory :: TcTyThing -> SDoc
- pprPECategory :: PromotionErr -> SDoc
- type DsM = TcRnIf DsGblEnv DsLclEnv
- data DsLclEnv = DsLclEnv {
  - dsl_meta :: DsMetaEnv
  - dsl_loc :: SrcSpan
  }
- data DsGblEnv = DsGblEnv {
  - ds_mod :: Module
  - ds_fam_inst_env :: FamInstEnv
  - ds_unqual :: PrintUnqualified
  - ds_msgs :: IORef Messages
  - ds_if_env :: (IfGblEnv, IfLclEnv)
  - ds_dph_env :: GlobalRdrEnv
  - ds_parr_bi :: PArrBuiltin
  - ds_static_binds :: IORef [(Fingerprint, (Id, CoreExpr))]
  }
- data PArrBuiltin = PArrBuiltin {
  - lengthPVar :: Var
  - replicatePVar :: Var
  - singletonPVar :: Var
  - mapPVar :: Var
  - filterPVar :: Var
  - zipPVar :: Var
  - crossMapPVar :: Var
  - indexPVar :: Var
  - emptyPVar :: Var
  - appPVar :: Var
  - enumFromToPVar :: Var
  - enumFromThenToPVar :: Var
  }
- type DsMetaEnv = NameEnv DsMetaVal
- data DsMetaVal
  - = DsBound Id
  - | DsSplice (HsExpr Id)
- data ThStage
  - = Splice Bool
  - | Comp
  - | Brack ThStage PendingStuff
- data PendingStuff
  - = RnPendingUntyped (TcRef [PendingRnSplice])
  - | RnPendingTyped
  - | TcPending (TcRef [PendingTcSplice]) (TcRef WantedConstraints)
- topStage :: ThStage
- topAnnStage :: ThStage
- topSpliceStage :: ThStage
- type ThLevel = Int
- impLevel :: ThLevel
- outerLevel :: ThLevel
- thLevel :: ThStage -> ThLevel
- data ArrowCtxt
  - = NoArrowCtxt
  - | ArrowCtxt LocalRdrEnv (TcRef WantedConstraints)
- type Xi = Type
- data Ct
  - = CDictCan {
    - cc_ev :: CtEvidence
    - cc_class :: Class
    - cc_tyargs :: [Xi]
    }
  - | CIrredEvCan {
    - cc_ev :: CtEvidence
    }
  - | CTyEqCan {
    - cc_ev :: CtEvidence
    - cc_tyvar :: TcTyVar
    - cc_rhs :: TcType
    - cc_eq_rel :: EqRel
    }
  - | CFunEqCan {
    - cc_ev :: CtEvidence
    - cc_fun :: TyCon
    - cc_tyargs :: [Xi]
    - cc_fsk :: TcTyVar
    }
  - | CNonCanonical {
    - cc_ev :: CtEvidence
    }
  - | CHoleCan {
    - cc_ev :: CtEvidence
    - cc_occ :: OccName
    - cc_hole :: HoleSort
    }
- type Cts = Bag Ct
- emptyCts :: Cts
- andCts :: Cts -> Cts -> Cts
- andManyCts :: [Cts] -> Cts
- pprCts :: Cts -> SDoc
- singleCt :: Ct -> Cts
- listToCts :: [Ct] -> Cts
- ctsElts :: Cts -> [Ct]
- consCts :: Ct -> Cts -> Cts
- snocCts :: Cts -> Ct -> Cts
- extendCtsList :: Cts -> [Ct] -> Cts
- isEmptyCts :: Cts -> Bool
- isCTyEqCan :: Ct -> Bool
- isCFunEqCan :: Ct -> Bool
- isCDictCan_Maybe :: Ct -> Maybe Class
- isCFunEqCan_maybe :: Ct -> Maybe (TyCon, [Type])
- isCIrredEvCan :: Ct -> Bool
- isCNonCanonical :: Ct -> Bool
- isWantedCt :: Ct -> Bool
- isDerivedCt :: Ct -> Bool
- isGivenCt :: Ct -> Bool
- isHoleCt :: Ct -> Bool
- isTypedHoleCt :: Ct -> Bool
- isPartialTypeSigCt :: Ct -> Bool
- ctEvidence :: Ct -> CtEvidence
- ctLoc :: Ct -> CtLoc
- ctPred :: Ct -> PredType
- ctFlavour :: Ct -> CtFlavour
- ctEqRel :: Ct -> EqRel
- mkNonCanonical :: CtEvidence -> Ct
- mkNonCanonicalCt :: Ct -> Ct
- ctEvPred :: CtEvidence -> TcPredType
- ctEvLoc :: CtEvidence -> CtLoc
- ctEvEqRel :: CtEvidence -> EqRel
- ctEvTerm :: CtEvidence -> EvTerm
- ctEvCoercion :: CtEvidence -> TcCoercion
- ctEvId :: CtEvidence -> TcId
- ctEvCheckDepth :: Class -> CtLoc -> CtEvidence -> Bool
- data WantedConstraints = WC {
  - wc_simple :: Cts
  - wc_impl :: Bag Implication
  - wc_insol :: Cts
  }
- insolubleWC :: WantedConstraints -> Bool
- emptyWC :: WantedConstraints
- isEmptyWC :: WantedConstraints -> Bool
- andWC :: WantedConstraints -> WantedConstraints -> WantedConstraints
- unionsWC :: [WantedConstraints] -> WantedConstraints
- addSimples :: WantedConstraints -> Bag Ct -> WantedConstraints
- addImplics :: WantedConstraints -> Bag Implication -> WantedConstraints
- mkSimpleWC :: [Ct] -> WantedConstraints
- addInsols :: WantedConstraints -> Bag Ct -> WantedConstraints
- dropDerivedWC :: WantedConstraints -> WantedConstraints
- data Implication = Implic {
  - ic_tclvl :: TcLevel
  - ic_skols :: [TcTyVar]
  - ic_info :: SkolemInfo
  - ic_given :: [EvVar]
  - ic_no_eqs :: Bool
  - ic_env :: TcLclEnv
  - ic_wanted :: WantedConstraints
  - ic_insol :: Bool
  - ic_binds :: EvBindsVar
  }
- data SubGoalCounter
  - = CountConstraints
  - | CountTyFunApps
- data SubGoalDepth
- initialSubGoalDepth :: SubGoalDepth
- maxSubGoalDepth :: DynFlags -> SubGoalDepth
- bumpSubGoalDepth :: SubGoalCounter -> SubGoalDepth -> SubGoalDepth
- subGoalCounterValue :: SubGoalCounter -> SubGoalDepth -> Int
- subGoalDepthExceeded :: SubGoalDepth -> SubGoalDepth -> Maybe SubGoalCounter
- data CtLoc = CtLoc {
  - ctl_origin :: CtOrigin
  - ctl_env :: TcLclEnv
  - ctl_depth :: !SubGoalDepth
  }
- ctLocSpan :: CtLoc -> RealSrcSpan
- ctLocEnv :: CtLoc -> TcLclEnv
- ctLocOrigin :: CtLoc -> CtOrigin
- ctLocDepth :: CtLoc -> SubGoalDepth
- bumpCtLocDepth :: SubGoalCounter -> CtLoc -> CtLoc
- setCtLocOrigin :: CtLoc -> CtOrigin -> CtLoc
- setCtLocEnv :: CtLoc -> TcLclEnv -> CtLoc
- setCtLocSpan :: CtLoc -> RealSrcSpan -> CtLoc
- data CtOrigin
  - = GivenOrigin SkolemInfo
  - | OccurrenceOf Name
  - | AppOrigin
  - | SpecPragOrigin Name
  - | TypeEqOrigin {
    - uo_actual :: TcType
    - uo_expected :: TcType
    }
  - | KindEqOrigin TcType TcType CtOrigin
  - | CoercibleOrigin TcType TcType
  - | IPOccOrigin HsIPName
  - | LiteralOrigin (HsOverLit Name)
  - | NegateOrigin
  - | ArithSeqOrigin (ArithSeqInfo Name)
  - | PArrSeqOrigin (ArithSeqInfo Name)
  - | SectionOrigin
  - | TupleOrigin
  - | ExprSigOrigin
  - | PatSigOrigin
  - | PatOrigin
  - | RecordUpdOrigin
  - | ViewPatOrigin
  - | ScOrigin
  - | DerivOrigin
  - | DerivOriginDC DataCon Int
  - | DerivOriginCoerce Id Type Type
  - | StandAloneDerivOrigin
  - | DefaultOrigin
  - | DoOrigin
  - | MCompOrigin
  - | IfOrigin
  - | ProcOrigin
  - | AnnOrigin
  - | FunDepOrigin1 PredType CtLoc PredType CtLoc
  - | FunDepOrigin2 PredType CtOrigin PredType SrcSpan
  - | HoleOrigin
  - | UnboundOccurrenceOf RdrName
  - | ListOrigin
  - | StaticOrigin
- pprCtOrigin :: CtOrigin -> SDoc
- pushErrCtxt :: CtOrigin -> ErrCtxt -> CtLoc -> CtLoc
- pushErrCtxtSameOrigin :: ErrCtxt -> CtLoc -> CtLoc
- data SkolemInfo
  - = SigSkol UserTypeCtxt Type
  - | ClsSkol Class
  - | InstSkol
  - | DataSkol
  - | FamInstSkol
  - | PatSkol ConLike (HsMatchContext Name)
  - | ArrowSkol
  - | IPSkol [HsIPName]
  - | RuleSkol RuleName
  - | InferSkol [(Name, TcType)]
  - | BracketSkol
  - | UnifyForAllSkol [TcTyVar] TcType
  - | UnkSkol
- data CtEvidence
  - = CtGiven {
    - ctev_pred :: TcPredType
    - ctev_evtm :: EvTerm
    - ctev_loc :: CtLoc
    }
  - | CtWanted {
    - ctev_pred :: TcPredType
    - ctev_evar :: EvVar
    - ctev_loc :: CtLoc
    }
  - | CtDerived {
    - ctev_pred :: TcPredType
    - ctev_loc :: CtLoc
    }
- mkGivenLoc :: TcLevel -> SkolemInfo -> TcLclEnv -> CtLoc
- isWanted :: CtEvidence -> Bool
- isGiven :: CtEvidence -> Bool
- isDerived :: CtEvidence -> Bool
- ctEvRole :: CtEvidence -> Role
- data TcPlugin = forall s . TcPlugin {
  - tcPluginInit :: TcPluginM s
  - tcPluginSolve :: s -> TcPluginSolver
  - tcPluginStop :: s -> TcPluginM ()
  }
- data TcPluginResult
  - = TcPluginContradiction [Ct]
  - | TcPluginOk [(EvTerm, Ct)] [Ct]
- type TcPluginSolver = [Ct] -> [Ct] -> [Ct] -> TcPluginM TcPluginResult
- data TcPluginM a
- runTcPluginM :: TcPluginM a -> TcM a
- unsafeTcPluginTcM :: TcM a -> TcPluginM a
- data CtFlavour
  - = Given
  - | Wanted
  - | Derived
- ctEvFlavour :: CtEvidence -> CtFlavour
- pprEvVarTheta :: [EvVar] -> SDoc
- pprEvVars :: [EvVar] -> SDoc
- pprEvVarWithType :: EvVar -> SDoc
- pprArising :: CtOrigin -> SDoc
- pprArisingAt :: CtLoc -> SDoc
- type TcId = Id
- type TcIdSet = IdSet
- data HoleSort
  - = ExprHole
  - | TypeHole

# Documentation

type TcRnIf a b = IOEnv (Env a b)

type TcRn = TcRnIf TcGblEnv TcLclEnv

type TcM = TcRn

Historical "type-checking monad" (now it's just `TcRn`).

type RnM = TcRn

Historical "renaming monad" (now it's just `TcRn`).

type IfM lcl = TcRnIf IfGblEnv lcl

type IfL = IfM IfLclEnv

type IfG = IfM ()

type TcRef a = IORef a

Type alias for `IORef`; the convention is we'll use this for mutable bits of data in `TcGblEnv` which are updated during typechecking and returned at the end.

data Env gbl lcl

Constructors

Env |

Fields

env_top :: HscEnv
env_us :: !(IORef UniqSupply)
env_gbl :: gbl
env_lcl :: lcl

Instances

ContainsModule gbl => ContainsModule (Env gbl lcl) |
ContainsDynFlags (Env gbl lcl) |

data TcGblEnv

`TcGblEnv` describes the top-level of the module at the point at which the typechecker is finished work. It is this structure that is handed on to the desugarer For state that needs to be updated during the typechecking phase and returned at end, use a `TcRef` (= `IORef`).

Constructors

TcGblEnv |

Fields

tcg_mod :: Module

  Module being compiled

tcg_src :: HscSource

  What kind of module (regular Haskell, hs-boot, ext-core)

tcg_sig_of :: Maybe Module

  Are we being compiled as a signature of an implementation?

tcg_impl_rdr_env :: Maybe GlobalRdrEnv

  Environment used only during -sig-of for resolving top level bindings. See Note [Signature parameters in TcGblEnv and DynFlags]

tcg_rdr_env :: GlobalRdrEnv

  Top level envt; used during renaming

tcg_default :: Maybe [Type]

  Types used for defaulting. `Nothing` => no `default` decl

tcg_fix_env :: FixityEnv

  Just for things in this module

tcg_field_env :: RecFieldEnv

  Just for things in this module See Note [The interactive package] in HscTypes

tcg_type_env :: TypeEnv

  Global type env for the module we are compiling now. All TyCons and Classes (for this module) end up in here right away, along with their derived constructors, selectors.

  (Ids defined in this module start in the local envt, though they move to the global envt during zonking)

  NB: for what "things in this module" means, see Note [The interactive package] in HscTypes

tcg_type_env_var :: TcRef TypeEnv
tcg_inst_env :: InstEnv

  Instance envt for all home-package modules; Includes the dfuns in tcg_insts

tcg_fam_inst_env :: FamInstEnv

  Ditto for family instances

tcg_ann_env :: AnnEnv

  And for annotations

tcg_visible_orphan_mods :: ModuleSet

  The set of orphan modules which transitively reachable from direct imports. We use this to figure out if an orphan instance in the global InstEnv should be considered visible. See Note [Instance lookup and orphan instances] in InstEnv

tcg_exports :: [AvailInfo]

  What is exported

tcg_imports :: ImportAvails

  Information about what was imported from where, including things bound in this module. Also store Safe Haskell info here about transative trusted packaage requirements.

tcg_dus :: DefUses

  What is defined in this module and what is used.

tcg_used_rdrnames :: TcRef (Set RdrName)
tcg_keep :: TcRef NameSet

  Locally-defined top-level names to keep alive.

  "Keep alive" means give them an Exported flag, so that the simplifier does not discard them as dead code, and so that they are exposed in the interface file (but not to export to the user).

  Some things, like dict-fun Ids and default-method Ids are "born" with the Exported flag on, for exactly the above reason, but some we only discover as we go. Specifically:

  - The to/from functions for generic data types
  - Top-level variables appearing free in the RHS of an orphan rule
  - Top-level variables appearing free in a TH bracket
tcg_th_used :: TcRef Bool

  `True` = Template Haskell syntax used.

  We need this so that we can generate a dependency on the Template Haskell package, because the desugarer is going to emit loads of references to TH symbols. The reference is implicit rather than explicit, so we have to zap a mutable variable.

tcg_th_splice_used :: TcRef Bool

  `True` = A Template Haskell splice was used.

  Splices disable recompilation avoidance (see #481)

tcg_dfun_n :: TcRef OccSet

  Allows us to choose unique DFun names.

tcg_rn_exports :: Maybe [Located (IE Name)]
tcg_rn_imports :: [LImportDecl Name]
tcg_rn_decls :: Maybe (HsGroup Name)

  Renamed decls, maybe. `Nothing` = Don't retain renamed decls.

tcg_dependent_files :: TcRef [FilePath]

  dependencies from addDependentFile

tcg_th_topdecls :: TcRef [LHsDecl RdrName]

  Top-level declarations from addTopDecls

tcg_th_topnames :: TcRef NameSet

  Exact names bound in top-level declarations in tcg_th_topdecls

tcg_th_modfinalizers :: TcRef [Q ()]

  Template Haskell module finalizers

tcg_th_state :: TcRef (Map TypeRep Dynamic)

  Template Haskell state

tcg_ev_binds :: Bag EvBind
tcg_binds :: LHsBinds Id
tcg_sigs :: NameSet
tcg_imp_specs :: [LTcSpecPrag]
tcg_warns :: Warnings
tcg_anns :: [Annotation]
tcg_tcs :: [TyCon]
tcg_insts :: [ClsInst]
tcg_fam_insts :: [FamInst]
tcg_rules :: [LRuleDecl Id]
tcg_fords :: [LForeignDecl Id]
tcg_vects :: [LVectDecl Id]
tcg_patsyns :: [PatSyn]
tcg_doc_hdr :: Maybe LHsDocString

  Maybe Haddock header docs

tcg_hpc :: AnyHpcUsage

  `True` if any part of the prog uses hpc instrumentation.

tcg_main :: Maybe Name

  The Name of the main function, if this module is the main module.

tcg_safeInfer :: TcRef Bool
tcg_tc_plugins :: [TcPluginSolver]

  A list of user-defined plugins for the constraint solver.

tcg_static_wc :: TcRef WantedConstraints

  Wanted constraints of static forms.

Instances

ContainsModule TcGblEnv |

data TcLclEnv

Constructors

TcLclEnv |

Fields

tcl_loc :: RealSrcSpan
tcl_ctxt :: [ErrCtxt]
tcl_tclvl :: TcLevel
tcl_th_ctxt :: ThStage
tcl_th_bndrs :: ThBindEnv
tcl_arrow_ctxt :: ArrowCtxt
tcl_rdr :: LocalRdrEnv
tcl_env :: TcTypeEnv
tcl_bndrs :: [TcIdBinder]
tcl_tidy :: TidyEnv
tcl_tyvars :: TcRef TcTyVarSet
tcl_lie :: TcRef WantedConstraints
tcl_errs :: TcRef Messages

data IfGblEnv

Constructors

IfGblEnv |

Fields

if_rec_types :: Maybe (Module, IfG TypeEnv)

data IfLclEnv

Constructors

IfLclEnv |

Fields

if_mod :: Module
if_loc :: SDoc
if_tv_env :: UniqFM TyVar
if_id_env :: UniqFM Id

type ErrCtxt = (Bool, TidyEnv -> TcM (TidyEnv, MsgDoc))

data RecFieldEnv

Constructors

RecFields (NameEnv [Name]) NameSet |

data ImportAvails

`ImportAvails` summarises what was imported from where, irrespective of whether the imported things are actually used or not. It is used:

- when processing the export list,
- when constructing usage info for the interface file,
- to identify the list of directly imported modules for initialisation purposes and for optimised overlap checking of family instances,
- when figuring out what things are really unused

Constructors

ImportAvails |

Fields

imp_mods :: ImportedMods

  Domain is all directly-imported modules The `ModuleName` is what the module was imported as, e.g. in `import Foo as Bar` it is `Bar`.

  The `Bool` means:

  - `True` => import was `import Foo ()`
  - `False` => import was some other form

  Used

  (a) to help construct the usage information in the interface file; if we import something we need to recompile if the export version changes

  (b) to specify what child modules to initialise

  We need a full ModuleEnv rather than a ModuleNameEnv here, because we might be importing modules of the same name from different packages. (currently not the case, but might be in the future).

imp_dep_mods :: ModuleNameEnv (ModuleName, IsBootInterface)

  Home-package modules needed by the module being compiled

  It doesn't matter whether any of these dependencies are actually used when compiling the module; they are listed if they are below it at all. For example, suppose M imports A which imports X. Then compiling M might not need to consult X.hi, but X is still listed in M's dependencies.

imp_dep_pkgs :: [PackageKey]

  Packages needed by the module being compiled, whether directly, or via other modules in this package, or via modules imported from other packages.

imp_trust_pkgs :: [PackageKey]

  This is strictly a subset of imp_dep_pkgs and records the packages the current module needs to trust for Safe Haskell compilation to succeed. A package is required to be trusted if we are dependent on a trustworthy module in that package. While perhaps making imp_dep_pkgs a tuple of (PackageKey, Bool) where True for the bool indicates the package is required to be trusted is the more logical design, doing so complicates a lot of code not concerned with Safe Haskell. See Note [RnNames . Tracking Trust Transitively]

imp_trust_own_pkg :: Bool

  Do we require that our own package is trusted? This is to handle efficiently the case where a Safe module imports a Trustworthy module that resides in the same package as it. See Note [RnNames . Trust Own Package]

imp_orphs :: [Module]

  Orphan modules below us in the import tree (and maybe including us for imported modules)

imp_finsts :: [Module]

  Family instance modules below us in the import tree (and maybe including us for imported modules)

emptyImportAvails :: ImportAvails

plusImportAvails :: ImportAvails -> ImportAvails -> ImportAvails

Union two ImportAvails

This function is a key part of Import handling, basically for each import we create a separate ImportAvails structure and then union them all together with this function.

data WhereFrom

Constructors

ImportByUser IsBootInterface |
ImportBySystem |
ImportByPlugin |

Instances

Outputable WhereFrom |

mkModDeps :: [(ModuleName, IsBootInterface)] -> ModuleNameEnv (ModuleName, IsBootInterface)

type TcTypeEnv = NameEnv TcTyThing

data TcIdBinder

Constructors

TcIdBndr TcId TopLevelFlag |

data TcTyThing

Constructors

AGlobal TyThing |
ATcId |

Fields

tct_id :: TcId
tct_closed :: TopLevelFlag

ATyVar Name TcTyVar |
AThing TcKind |
APromotionErr PromotionErr |

Instances

Outputable TcTyThing |

data PromotionErr

Constructors

TyConPE |
ClassPE |
FamDataConPE |
RecDataConPE |
NoDataKinds |

Instances

Outputable PromotionErr |

pprTcTyThingCategory :: TcTyThing -> SDoc

pprPECategory :: PromotionErr -> SDoc

type DsM = TcRnIf DsGblEnv DsLclEnv

data DsLclEnv

Constructors

DsLclEnv |

Fields

dsl_meta :: DsMetaEnv
dsl_loc :: SrcSpan

data DsGblEnv

Constructors

DsGblEnv |

Fields

ds_mod :: Module
ds_fam_inst_env :: FamInstEnv
ds_unqual :: PrintUnqualified
ds_msgs :: IORef Messages
ds_if_env :: (IfGblEnv, IfLclEnv)
ds_dph_env :: GlobalRdrEnv
ds_parr_bi :: PArrBuiltin
ds_static_binds :: IORef [(Fingerprint, (Id, CoreExpr))]

  Bindings resulted from floating static forms

Instances

ContainsModule DsGblEnv |

data PArrBuiltin

Constructors

PArrBuiltin |

Fields

lengthPVar :: Var

  lengthP

replicatePVar :: Var

  replicateP

singletonPVar :: Var

  singletonP

mapPVar :: Var

  mapP

filterPVar :: Var

  filterP

zipPVar :: Var

  zipP

crossMapPVar :: Var

  crossMapP

indexPVar :: Var

  (!:)

emptyPVar :: Var

  emptyP

appPVar :: Var

  (+:+)

enumFromToPVar :: Var

  enumFromToP

enumFromThenToPVar :: Var

  enumFromThenToP

type DsMetaEnv = NameEnv DsMetaVal

data DsMetaVal

Constructors

DsBound Id |
DsSplice (HsExpr Id) |

data ThStage

Constructors

Splice Bool |
Comp |
Brack ThStage PendingStuff |

Instances

Outputable ThStage |

data PendingStuff

Constructors

RnPendingUntyped (TcRef [PendingRnSplice]) |
RnPendingTyped |
TcPending (TcRef [PendingTcSplice]) (TcRef WantedConstraints) |

topStage :: ThStage

topAnnStage :: ThStage

topSpliceStage :: ThStage

type ThLevel = Int

impLevel :: ThLevel

outerLevel :: ThLevel

thLevel :: ThStage -> ThLevel

data ArrowCtxt

Constructors

NoArrowCtxt |
ArrowCtxt LocalRdrEnv (TcRef WantedConstraints) |

type Xi = Type

data Ct

Constructors

CDictCan |

Fields

cc_ev :: CtEvidence
cc_class :: Class
cc_tyargs :: [Xi]

CIrredEvCan |

Fields

cc_ev :: CtEvidence

CTyEqCan |

Fields

cc_ev :: CtEvidence
cc_tyvar :: TcTyVar
cc_rhs :: TcType
cc_eq_rel :: EqRel

CFunEqCan |

Fields

cc_ev :: CtEvidence
cc_fun :: TyCon
cc_tyargs :: [Xi]
cc_fsk :: TcTyVar

CNonCanonical |

Fields

cc_ev :: CtEvidence

CHoleCan |

Fields

cc_ev :: CtEvidence
cc_occ :: OccName
cc_hole :: HoleSort

Instances

Outputable Ct |

type Cts = Bag Ct

emptyCts :: Cts

andCts :: Cts -> Cts -> Cts

andManyCts :: [Cts] -> Cts

pprCts :: Cts -> SDoc

singleCt :: Ct -> Cts

listToCts :: [Ct] -> Cts

ctsElts :: Cts -> [Ct]

consCts :: Ct -> Cts -> Cts

snocCts :: Cts -> Ct -> Cts

extendCtsList :: Cts -> [Ct] -> Cts

isEmptyCts :: Cts -> Bool

isCTyEqCan :: Ct -> Bool

isCFunEqCan :: Ct -> Bool

isCDictCan_Maybe :: Ct -> Maybe Class

isCFunEqCan_maybe :: Ct -> Maybe (TyCon, [Type])

isCIrredEvCan :: Ct -> Bool

isCNonCanonical :: Ct -> Bool

isWantedCt :: Ct -> Bool

isDerivedCt :: Ct -> Bool

isGivenCt :: Ct -> Bool

isHoleCt :: Ct -> Bool

isTypedHoleCt :: Ct -> Bool

isPartialTypeSigCt :: Ct -> Bool

ctEvidence :: Ct -> CtEvidence

ctLoc :: Ct -> CtLoc

ctPred :: Ct -> PredType

ctFlavour :: Ct -> CtFlavour

Get the flavour of the given `Ct`

ctEqRel :: Ct -> EqRel

Get the equality relation for the given `Ct`

mkNonCanonical :: CtEvidence -> Ct

mkNonCanonicalCt :: Ct -> Ct

ctEvPred :: CtEvidence -> TcPredType

ctEvLoc :: CtEvidence -> CtLoc

ctEvEqRel :: CtEvidence -> EqRel

Get the equality relation relevant for a `CtEvidence`

ctEvTerm :: CtEvidence -> EvTerm

ctEvCoercion :: CtEvidence -> TcCoercion

ctEvId :: CtEvidence -> TcId

ctEvCheckDepth :: Class -> CtLoc -> CtEvidence -> Bool

Checks whether the evidence can be used to solve a goal with the given minimum depth See Note [Preventing recursive dictionaries]

data WantedConstraints

Constructors

WC |

Fields

wc_simple :: Cts
wc_impl :: Bag Implication
wc_insol :: Cts

Instances

Outputable WantedConstraints |

insolubleWC :: WantedConstraints -> Bool

emptyWC :: WantedConstraints

isEmptyWC :: WantedConstraints -> Bool

andWC :: WantedConstraints -> WantedConstraints -> WantedConstraints

unionsWC :: [WantedConstraints] -> WantedConstraints

addSimples :: WantedConstraints -> Bag Ct -> WantedConstraints

addImplics :: WantedConstraints -> Bag Implication -> WantedConstraints

mkSimpleWC :: [Ct] -> WantedConstraints

addInsols :: WantedConstraints -> Bag Ct -> WantedConstraints

dropDerivedWC :: WantedConstraints -> WantedConstraints

data Implication

Constructors

Implic |

Fields

ic_tclvl :: TcLevel
ic_skols :: [TcTyVar]
ic_info :: SkolemInfo
ic_given :: [EvVar]
ic_no_eqs :: Bool
ic_env :: TcLclEnv
ic_wanted :: WantedConstraints
ic_insol :: Bool
ic_binds :: EvBindsVar

Instances

Outputable Implication |

data SubGoalCounter

Constructors

CountConstraints |
CountTyFunApps |

data SubGoalDepth

Instances

Eq SubGoalDepth |
Ord SubGoalDepth |
Outputable SubGoalDepth |

initialSubGoalDepth :: SubGoalDepth

maxSubGoalDepth :: DynFlags -> SubGoalDepth

bumpSubGoalDepth :: SubGoalCounter -> SubGoalDepth -> SubGoalDepth

subGoalCounterValue :: SubGoalCounter -> SubGoalDepth -> Int

subGoalDepthExceeded :: SubGoalDepth -> SubGoalDepth -> Maybe SubGoalCounter

data CtLoc

Constructors

CtLoc |

Fields

ctl_origin :: CtOrigin
ctl_env :: TcLclEnv
ctl_depth :: !SubGoalDepth

ctLocSpan :: CtLoc -> RealSrcSpan

ctLocEnv :: CtLoc -> TcLclEnv

ctLocOrigin :: CtLoc -> CtOrigin

ctLocDepth :: CtLoc -> SubGoalDepth

bumpCtLocDepth :: SubGoalCounter -> CtLoc -> CtLoc

setCtLocOrigin :: CtLoc -> CtOrigin -> CtLoc

setCtLocEnv :: CtLoc -> TcLclEnv -> CtLoc

setCtLocSpan :: CtLoc -> RealSrcSpan -> CtLoc

data CtOrigin

Constructors

GivenOrigin SkolemInfo |
OccurrenceOf Name |
AppOrigin |
SpecPragOrigin Name |
TypeEqOrigin |

Fields

uo_actual :: TcType
uo_expected :: TcType

KindEqOrigin TcType TcType CtOrigin |
CoercibleOrigin TcType TcType |
IPOccOrigin HsIPName |
LiteralOrigin (HsOverLit Name) |
NegateOrigin |
ArithSeqOrigin (ArithSeqInfo Name) |
PArrSeqOrigin (ArithSeqInfo Name) |
SectionOrigin |
TupleOrigin |
ExprSigOrigin |
PatSigOrigin |
PatOrigin |
RecordUpdOrigin |
ViewPatOrigin |
ScOrigin |
DerivOrigin |
DerivOriginDC DataCon Int |
DerivOriginCoerce Id Type Type |
StandAloneDerivOrigin |
DefaultOrigin |
DoOrigin |
MCompOrigin |
IfOrigin |
ProcOrigin |
AnnOrigin |
FunDepOrigin1 PredType CtLoc PredType CtLoc |
FunDepOrigin2 PredType CtOrigin PredType SrcSpan |
HoleOrigin |
UnboundOccurrenceOf RdrName |
ListOrigin |
StaticOrigin |

pprCtOrigin :: CtOrigin -> SDoc

pushErrCtxt :: CtOrigin -> ErrCtxt -> CtLoc -> CtLoc

pushErrCtxtSameOrigin :: ErrCtxt -> CtLoc -> CtLoc

data SkolemInfo

Constructors

SigSkol UserTypeCtxt Type |
ClsSkol Class |
InstSkol |
DataSkol |
FamInstSkol |
PatSkol ConLike (HsMatchContext Name) |
ArrowSkol |
IPSkol [HsIPName] |
RuleSkol RuleName |
InferSkol [(Name, TcType)] |
BracketSkol |
UnifyForAllSkol [TcTyVar] TcType |
UnkSkol |

Instances

Outputable SkolemInfo |

data CtEvidence

Constructors

CtGiven |

Fields

ctev_pred :: TcPredType
ctev_evtm :: EvTerm
ctev_loc :: CtLoc

CtWanted |

Fields

ctev_pred :: TcPredType
ctev_evar :: EvVar
ctev_loc :: CtLoc

CtDerived |

Fields

ctev_pred :: TcPredType
ctev_loc :: CtLoc

Instances

Outputable CtEvidence |

mkGivenLoc :: TcLevel -> SkolemInfo -> TcLclEnv -> CtLoc

isWanted :: CtEvidence -> Bool

isGiven :: CtEvidence -> Bool

isDerived :: CtEvidence -> Bool

ctEvRole :: CtEvidence -> Role

Get the role relevant for a `CtEvidence`

data TcPlugin

Constructors

forall s . TcPlugin |

Fields

tcPluginInit :: TcPluginM s

  Initialize plugin, when entering type-checker.

tcPluginSolve :: s -> TcPluginSolver

  Solve some constraints. TODO: WRITE MORE DETAILS ON HOW THIS WORKS.

tcPluginStop :: s -> TcPluginM ()

  Clean up after the plugin, when exiting the type-checker.

data TcPluginResult

Constructors

TcPluginContradiction [Ct] | The plugin found a contradiction. The returned constraints are removed from the inert set, and recorded as insoluable.
TcPluginOk [(EvTerm, Ct)] [Ct] | The first field is for constraints that were solved. These are removed from the inert set, and the evidence for them is recorded. The second field contains new work, that should be processed by the constraint solver.

type TcPluginSolver = [Ct] -> [Ct] -> [Ct] -> TcPluginM TcPluginResult

data TcPluginM a

Instances

Monad TcPluginM |
Functor TcPluginM |
Applicative TcPluginM |

runTcPluginM :: TcPluginM a -> TcM a

unsafeTcPluginTcM :: TcM a -> TcPluginM a

This function provides an escape for direct access to the `TcM` monad. It should not be used lightly, and the provided `TcPluginM` API should be favoured instead.

data CtFlavour

Constructors

Given |
Wanted |
Derived |

Instances

Eq CtFlavour |
Outputable CtFlavour |

ctEvFlavour :: CtEvidence -> CtFlavour

pprEvVarTheta :: [EvVar] -> SDoc

pprEvVars :: [EvVar] -> SDoc

pprEvVarWithType :: EvVar -> SDoc

pprArising :: CtOrigin -> SDoc

pprArisingAt :: CtLoc -> SDoc

type TcId = Id

type TcIdSet = IdSet

data HoleSort

Used to indicate which sort of hole we have.

Constructors

ExprHole | A hole in an expression (TypedHoles)
TypeHole | A hole in a type (PartialTypeSignatures)