InstEnv

ghc-8.4.1: The GHC API

Safe Haskell | None
Language | Haskell2010

InstEnv

Synopsis

- type DFunId = Id
- type InstMatch = (ClsInst, [DFunInstType])
- type ClsInstLookupResult = ([InstMatch], [ClsInst], [InstMatch])
- data OverlapFlag = OverlapFlag {
  - overlapMode :: OverlapMode
  - isSafeOverlap :: Bool
  }
- data OverlapMode
  - = NoOverlap SourceText
  - | Overlappable SourceText
  - | Overlapping SourceText
  - | Overlaps SourceText
  - | Incoherent SourceText
- setOverlapModeMaybe :: OverlapFlag -> Maybe OverlapMode -> OverlapFlag
- data ClsInst = ClsInst {
  - is_cls_nm :: Name
  - is_tcs :: [Maybe Name]
  - is_dfun_name :: Name
  - is_tvs :: [TyVar]
  - is_cls :: Class
  - is_tys :: [Type]
  - is_dfun :: DFunId
  - is_flag :: OverlapFlag
  - is_orphan :: IsOrphan
  }
- type DFunInstType = Maybe Type
- pprInstance :: ClsInst -> SDoc
- pprInstanceHdr :: ClsInst -> SDoc
- pprInstances :: [ClsInst] -> SDoc
- instanceHead :: ClsInst -> ([TyVar], Class, [Type])
- instanceSig :: ClsInst -> ([TyVar], [Type], Class, [Type])
- mkLocalInstance :: DFunId -> OverlapFlag -> [TyVar] -> Class -> [Type] -> ClsInst
- mkImportedInstance :: Name -> [Maybe Name] -> Name -> DFunId -> OverlapFlag -> IsOrphan -> ClsInst
- instanceDFunId :: ClsInst -> DFunId
- tidyClsInstDFun :: (DFunId -> DFunId) -> ClsInst -> ClsInst
- instanceRoughTcs :: ClsInst -> [Maybe Name]
- fuzzyClsInstCmp :: ClsInst -> ClsInst -> Ordering
- orphNamesOfClsInst :: ClsInst -> NameSet
- data InstEnvs = InstEnvs {
  - ie_global :: InstEnv
  - ie_local :: InstEnv
  - ie_visible :: VisibleOrphanModules
  }
- type VisibleOrphanModules = ModuleSet
- type InstEnv = UniqDFM ClsInstEnv
- emptyInstEnv :: InstEnv
- extendInstEnv :: InstEnv -> ClsInst -> InstEnv
- deleteFromInstEnv :: InstEnv -> ClsInst -> InstEnv
- identicalClsInstHead :: ClsInst -> ClsInst -> Bool
- extendInstEnvList :: InstEnv -> [ClsInst] -> InstEnv
- lookupUniqueInstEnv :: InstEnvs -> Class -> [Type] -> Either MsgDoc (ClsInst, [Type])
- lookupInstEnv :: Bool -> InstEnvs -> Class -> [Type] -> ClsInstLookupResult
- instEnvElts :: InstEnv -> [ClsInst]
- memberInstEnv :: InstEnv -> ClsInst -> Bool
- instIsVisible :: VisibleOrphanModules -> ClsInst -> Bool
- classInstances :: InstEnvs -> Class -> [ClsInst]
- instanceBindFun :: TyCoVar -> BindFlag
- instanceCantMatch :: [Maybe Name] -> [Maybe Name] -> Bool
- roughMatchTcs :: [Type] -> [Maybe Name]
- isOverlappable :: ClsInst -> Bool
- isOverlapping :: ClsInst -> Bool
- isIncoherent :: ClsInst -> Bool

# Documentation

type DFunId = Id Source #

Dictionary Function Identifier

type InstMatch = (ClsInst, [DFunInstType]) Source #

type ClsInstLookupResult = ([InstMatch], [ClsInst], [InstMatch]) Source #

data OverlapFlag Source #

The semantics allowed for overlapping instances for a particular instance. See Note [Safe Haskell isSafeOverlap] (in `hs`) for a explanation of the `isSafeOverlap` field.

- `AnnKeywordId` : `AnnOpen` `'{-# OVERLAPPABLE'` or `'{-# OVERLAPPING'` or `'{-# OVERLAPS'` or `'{-# INCOHERENT'`, `AnnClose` ``#-}``,

Constructors

OverlapFlag |
Fields overlapMode :: OverlapMode isSafeOverlap :: Bool

Instances

