Commit f804ec1a authored by Andrew Gibiansky's avatar Andrew Gibiansky

Attempting to fix #301

parent 1693d800
...@@ -19,28 +19,32 @@ module IHaskell.Eval.Util ( ...@@ -19,28 +19,32 @@ module IHaskell.Eval.Util (
doc, doc,
) where ) where
import ClassyPrelude import ClassyPrelude
-- GHC imports. -- GHC imports.
import DynFlags import DynFlags
import FastString import FastString
import GHC import GHC
import GhcMonad import GhcMonad
import HsImpExp import HsImpExp
import HscTypes import HscTypes
import InteractiveEval import InteractiveEval
import Module import Module
import Outputable import Outputable
import Packages import Packages
import RdrName import RdrName
import NameSet import NameSet
import Name import Name
import PprTyThing import PprTyThing
import InstEnv (ClsInst(..))
import Unify (tcMatchTys)
import VarSet (mkVarSet)
import qualified Pretty import qualified Pretty
import Control.Monad (void) import Control.Monad (void)
import Data.Function (on) import Data.Function (on)
import Data.String.Utils (replace) import Data.String.Utils (replace)
import Data.List (nubBy)
-- | A extension flag that can be set or unset. -- | A extension flag that can be set or unset.
data ExtFlag data ExtFlag
...@@ -197,9 +201,26 @@ evalImport imports = do ...@@ -197,9 +201,26 @@ evalImport imports = do
evalDeclarations :: GhcMonad m => String -> m [String] evalDeclarations :: GhcMonad m => String -> m [String]
evalDeclarations decl = do evalDeclarations decl = do
names <- runDecls decl names <- runDecls decl
cleanUpDuplicateInstances
flags <- getSessionDynFlags flags <- getSessionDynFlags
return $ map (replace ":Interactive." "" . showPpr flags) names return $ map (replace ":Interactive." "" . showPpr flags) names
cleanUpDuplicateInstances :: GhcMonad m => m ()
cleanUpDuplicateInstances = modifySession $ \hscEnv ->
let
-- Get all class instancesj
ic = hsc_IC hscEnv
(clsInsts, famInsts) = ic_instances ic
-- Remove duplicates
clsInsts' = nubBy instEq clsInsts
in hscEnv { hsc_IC = ic { ic_instances = (clsInsts', famInsts) } }
where
instEq :: ClsInst -> ClsInst -> Bool
instEq ClsInst{is_tvs = tpl_tvs,is_tys = tpl_tys} ClsInst{is_tys = tpl_tys'} =
let tpl_tv_set = mkVarSet tpl_tvs
in isJust $ tcMatchTys tpl_tv_set tpl_tys tpl_tys'
-- | Get the type of an expression and convert it to a string. -- | Get the type of an expression and convert it to a string.
getType :: GhcMonad m => String -> m String getType :: GhcMonad m => String -> m String
getType expr = do getType expr = do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment