Merge branch 'eqdynflags-2' of https://github.com/alanz/ghc-mod
This commit is contained in:
commit
3d9a339869
@ -103,6 +103,6 @@ deferErrors df = return $
|
||||
----------------------------------------------------------------
|
||||
|
||||
deriveEqDynFlags [d|
|
||||
eqDynFlags :: DynFlags -> DynFlags -> Bool
|
||||
eqDynFlags :: DynFlags -> DynFlags -> [[(Bool, String)]]
|
||||
eqDynFlags = undefined
|
||||
|]
|
||||
|
@ -15,17 +15,22 @@
|
||||
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
{-# LANGUAGE CPP, TemplateHaskell #-}
|
||||
{-# LANGUAGE StandaloneDeriving #-}
|
||||
{-# LANGUAGE DeriveDataTypeable #-}
|
||||
module GhcMod.DynFlagsTH where
|
||||
|
||||
import Language.Haskell.TH
|
||||
import Language.Haskell.TH.Syntax
|
||||
import Control.Applicative
|
||||
import qualified Data.IntSet as IS
|
||||
import Data.Maybe
|
||||
import Data.Generics.Aliases
|
||||
import Data.Generics.Schemes
|
||||
import DynFlags
|
||||
import Prelude
|
||||
|
||||
-- -------------------------------------
|
||||
|
||||
deriveEqDynFlags :: Q [Dec] -> Q [Dec]
|
||||
deriveEqDynFlags qds = do
|
||||
#if __GLASGOW_HASKELL__ <= 710
|
||||
@ -39,7 +44,7 @@ deriveEqDynFlags qds = do
|
||||
a <- newName "a"
|
||||
b <- newName "b"
|
||||
|
||||
e <- AppE (VarE 'and) . ListE <$> sequence (catMaybes $ map (eq a b) fs)
|
||||
e <- ListE <$> sequence (mapMaybe (eq a b) fs)
|
||||
|
||||
tysig@(SigD n _) :_ <- qds
|
||||
|
||||
@ -84,31 +89,40 @@ deriveEqDynFlags qds = do
|
||||
expr =
|
||||
case fon of
|
||||
"rtsOptsEnabled" -> do
|
||||
let eqfn = [| let fn RtsOptsNone RtsOptsNone = True
|
||||
fn RtsOptsSafeOnly RtsOptsSafeOnly = True
|
||||
fn RtsOptsAll RtsOptsAll = True
|
||||
fn _ _ = False
|
||||
let eqfn = [| let fn RtsOptsNone RtsOptsNone = [(True, "")]
|
||||
fn RtsOptsSafeOnly RtsOptsSafeOnly = [(True, "")]
|
||||
fn RtsOptsAll RtsOptsAll = [(True, "")]
|
||||
fn _ _ = [(False, "rtsOptsEnabled changed")]
|
||||
in fn
|
||||
|]
|
||||
[e| $(eqfn) $(return fa) $(return fb) |]
|
||||
|
||||
"extraPkgConfs" -> do
|
||||
let eqfn = [| let fn a' b' = and (zipWith eqpr (a' []) (b' []))
|
||||
&& length (a' []) == length (b' [])
|
||||
eqpr GlobalPkgConf GlobalPkgConf = True
|
||||
eqpr UserPkgConf UserPkgConf = True
|
||||
eqpr (PkgConfFile pa) (PkgConfFile pb) = pa == pb
|
||||
eqpr _ _ = False
|
||||
let eqfn = [| let fn a' b' = cond a' b'
|
||||
|
||||
cond a' b' = zz ++ ll
|
||||
where
|
||||
zz :: [(Bool,String)]
|
||||
zz = (zipWith eqpr (a' []) (b' []))
|
||||
|
||||
ll :: [(Bool,String)]
|
||||
ll = [( length (a' []) == length (b' [])
|
||||
, if length (a' []) == length (b' []) then "" else "extraPkgConfs length mismatch")]
|
||||
|
||||
eqpr GlobalPkgConf GlobalPkgConf = (True, "")
|
||||
eqpr UserPkgConf UserPkgConf = (True, "")
|
||||
eqpr (PkgConfFile pa) (PkgConfFile pb) = (pa == pb,if pa == pb then "" else "extraPkgConfs changed")
|
||||
eqpr _ _ = (False, "extraPkgConfs changed")
|
||||
in fn
|
||||
|]
|
||||
[e| $(eqfn) $(return fa) $(return fb) |]
|
||||
|
||||
#if __GLASGOW_HASKELL__ >= 710 && __GLASGOW_HASKELL__ < 800
|
||||
"sigOf" -> do
|
||||
let eqfn = [| let fn NotSigOf NotSigOf = True
|
||||
fn (SigOf a') (SigOf b') = a' == b'
|
||||
fn (SigOfMap a') (SigOfMap b') = a' == b'
|
||||
fn _ _ = False
|
||||
let eqfn = [| let fn NotSigOf NotSigOf = [(True, "")]
|
||||
fn (SigOf a') (SigOf b') = [(a' == b', if a' == b' then "" else "sigOf changed")]
|
||||
fn (SigOfMap a') (SigOfMap b') = [(a' == b', if a' == b' then "" else "sigOfMap changed")]
|
||||
fn _ _ = [(False, "sigOf changed")]
|
||||
in fn
|
||||
|]
|
||||
[e| $(eqfn) $(return fa) $(return fb) |]
|
||||
@ -116,12 +130,12 @@ deriveEqDynFlags qds = do
|
||||
|
||||
#if __GLASGOW_HASKELL <= 706
|
||||
"profAuto" -> do
|
||||
let eqfn = [| let fn NoProfAuto NoProfAuto = True
|
||||
fn ProfAutoAll ProfAutoAll = True
|
||||
fn ProfAutoTop ProfAutoTop = True
|
||||
fn ProfAutoExports ProfAutoExports = True
|
||||
fn ProfAutoCalls ProfAutoCalls = True
|
||||
fn _ _ = False
|
||||
let eqfn = [| let fn NoProfAuto NoProfAuto = [(True, "")]
|
||||
fn ProfAutoAll ProfAutoAll = [(True, "")]
|
||||
fn ProfAutoTop ProfAutoTop = [(True, "")]
|
||||
fn ProfAutoExports ProfAutoExports = [(True, "")]
|
||||
fn ProfAutoCalls ProfAutoCalls = [(True, "")]
|
||||
fn _ _ = [(False, "profAuto changed")]
|
||||
in fn
|
||||
|]
|
||||
[e| $(eqfn) $(return fa) $(return fb) |]
|
||||
@ -129,16 +143,38 @@ deriveEqDynFlags qds = do
|
||||
|
||||
#if __GLASGOW_HASKELL__ >= 706
|
||||
"language" -> do
|
||||
let eqfn = [| let fn (Just Haskell98) (Just Haskell98) = True
|
||||
fn (Just Haskell2010) (Just Haskell2010) = True
|
||||
fn Nothing Nothing = True
|
||||
fn _ _ = False
|
||||
let eqfn = [| let fn (Just Haskell98) (Just Haskell98) = [(True, "")]
|
||||
fn (Just Haskell2010) (Just Haskell2010) = [(True, "")]
|
||||
fn Nothing Nothing = [(True, "")]
|
||||
fn _ _ = [(False, "language changed")]
|
||||
in fn
|
||||
|]
|
||||
[e| $(eqfn) $(return fa) $(return fb) |]
|
||||
#endif
|
||||
|
||||
_ ->
|
||||
[e| $(return fa) == $(return fb) |]
|
||||
"outputFile" -> do
|
||||
let eqfn = [| let fn (Just f1) (Just f2) = [(f1 == f2, if f1 == f2 then "" else "outputFile changed")]
|
||||
fn _ _ = [(True, "")] -- anything with a Nothing is fine.
|
||||
in fn
|
||||
|]
|
||||
[e| $(eqfn) $(return fa) $(return fb) |]
|
||||
|
||||
-- expr' = [e| trace (if $(expr) == True then "" else show ($(litE $ StringL fon), $(expr))) $(expr) |]
|
||||
"generalFlags" -> checkIntSet "generalFlags"
|
||||
|
||||
"warningFlags" -> checkIntSet "warningFlags"
|
||||
|
||||
_ ->
|
||||
[e| [($(return fa) == $(return fb), if $(return fa) == $(return fb) then "" else ("default changed:" ++ fon) )] |]
|
||||
|
||||
checkIntSet fieldName = do
|
||||
let eqfn = [| let fn aa bb = r
|
||||
where
|
||||
uni = IS.union aa bb
|
||||
dif = IS.intersection aa bb
|
||||
delta = IS.difference uni dif
|
||||
r = if delta == IS.empty
|
||||
then [(True, "")]
|
||||
else [(False, fieldName ++ ":delta=" ++ (show delta) )]
|
||||
in fn
|
||||
|]
|
||||
[e| $(eqfn) $(return fa) $(return fb) |]
|
||||
|
@ -85,8 +85,13 @@ initSession opts mdf = do
|
||||
|
||||
df <- liftIO $ hsc_dflags <$> readIORef hsc_env_ref
|
||||
changed <-
|
||||
withLightHscEnv' (initDF crdl) $ \hsc_env ->
|
||||
return $ not $ hsc_dflags hsc_env `eqDynFlags` df
|
||||
withLightHscEnv' (initDF crdl) $ \hsc_env -> do
|
||||
gmLog GmDebug "initSession" $ text $ "outputFiles:" ++ show (outputFile $ hsc_dflags hsc_env, outputFile df)
|
||||
let dfEq = concat $ hsc_dflags hsc_env `eqDynFlags` df
|
||||
gmLog GmDebug "initSession" $ text $ "dfEq=" ++ (show $ filter (\t -> not (fst t)) dfEq)
|
||||
let eq = and $ map fst dfEq
|
||||
-- return $ not $ hsc_dflags hsc_env `eqDynFlags` df
|
||||
return $ not eq
|
||||
|
||||
if changed
|
||||
then do
|
||||
|
Loading…
Reference in New Issue
Block a user