{-# LANGUAGE CPP #-}

module GhcApi
    ( module X
    ) where

import GHC.Core.Coercion as X (mkUnivCo, Coercion)

import GHC.Core.DataCon as X (dataConName, promoteDataCon, dataConWrapId)
import GHC.Data.FastString as X (FastString(..), fsLit)
import GHC as X (mkModuleName)
import GHC.Types.Name as X (mkSysTvName)
import GHC.Types.Name.Occurrence as X (occName, occNameFS, mkTcOcc)
import GHC.Utils.Outputable as X (Outputable(..), (<>), (<+>), ($$), text)
import GHC.Driver.Plugins as X (Plugin(..), defaultPlugin)

import GHC.Tc.Types.Evidence as X
    ( EvTerm(..)
    , TcCoercion
    , TcCoercionR
    , EvExpr
    , evCast
    , evDFunApp
    )

import GHC.Tc.Plugin as X
    ( TcPluginM
    , tcPluginTrace, matchFam, newFlexiTyVar, isTouchableTcPluginM
    , tcLookupTyCon, zonkCt
    , newUnique
    )
-- import GHC.Tc.Types as X (TcPlugin(..), TcPluginResult(..))
import GHC.Tc.Types.Constraint as X
    ( Ct(..), CtLoc
    , ctLoc, ctEvidence, ctEvPred, ctPred, ctEvExpr, ctEvTerm
    , isGiven, isWanted, isGivenCt
    , mkNonCanonical
    )
import GHC.Tc.Utils.TcType as X (tcSplitTyConApp_maybe {-, vanillaSkolemTv -})
import GHC.Core.TyCon as X (TyCon(..), Role(..), isFamilyTyCon, tyConDataCons)

import GHC.Core.TyCo.Rep as X
    ( UnivCoProvenance(PluginProv)
    , Kind
    , Type(TyConApp, TyVarTy, AppTy, ForAllTy, FunTy, LitTy)
    , mkTyVarTy
    , mkFunTy
#if __GLASGOW_HASKELL__ > 900
    , cmpTyLit
#endif
    )

import GHC.Core.Coercion as X (mkPrimEqPred)
import GHC.Core.Predicate as X
    ( EqRel(..)
    , Pred(..)
    , classifyPredType
    )
import GHC as X (PredType)
import GHC.Core.Type as X
    ( splitTyConApp_maybe, typeKind
    , tyCoVarsOfType, tyCoVarsOfTypes
    , mkNumLitTy, mkTyConApp
    , isNumLitTy, isStrLitTy
    , coreView
    , mkStrLitTy
    , nonDetCmpType, nonDetCmpTypes, nonDetCmpTc
    , mkAppTy
    )

import GHC.Builtin.Types as X (typeSymbolKind, nilDataCon, consDataCon, heqTyCon, heqDataCon)

import GHC.Types.Unique as X
    ( getUnique
    , nonDetCmpUnique
    )

import GHC.Types.Var as X
    ( TyVar
    , DFunId
    , Id
    , mkTcTyVar
    )

import GHC.Types.Var.Set as X (TyCoVarSet, elemVarSet)

import GHC.Driver.Plugins as X (PluginRecompile(..))