packages feed

large-anon-0.2: src/Data/Record/Anon/Internal/Plugin.hs

{-# LANGUAGE CPP #-}

module Data.Record.Anon.Internal.Plugin (plugin) where

import GHC.TcPlugin.API

import qualified GHC.Plugins

import Data.Record.Anon.Internal.Plugin.TC.NameResolution
import Data.Record.Anon.Internal.Plugin.TC.Rewriter
import Data.Record.Anon.Internal.Plugin.TC.Solver
import Data.Record.Anon.Internal.Plugin.Source

-- | The large-anon plugins
--
-- This consists of two plugins:
--
-- 1. The type checker plugin forms the heart of this package. It solves
--    the various constraints we have on rows, and computes type-level metadata.
-- 2. The source plugin offers syntactic sugar for record construction.
plugin :: GHC.Plugins.Plugin
plugin = GHC.Plugins.defaultPlugin {
      GHC.Plugins.tcPlugin = \_args -> Just $
        mkTcPlugin tcPlugin
    , GHC.Plugins.parsedResultAction = \args _modSummary ->
        ignoreMessages $ sourcePlugin args
    , GHC.Plugins.pluginRecompile =
        GHC.Plugins.purePlugin
    }
  where
#if __GLASGOW_HASKELL__ >= 904
    ignoreMessages f (GHC.Plugins.ParsedResult modl msgs) =
            (\modl' -> GHC.Plugins.ParsedResult modl' msgs) <$> f modl
#else
    ignoreMessages = id
#endif

tcPlugin :: TcPlugin
tcPlugin = TcPlugin {
      tcPluginInit    = nameResolution
    , tcPluginSolve   = solve
    , tcPluginRewrite = rewrite
    , tcPluginStop    = const $ return ()
    }