module Test.Target.Util where
import Control.Monad.IO.Class
import Data.List
import Data.Maybe
import Data.Generics (everywhere, mkT)
import Debug.Trace
import qualified DynFlags as GHC
import qualified GhcMonad as GHC
import qualified GHC
import qualified GHC.Exts as GHC
import qualified GHC.Paths
import qualified HscTypes as GHC
import Language.Fixpoint.Smt.Types
import Language.Fixpoint.Types hiding (prop)
import qualified Language.Fixpoint.Types as F
import Language.Haskell.Liquid.UX.CmdLine
import Language.Haskell.Liquid.GHC.Interface
import Language.Haskell.Liquid.Types.PredType
import Language.Haskell.Liquid.Types.RefType
import Language.Haskell.Liquid.Types hiding (var)
type Depth = Int
io :: MonadIO m => IO a -> m a
io = liftIO
myTrace :: Show a => String -> a -> a
myTrace s x = trace (s ++ ": " ++ show x) x
reft :: SpecType -> Reft
reft = toReft . rt_reft
data HList (a :: [*]) where
Nil :: HList '[]
(:::) :: a -> HList bs -> HList (a ': bs)
instance AllHave Show as => Show (HList as) where
show Nil = "()"
show (x ::: Nil) = show x
show (x ::: xs) = show x ++ ", " ++ show xs
type family Map (f :: a -> b) (xs :: [a]) :: [b] where
Map f '[] = '[]
Map f (x ': xs) = f x ': Map f xs
type family Constraints (cs :: [GHC.Constraint]) :: GHC.Constraint
type instance Constraints '[] = ()
type instance Constraints (c ': cs) = (c, Constraints cs)
type AllHave (c :: k -> GHC.Constraint) (xs :: [k]) = Constraints (Map c xs)
type family Args a where
Args (a -> b) = a ': Args b
Args a = '[]
type family Res a where
Res (a -> b) = Res b
Res a = a
makeDecl :: SEnv F.DataDecl -> Symbol -> Sort -> Command
makeDecl env x t = Declare x ins' out'
where
ins' = sortSmtSort False env <$> ins
out' = sortSmtSort False env out
(ins, out) = deconSort t
deconSort :: Sort -> ([Sort], Sort)
deconSort t = case functionSort t of
Just (_, ins, out) -> (ins, out)
Nothing -> ([] , t )
safeFromJust :: String -> Maybe a -> a
safeFromJust msg Nothing = error $ "safeFromJust: " ++ msg
safeFromJust _ (Just x) = x
applyPreds :: SpecType -> SpecType -> [(Symbol,SpecType)]
applyPreds sp' dc =
zip xs (map tx ts)
where
sp = removePreds <$> sp'
removePreds (MkUReft r _ _) = MkUReft r mempty mempty
(as, ps, _, t) = bkUniv dc
(xs, ts, _, _) = bkArrow . snd $ bkClass t
su = [(ty_var_value tv, toRSort t, t) | tv <- as | t <- rt_args sp]
sup = [(p, r) | p <- ps | r <- rt_pargs sp]
tx = (\t -> replacePreds "applyPreds" t sup)
. everywhere (mkT $ propPsToProp sup)
. subsTyVars_meet su
propPsToProp :: [(RPVar, SpecProp)] -> SpecProp -> SpecProp
propPsToProp su r = foldr propPToProp r su
propPToProp :: (RPVar, SpecProp) -> SpecProp -> SpecProp
propPToProp (p, r) (RProp _ (RHole (MkUReft _ (Pr [up]) _)))
| pname p == pname up
= r
propPToProp _ m = m
splitEApp_maybe :: Expr -> Maybe (Symbol, [Expr])
splitEApp_maybe e@(EApp {}) = go [] e
where
go acc (EApp f e) = go (e:acc) f
go acc (EVar s) = Just (s, acc)
go _ _ = Nothing
splitEApp_maybe _ = Nothing
stripQuals :: SpecType -> SpecType
stripQuals = snd . bkClass . fourth4 . bkUniv
fourth4 :: (t, t1, t2, t3) -> t3
fourth4 (_,_,_,d) = d
getSpec :: [String] -> FilePath -> IO GhcSpec
getSpec opts target
= do cfg <- getOpts ["--quiet"]
spec . head . fst <$> getGhcInfos Nothing (cfg {ghcOptions = opts}) [target]
runGhc :: [String] -> GHC.Ghc a -> IO a
runGhc o x = GHC.runGhc (Just GHC.Paths.libdir) $ do
df <- GHC.getSessionDynFlags
let df' = df { GHC.ghcMode = GHC.CompManager
, GHC.ghcLink = GHC.NoLink --GHC.LinkInMemory
, GHC.hscTarget = GHC.HscNothing --GHC.HscInterpreted
, GHC.log_action = \_ _ _ _ _ _ -> return ()
} `GHC.gopt_set` GHC.Opt_ImplicitImportQualified
(df'',_,_) <- GHC.parseDynamicFlags df' (map GHC.noLoc o)
_ <- GHC.setSessionDynFlags df''
x
loadModule :: FilePath -> GHC.Ghc GHC.ModSummary
loadModule f = do target <- GHC.guessTarget f Nothing
GHC.setTargets [target]
_ <- GHC.load GHC.LoadAllTargets
modGraph <- GHC.getModuleGraph
let m = fromJust $ find ((==f) . GHC.msHsFilePath) modGraph
GHC.setContext [ GHC.IIModule (GHC.ms_mod_name m)
]
return m