{-| This module re-exports a bunch of the GHC API. The intended use of this module is to shelter LiquidHaskell from changes to the GHC API, so this is the /only/ module LiquidHaskell should import when trying to access any ghc-specific functionality. --} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE BangPatterns #-} module Liquid.GHC.API ( module Ghc , module StableModule , tyConRealArity , dataConExTyVars , fsToUnitId , moduleUnitId , thisPackage , renderWithStyle , mkUserStyle , pattern LitNumber , dataConSig , getDependenciesModuleNames , gcatch ) where import Liquid.GHC.API.StableModule as StableModule import GHC as Ghc hiding ( Warning , SrcSpan(RealSrcSpan, UnhelpfulSpan) , exprType ) import Optics import qualified Control.Monad.Catch as Ex import Data.Foldable (asum) import GHC.Builtin.Names as Ghc import GHC.Builtin.Types as Ghc import GHC.Builtin.Types.Prim as Ghc import GHC.Builtin.Utils as Ghc import GHC.Core as Ghc hiding (AnnExpr, AnnExpr' (..), AnnRec, AnnCase) import GHC.Core.Class as Ghc import GHC.Core.Coercion as Ghc import GHC.Core.Coercion.Axiom as Ghc import GHC.Core.ConLike as Ghc import GHC.Core.DataCon as Ghc import GHC.Core.FamInstEnv as Ghc hiding (pprFamInst) import GHC.Core.InstEnv as Ghc import GHC.Core.Lint as Ghc hiding (dumpIfSet) import GHC.Core.Make as Ghc import GHC.Core.Opt.Monad as Ghc (CoreToDo(..)) import GHC.Core.Opt.WorkWrap.Utils as Ghc import GHC.Core.Predicate as Ghc (getClassPredTys_maybe, getClassPredTys, isEvVarType, isEqPrimPred, isEqPred, isClassPred, isDictId, mkClassPred) import GHC.Core.Subst as Ghc (deShadowBinds, emptySubst, extendCvSubst) import GHC.Core.TyCo.Rep as Ghc import GHC.Core.TyCon as Ghc import GHC.Core.Type as Ghc hiding (typeKind , isPredTy, extendCvSubst, linear) import GHC.Core.Unify as Ghc import GHC.Core.Utils as Ghc (exprType) import GHC.Data.Bag as Ghc import GHC.Data.FastString as Ghc import GHC.Data.Graph.Directed as Ghc import GHC.Data.Pair as Ghc import GHC.Driver.Finder as Ghc import GHC.Driver.Main as Ghc import GHC.Driver.Phases as Ghc (Phase(StopLn)) import GHC.Driver.Pipeline as Ghc (compileFile) import GHC.Driver.Session as Ghc hiding (isHomeModule) import GHC.Driver.Types as Ghc import GHC.Driver.Monad as Ghc (withSession) import GHC.HsToCore.Monad as Ghc import GHC.Iface.Syntax as Ghc import GHC.Plugins as Ghc ( deserializeWithData , fromSerialized , toSerialized , defaultPlugin , Plugin(..) , CommandLineOption , purePlugin , extendIdSubst , substExpr ) import GHC.Tc.Instance.Family as Ghc import GHC.Tc.Module as Ghc import GHC.Tc.Types as Ghc import GHC.Tc.Utils.Monad as Ghc hiding (getGHCiMonad) import GHC.Tc.Utils.TcType as Ghc (tcSplitDFunTy, tcSplitMethodTy) import GHC.Types.Annotations as Ghc import GHC.Types.Avail as Ghc import GHC.Types.Basic as Ghc import GHC.Types.CostCentre as Ghc import GHC.Types.Id as Ghc hiding (lazySetIdInfo, setIdExported, setIdNotExported) import GHC.Types.Id.Info as Ghc import GHC.Types.Literal as Ghc hiding (LitNumber) import GHC.Types.Name as Ghc hiding (varName, isWiredIn) import GHC.Types.Name.Reader as Ghc import GHC.Types.Name.Set as Ghc import GHC.Types.SrcLoc as Ghc import GHC.Types.Unique as Ghc import GHC.Types.Unique.DFM as Ghc import GHC.Types.Unique.FM as Ghc import GHC.Types.Unique.Set as Ghc import GHC.Types.Unique.Supply as Ghc import GHC.Types.Var as Ghc import GHC.Types.Var.Env as Ghc import GHC.Types.Var.Set as Ghc import GHC.Unit.Module as Ghc import GHC.Utils.Error as Ghc import GHC.Utils.Outputable as Ghc hiding ((<>), integer, renderWithStyle, mkUserStyle) import GHC.Utils.Panic as Ghc import qualified GHC.Types.Literal as Ghc import qualified GHC.Utils.Outputable as Ghc import GHC.Tc.Types.Origin as Ghc (lexprCtOrigin) import GHC.Rename.Expr as Ghc (rnLExpr) import GHC.Tc.Gen.Expr as Ghc (tcInferSigma, tcInferRho) import GHC.Tc.Gen.Bind as Ghc (tcValBinds) import GHC.Tc.Solver as Ghc import GHC.Tc.Utils.Zonk as Ghc import GHC.Core.FVs as Ghc (exprFreeVarsList) import GHC.Tc.Types.Evidence as Ghc import GHC.HsToCore.Expr as Ghc import GHC.Core.Opt.OccurAnal as Ghc -- 'fsToUnitId' is gone in GHC 9, but we can bring code it in terms of 'fsToUnit' and 'toUnitId'. fsToUnitId :: FastString -> UnitId fsToUnitId = toUnitId . fsToUnit moduleUnitId :: Module -> UnitId moduleUnitId = toUnitId . moduleUnit thisPackage :: DynFlags -> UnitId thisPackage = toUnitId . homeUnit -- See NOTE [tyConRealArity]. tyConRealArity :: TyCon -> Int tyConRealArity tc = go 0 (tyConKind tc) where go :: Int -> Kind -> Int go !acc k = case asum [fmap (view _3) (splitFunTy_maybe k), fmap snd (splitForAllTy_maybe k)] of Nothing -> acc Just ks -> go (acc + 1) ks dataConExTyVars :: DataCon -> [TyVar] dataConExTyVars = dataConExTyCoVars getDependenciesModuleNames :: Dependencies -> [ModuleNameWithIsBoot] getDependenciesModuleNames = dep_mods renderWithStyle :: DynFlags -> SDoc -> PprStyle -> String renderWithStyle dynflags sdoc style = Ghc.renderWithStyle (Ghc.initSDocContext dynflags style) sdoc mkUserStyle :: DynFlags -> PrintUnqualified -> Depth -> PprStyle mkUserStyle _ = Ghc.mkUserStyle -- -- Literal -- -- In GHC 9 'LitNumber' doesn't have the extra 3rd argument, so we simply ignore it in the construction. pattern LitNumber :: Ghc.LitNumType -> Integer -> Ghc.Type -> Ghc.Literal pattern LitNumber numType integer ty <- ((intPrimTy,) -> (ty, Ghc.LitNumber numType integer)) where LitNumber numType integer _ = Ghc.LitNumber numType integer -- This function is gone in GHC 9. dataConSig :: DataCon -> ([TyCoVar], ThetaType, [Type], Type) dataConSig dc = (dataConUnivAndExTyCoVars dc, dataConTheta dc, map irrelevantMult $ dataConOrigArgTys dc, dataConOrigResTy dc) gcatch :: (Ex.MonadCatch m, Exception e) => m a -> (e -> m a) -> m a gcatch = Ex.catch