| Safe Haskell | None | 
|---|---|
| Language | Haskell2010 | 
TcDerivUtils
Synopsis
- type DerivM = ReaderT DerivEnv TcRn
 - data DerivEnv = DerivEnv {
- denv_overlap_mode :: Maybe OverlapMode
 - denv_tvs :: [TyVar]
 - denv_cls :: Class
 - denv_cls_tys :: [Type]
 - denv_tc :: TyCon
 - denv_tc_args :: [Type]
 - denv_rep_tc :: TyCon
 - denv_rep_tc_args :: [Type]
 - denv_ctxt :: DerivContext
 - denv_strat :: Maybe (DerivStrategy GhcTc)
 
 - data DerivSpec theta = DS {
- ds_loc :: SrcSpan
 - ds_name :: Name
 - ds_tvs :: [TyVar]
 - ds_theta :: theta
 - ds_cls :: Class
 - ds_tys :: [Type]
 - ds_tc :: TyCon
 - ds_overlap :: Maybe OverlapMode
 - ds_standalone_wildcard :: Maybe SrcSpan
 - ds_mechanism :: DerivSpecMechanism
 
 - pprDerivSpec :: Outputable theta => DerivSpec theta -> SDoc
 - data DerivSpecMechanism
- = DerivSpecStock (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name]))
 - | DerivSpecNewtype Type
 - | DerivSpecAnyClass
 - | DerivSpecVia Type
 
 - derivSpecMechanismToStrategy :: DerivSpecMechanism -> DerivStrategy GhcTc
 - isDerivSpecStock :: DerivSpecMechanism -> Bool
 - isDerivSpecNewtype :: DerivSpecMechanism -> Bool
 - isDerivSpecAnyClass :: DerivSpecMechanism -> Bool
 - isDerivSpecVia :: DerivSpecMechanism -> Bool
 - data DerivContext
 - data OriginativeDerivStatus
- = CanDeriveStock (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name]))
 - | StockClassError SDoc
 - | CanDeriveAnyClass
 - | NonDerivableClass SDoc
 
 - isStandaloneDeriv :: DerivM Bool
 - isStandaloneWildcardDeriv :: DerivM Bool
 - mkDerivOrigin :: Bool -> CtOrigin
 - data PredOrigin = PredOrigin PredType CtOrigin TypeOrKind
 - data ThetaOrigin = ThetaOrigin {}
 - mkPredOrigin :: CtOrigin -> TypeOrKind -> PredType -> PredOrigin
 - mkThetaOrigin :: CtOrigin -> TypeOrKind -> [TyVar] -> [TyVar] -> ThetaType -> ThetaType -> ThetaOrigin
 - mkThetaOriginFromPreds :: [PredOrigin] -> ThetaOrigin
 - substPredOrigin :: HasCallStack => TCvSubst -> PredOrigin -> PredOrigin
 - checkOriginativeSideConditions :: DynFlags -> DerivContext -> Class -> [TcType] -> TyCon -> TyCon -> OriginativeDerivStatus
 - hasStockDeriving :: Class -> Maybe (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name]))
 - canDeriveAnyClass :: DynFlags -> Validity
 - std_class_via_coercible :: Class -> Bool
 - non_coercible_class :: Class -> Bool
 - newDerivClsInst :: ThetaType -> DerivSpec theta -> TcM ClsInst
 - extendLocalInstEnv :: [ClsInst] -> TcM a -> TcM a
 
Documentation
Contains all of the information known about a derived instance when
 determining what its EarlyDerivSpec should be.
Constructors
| DerivEnv | |
Fields 
  | |
Constructors
| DS | |
Fields 
  | |
pprDerivSpec :: Outputable theta => DerivSpec theta -> SDoc Source #
data DerivSpecMechanism Source #
Constructors
| DerivSpecStock (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name])) | |
| DerivSpecNewtype Type | |
| DerivSpecAnyClass | |
| DerivSpecVia Type | 
Instances
| Outputable DerivSpecMechanism Source # | |
Defined in TcDerivUtils  | |
derivSpecMechanismToStrategy :: DerivSpecMechanism -> DerivStrategy GhcTc Source #
Convert a DerivSpecMechanism to its corresponding DerivStrategy.
data DerivContext Source #
Whether GHC is processing a deriving clause or a standalone deriving
 declaration.
Constructors
| InferContext (Maybe SrcSpan) | 
 
 GHC should infer the context.  | 
| SupplyContext ThetaType | 
  | 
Instances
| Outputable DerivContext Source # | |
Defined in TcDerivUtils  | |
data OriginativeDerivStatus Source #
Records whether a particular class can be derived by way of an
 originative deriving strategy (i.e., stock or anyclass).
