packages feed

g2-0.2.0.0: src/G2/Liquid/Inference/Initalization.hs

module G2.Liquid.Inference.Initalization ( initStateAndConfig
                                         , createStateForInference
                                         , getGHCI ) where

import G2.Config.Config as G2
import qualified G2.Initialization.Types as IT
import G2.Interface hiding (violated)
import G2.Language
import qualified G2.Language.ExprEnv as E
import G2.Translation

import G2.Liquid.AddTyVars
import G2.Liquid.Config
import G2.Liquid.Interface
import G2.Liquid.Types
import G2.Liquid.Inference.Config
import G2.Liquid.Inference.Verify

import Language.Haskell.Liquid.Types as LH hiding (measures)
import qualified Language.Fixpoint.Types.Config as FP

import qualified Data.Text as T

initStateAndConfig :: ExtractedG2 -> Maybe T.Text -> G2.Config -> LHConfig -> InferenceConfig -> [GhcInfo]
                   -> (LiquidReadyState, G2.Config, LHConfig, InferenceConfig)
initStateAndConfig exg2 main_mod g2config lhconfig infconfig ghci = 
    let
        simp_s = initSimpleState exg2
        (g2config', lhconfig', infconfig') = adjustConfig main_mod simp_s g2config lhconfig infconfig ghci

        lrs = createStateForInference simp_s main_mod g2config' lhconfig' ghci

        lh_s = lr_state lrs
        lhconfig'' = adjustConfigPostLH main_mod (measures lh_s) (tcvalues lh_s) (state lh_s) ghci lhconfig'
    in
    (lrs, g2config', lhconfig'', infconfig')

createStateForInference :: SimpleState -> Maybe T.Text -> G2.Config -> LHConfig -> [GhcInfo] -> LiquidReadyState
createStateForInference simp_s main_mod config lhconfig ghci =
    let
        (simp_s', ph_tyvars) = if add_tyvars lhconfig
                                then fmap Just $ addTyVarsEEnvTEnv simp_s
                                else (simp_s, Nothing)
        (s, b) = initStateFromSimpleState simp_s' main_mod True 
                    (\_ ng _ _ _ _ _ -> (Prim Undefined TyBottom, [], [], ng))
                    (E.higherOrderExprs . IT.expr_env)
                    config
    in
    createLiquidReadyState s b ghci ph_tyvars lhconfig

getGHCI :: InferenceConfig -> [FilePath] -> [FilePath] -> IO ([GhcInfo], LH.Config)
getGHCI infconfig proj fp = do
    lhconfig <- defLHConfig proj
    let lhconfig' = lhconfig { pruneUnsorted = True
                             -- Block qualifiers being auto-generated by LH
                             , maxParams = if keep_quals infconfig then maxParams lhconfig else 0
                             , eliminate = if keep_quals infconfig then eliminate lhconfig else FP.All
                             , higherorderqs = False
                             , scrapeImports = False
                             , scrapeInternals = False
                             , scrapeUsedImports = False }
    ghci <- ghcInfos Nothing lhconfig' fp
    return (ghci, lhconfig)