Eq OverlapFlag Source # |
Instance details Methods (==) :: OverlapFlag -> OverlapFlag -> Bool # (/=) :: OverlapFlag -> OverlapFlag -> Bool #
Data OverlapFlag Source # |
Instance details Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> OverlapFlag -> c OverlapFlag Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c OverlapFlag Source # toConstr :: OverlapFlag -> Constr Source # dataTypeOf :: OverlapFlag -> DataType Source # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c OverlapFlag) Source # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c OverlapFlag) Source # gmapT :: (forall b. Data b => b -> b) -> OverlapFlag -> OverlapFlag Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> OverlapFlag -> r Source # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> OverlapFlag -> r Source # gmapQ :: (forall d. Data d => d -> u) -> OverlapFlag -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> OverlapFlag -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> OverlapFlag -> m OverlapFlag Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> OverlapFlag -> m OverlapFlag Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> OverlapFlag -> m OverlapFlag Source #
Outputable OverlapFlag Source # |
Instance details Methods ppr :: OverlapFlag -> SDoc Source # pprPrec :: Rational -> OverlapFlag -> SDoc Source #
Binary OverlapFlag Source # |
Instance details Methods put_ :: BinHandle -> OverlapFlag -> IO () Source # put :: BinHandle -> OverlapFlag -> IO (Bin OverlapFlag) Source # get :: BinHandle -> IO OverlapFlag Source #

data OverlapMode Source #

Constructors

NoOverlap SourceText | This instance must not overlap another `NoOverlap` instance. However, it may be overlapped by `Overlapping` instances, and it may overlap `Overlappable` instances.
Overlappable SourceText | Silently ignore this instance if you find a more specific one that matches the constraint you are trying to resolve Example: constraint (Foo [Int]) instance Foo [Int] instance {--} Foo [a] Since the second instance has the Overlappable flag, the first instance will be chosen (otherwise its ambiguous which to choose)
Overlapping SourceText | Silently ignore any more general instances that may be used to solve the constraint. Example: constraint (Foo [Int]) instance {--} Foo [Int] instance Foo [a] Since the first instance has the Overlapping flag, the second---more general---instance will be ignored (otherwise it is ambiguous which to choose)
Overlaps SourceText | Equivalent to having both `Overlapping` and `Overlappable` flags.
Incoherent SourceText | Behave like Overlappable and Overlapping, and in addition pick an an arbitrary one if there are multiple matching candidates, and don't worry about later instantiation Example: constraint (Foo [b]) instance {-# INCOHERENT -} Foo [Int] instance Foo [a] Without the Incoherent flag, we'd complain that instantiating `b` would change which instance was chosen. See also note [Incoherent instances] in InstEnv

Instances

Eq OverlapMode Source # |
Instance details Methods (==) :: OverlapMode -> OverlapMode -> Bool # (/=) :: OverlapMode -> OverlapMode -> Bool #
Data OverlapMode Source # |
Instance details Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> OverlapMode -> c OverlapMode Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c OverlapMode Source # toConstr :: OverlapMode -> Constr Source # dataTypeOf :: OverlapMode -> DataType Source # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c OverlapMode) Source # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c OverlapMode) Source # gmapT :: (forall b. Data b => b -> b) -> OverlapMode -> OverlapMode Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> OverlapMode -> r Source # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> OverlapMode -> r Source # gmapQ :: (forall d. Data d => d -> u) -> OverlapMode -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> OverlapMode -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> OverlapMode -> m OverlapMode Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> OverlapMode -> m OverlapMode Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> OverlapMode -> m OverlapMode Source #
Outputable OverlapMode Source # |
Instance details Methods ppr :: OverlapMode -> SDoc Source # pprPrec :: Rational -> OverlapMode -> SDoc Source #
Binary OverlapMode Source # |
Instance details Methods put_ :: BinHandle -> OverlapMode -> IO () Source # put :: BinHandle -> OverlapMode -> IO (Bin OverlapMode) Source # get :: BinHandle -> IO OverlapMode Source #

setOverlapModeMaybe :: OverlapFlag -> Maybe OverlapMode -> OverlapFlag Source #

data ClsInst Source #

A type-class instance. Note that there is some tricky laziness at work here. See Note [ClsInst laziness and the rough-match fields] for more details.

Constructors

ClsInst |
Fields is_cls_nm :: Name Class name is_tcs :: [Maybe Name] Top of type args is_dfun_name :: Name `is_dfun_name = idName . is_dfun`. We use `is_dfun_name` for the visibility check, `instIsVisible`, which needs to know the `Module` which the dictionary is defined in. However, we cannot use the `Module` attached to `is_dfun` since doing so would mean we would potentially pull in an entire interface file unnecessarily. This was the cause of #12367. is_tvs :: [TyVar] is_cls :: Class is_tys :: [Type] is_dfun :: DFunId is_flag :: OverlapFlag is_orphan :: IsOrphan

Instances

Data ClsInst Source # |
Instance details Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> ClsInst -> c ClsInst Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c ClsInst Source # toConstr :: ClsInst -> Constr Source # dataTypeOf :: ClsInst -> DataType Source # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c ClsInst) Source # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ClsInst) Source # gmapT :: (forall b. Data b => b -> b) -> ClsInst -> ClsInst Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ClsInst -> r Source # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ClsInst -> r Source # gmapQ :: (forall d. Data d => d -> u) -> ClsInst -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> ClsInst -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> ClsInst -> m ClsInst Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> ClsInst -> m ClsInst Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> ClsInst -> m ClsInst Source #
Outputable ClsInst Source # |
Instance details Methods ppr :: ClsInst -> SDoc Source # pprPrec :: Rational -> ClsInst -> SDoc Source #
NamedThing ClsInst Source # |
Instance details Methods getOccName :: ClsInst -> OccName Source # getName :: ClsInst -> Name Source #

