packages feed

overloaded-0.3.1: src/Overloaded/Plugin/TcPlugin/Ctx.hs

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE CPP             #-}
module Overloaded.Plugin.TcPlugin.Ctx where

import qualified GHC.Compat.All  as GHC
import           GHC.Compat.Expr

#if MIN_VERSION_ghc(9,0,0)
import qualified GHC.Tc.Plugin as Plugins
#else
import qualified TcPluginM as Plugins
#endif

import Overloaded.Plugin.Diagnostics
import Overloaded.Plugin.Names

data PluginCtx = PluginCtx
    { hasPolyFieldCls :: GHC.Class
    , hasPolyConCls   :: GHC.Class
    }

tcPluginInit :: GHC.TcPluginM PluginCtx
tcPluginInit = do
    dflags <- GHC.unsafeTcPluginTcM GHC.getDynFlags

    let findModule :: GHC.ModuleName -> Plugins.TcPluginM GHC.Module
        findModule m = do
            im <- Plugins.findImportedModule m Nothing
            case im of
                GHC.Found _ md -> return md
                _              -> do
                    Plugins.tcPluginIO $ putError dflags noSrcSpan  $
                        GHC.text "Cannot find module" GHC.<+> GHC.ppr m 
                    fail "panic!"

    hasPolyFieldCls <- do
        md <- findModule ghcRecordsCompatMN
        Plugins.tcLookupClass =<< Plugins.lookupOrig md (GHC.mkTcOcc "HasField")

    hasPolyConCls <- do
        md <- findModule overloadedConstructorsMN
        Plugins.tcLookupClass =<< Plugins.lookupOrig md (GHC.mkTcOcc "HasConstructor")

    return PluginCtx {..}