module Tip.Dicts (inlineDicts,maybeUnfolding,varFromRealModule) where
import Tip.GHCUtils (showOutputable)
#if __GLASGOW_HASKELL__ >= 708
import DynFlags (unsafeGlobalDynFlags)
#endif
import CoreSyn
import CoreUtils()
import IdInfo
import Id
import Var
import Data.List (elemIndex)
import VarEnv (emptyInScopeSet)
import Data.Generics.Geniplate
import Outputable
import Type
import Literal
import Coercion
import Name (getOccString,nameModule_maybe)
import PrelNames (gHC_REAL)
maybeUnfolding :: Id -> Maybe CoreExpr
maybeUnfolding v = case ri of
CoreUnfolding{uf_tmpl} -> Just uf_tmpl
_ -> Nothing
where
ri = realIdUnfolding v
varFromRealModule :: Var -> String -> Bool
varFromRealModule x s = getOccString x == s && nameModule_maybe (varName x) == Just gHC_REAL
inlineDicts :: TransformBi (Expr Id) t => t -> t
inlineDicts = transformBi $ \ e0 -> case e0 of
App (App (Var f) (Type t)) (Var d)
| any (varFromRealModule f) ["mod","div"] -> Var f
#if __GLASGOW_HASKELL__ >= 708
| [try] <- [ try | BuiltinRule _ _ 2 try <- idCoreRules f ]
, Just e <- try unsafeGlobalDynFlags (emptyInScopeSet,realIdUnfolding) f [Type t,Var d]
-> e
#endif
| Just cl <- isClassOpId_maybe f
, DFunId{} <- idDetails d
-> case maybeUnfolding f of
Just (collectBinders -> (_,Case _ _ _ [(_,ss,Var s)]))
| Just i <- elemIndex s ss -> case realIdUnfolding d of
#if __GLASGOW_HASKELL__ == 706
DFunUnfolding _ _ es -> drop (length es length ss) (dfunArgExprs es) !! i
#else
DFunUnfolding _ _ es -> drop (length es length ss) es !! i
#endif
CoreUnfolding{uf_tmpl} ->
let (_,es) = collectArgs uf_tmpl
in drop (length es length ss) es !! i
x -> e0
x -> e0
_ -> e0