type DFunInstType = Maybe Type Source #

pprInstance :: ClsInst -> SDoc Source #

pprInstanceHdr :: ClsInst -> SDoc Source #

pprInstances :: [ClsInst] -> SDoc Source #

instanceHead :: ClsInst -> ([TyVar], Class, [Type]) Source #

instanceSig :: ClsInst -> ([TyVar], [Type], Class, [Type]) Source #

mkLocalInstance :: DFunId -> OverlapFlag -> [TyVar] -> Class -> [Type] -> ClsInst Source #

mkImportedInstance Source #

Arguments

:: Name | the name of the class
-> [Maybe Name] | the types which the class was applied to
-> Name | the `Name` of the dictionary binding
-> DFunId | the `Id` of the dictionary.
-> OverlapFlag | may this instance overlap?
-> IsOrphan | is this instance an orphan?
-> ClsInst |

instanceDFunId :: ClsInst -> DFunId Source #

tidyClsInstDFun :: (DFunId -> DFunId) -> ClsInst -> ClsInst Source #

instanceRoughTcs :: ClsInst -> [Maybe Name] Source #

fuzzyClsInstCmp :: ClsInst -> ClsInst -> Ordering Source #

A fuzzy comparison function for class instances, intended for sorting instances before displaying them to the user.

orphNamesOfClsInst :: ClsInst -> NameSet Source #

Collects the names of concrete types and type constructors that make up the head of a class instance. For instance, given `class Foo a b`:

`instance Foo (Either (Maybe Int) a) Bool` would yield [Either, Maybe, Int, Bool]

Used in the implementation of ":info" in GHCi.

The `tcSplitSigmaTy` is because of instance Foo a => Baz T where ... The decl is an orphan if Baz and T are both not locally defined, even if Foo *is* locally defined

data InstEnvs Source #

`InstEnvs` represents the combination of the global type class instance environment, the local type class instance environment, and the set of transitively reachable orphan modules (according to what modules have been directly imported) used to test orphan instance visibility.

Constructors

InstEnvs |
Fields ie_global :: InstEnv ie_local :: InstEnv ie_visible :: VisibleOrphanModules

type VisibleOrphanModules = ModuleSet Source #

Set of visible orphan modules, according to what modules have been directly imported. This is based off of the dep_orphs field, which records transitively reachable orphan modules (modules that define orphan instances).

type InstEnv = UniqDFM ClsInstEnv Source #

emptyInstEnv :: InstEnv Source #

extendInstEnv :: InstEnv -> ClsInst -> InstEnv Source #

deleteFromInstEnv :: InstEnv -> ClsInst -> InstEnv Source #

identicalClsInstHead :: ClsInst -> ClsInst -> Bool Source #

True when when the instance heads are the same e.g. both are Eq [(a,b)] Used for overriding in GHCi Obviously should be insenstive to alpha-renaming

extendInstEnvList :: InstEnv -> [ClsInst] -> InstEnv Source #

lookupUniqueInstEnv :: InstEnvs -> Class -> [Type] -> Either MsgDoc (ClsInst, [Type]) Source #

Look up an instance in the given instance environment. The given class application must match exactly one instance and the match may not contain any flexi type variables. If the lookup is unsuccessful, yield 'Left errorMessage'.

lookupInstEnv :: Bool -> InstEnvs -> Class -> [Type] -> ClsInstLookupResult Source #

See Note [Rules for instance lookup] ^ See Note [Safe Haskell Overlapping Instances] in TcSimplify ^ See Note [Safe Haskell Overlapping Instances Implementation] in TcSimplify

instEnvElts :: InstEnv -> [ClsInst] Source #

memberInstEnv :: InstEnv -> ClsInst -> Bool Source #

Checks for an exact match of ClsInst in the instance environment. We use this when we do signature checking in TcRnDriver

instIsVisible :: VisibleOrphanModules -> ClsInst -> Bool Source #

Test if an instance is visible, by checking that its origin module is in `VisibleOrphanModules`. See Note [Instance lookup and orphan instances]

classInstances :: InstEnvs -> Class -> [ClsInst] Source #

instanceBindFun :: TyCoVar -> BindFlag Source #

instanceCantMatch :: [Maybe Name] -> [Maybe Name] -> Bool Source #

roughMatchTcs :: [Type] -> [Maybe Name] Source #

isOverlappable :: ClsInst -> Bool Source #

isOverlapping :: ClsInst -> Bool Source #

isIncoherent :: ClsInst -> Bool Source #