See Note [Deriving strategies] in TcDeriv.
Constructors
| CanDeriveStock (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name])) | |
| StockClassError SDoc | |
| CanDeriveAnyClass | |
| NonDerivableClass SDoc | 
isStandaloneDeriv :: DerivM Bool Source #
Is GHC processing a standalone deriving declaration?
isStandaloneWildcardDeriv :: DerivM Bool Source #
Is GHC processing a standalone deriving declaration with an
 extra-constraints wildcard as the context?
 (e.g., deriving instance _ => Eq (Foo a))
mkDerivOrigin :: Bool -> CtOrigin Source #
 returns mkDerivOrigin wcStandAloneDerivOrigin if wc is True,
 and DerivClauseOrigin if wc is False. Useful for error-reporting.
data PredOrigin Source #
A PredType annotated with the origin of the constraint CtOrigin,
 and whether or the constraint deals in types or kinds.
Constructors
| PredOrigin PredType CtOrigin TypeOrKind | 
Instances
| Outputable PredOrigin Source # | |
Defined in TcDerivUtils  | |
data ThetaOrigin Source #
A list of wanted PredOrigin constraints (to_wanted_origins) to
 simplify when inferring a derived instance's context. These are used in all
 deriving strategies, but in the particular case of DeriveAnyClass, we
 need extra information. In particular, we need:
to_anyclass_skols, the list of type variables bound by a class method's regular type signature, which should be rigid.to_anyclass_metas, the list of type variables bound by a class method's default type signature. These can be unified as necessary.to_anyclass_givens, the list of constraints from a class method's regular type signature, which can be used to help solve constraints in theto_wanted_origins.
(Note that to_wanted_origins will likely contain type variables from the
 derived type class or data type, neither of which will appear in
 to_anyclass_skols or to_anyclass_metas.)
For all other deriving strategies, it is always the case that
 to_anyclass_skols, to_anyclass_metas, and to_anyclass_givens are
 empty.
Here is an example to illustrate this:
class Foo a where bar :: forall b. Ix b => a -> b -> String default bar :: forall y. (Show a, Ix y) => a -> y -> String bar x y = show x ++ show (range (y, y)) baz :: Eq a => a -> a -> Bool default baz :: Ord a => a -> a -> Bool baz x y = compare x y == EQ data Quux q = Quux deriving anyclass Foo
Then it would generate two ThetaOrigins, one for each method:
[ ThetaOrigin { to_anyclass_skols  = [b]
              , to_anyclass_metas  = [y]
              , to_anyclass_givens = [Ix b]
              , to_wanted_origins  = [ Show (Quux q), Ix y
                                     , (Quux q -> b -> String) ~
                                       (Quux q -> y -> String)
                                     ] }
, ThetaOrigin { to_anyclass_skols  = []
              , to_anyclass_metas  = []
              , to_anyclass_givens = [Eq (Quux q)]
              , to_wanted_origins  = [ Ord (Quux q)
                                     , (Quux q -> Quux q -> Bool) ~
                                       (Quux q -> Quux q -> Bool)
                                     ] }
]
(Note that the type variable q is bound by the data type Quux, and thus
 it appears in neither to_anyclass_skols nor to_anyclass_metas.)
See Note [Gathering and simplifying constraints for DeriveAnyClass]
 in TcDerivInfer for an explanation of how to_wanted_origins are
 determined in DeriveAnyClass, as well as how to_anyclass_skols,
 to_anyclass_metas, and to_anyclass_givens are used.
Constructors
| ThetaOrigin | |
Fields 
  | |
Instances
| Outputable ThetaOrigin Source # | |
Defined in TcDerivUtils  | |
mkPredOrigin :: CtOrigin -> TypeOrKind -> PredType -> PredOrigin Source #
mkThetaOrigin :: CtOrigin -> TypeOrKind -> [TyVar] -> [TyVar] -> ThetaType -> ThetaType -> ThetaOrigin Source #
substPredOrigin :: HasCallStack => TCvSubst -> PredOrigin -> PredOrigin Source #
checkOriginativeSideConditions :: DynFlags -> DerivContext -> Class -> [TcType] -> TyCon -> TyCon -> OriginativeDerivStatus Source #
hasStockDeriving :: Class -> Maybe (SrcSpan -> TyCon -> [Type] -> TcM (LHsBinds GhcPs, BagDerivStuff, [Name])) Source #
canDeriveAnyClass :: DynFlags -> Validity Source #
std_class_via_coercible :: Class -> Bool Source #
non_coercible_class :: Class -> Bool Source #