{-# LANGUAGE CPP #-} {-# LANGUAGE LambdaCase #-} module Clash.GHCi.Common ( checkImportDirs , checkMonoLocalBinds , checkMonoLocalBindsMod ) where -- Clash import Clash.Driver.Types (ClashOpts (..)) -- The GHC interface #if MIN_VERSION_base(4,11,0) import qualified EnumSet as GHC (member) -- ghc84, ghc86 #else import qualified Data.IntSet as IntSet -- ghc82 #endif import qualified GHC (DynFlags, ModSummary (..), Module (..), extensionFlags, moduleNameString) import qualified GHC.LanguageExtensions as LangExt (Extension (..)) import Panic (GhcException (..), throwGhcException) import Control.Monad (forM_, unless, when) import System.Directory (doesDirectoryExist) import System.IO (hPutStrLn, stderr) -- | Checks whether MonoLocalBinds language extension is enabled or not in -- modules. checkMonoLocalBindsMod :: GHC.ModSummary -> IO () checkMonoLocalBindsMod x = unless (active . GHC.ms_hspp_opts $ x) (hPutStrLn stderr $ msg x) where msg = messageWith . GHC.moduleNameString . GHC.moduleName . GHC.ms_mod -- | Checks whether MonoLocalBinds language extension is enabled when generating -- the HDL directly e.g. in GHCi. modules. checkMonoLocalBinds :: GHC.DynFlags -> IO () checkMonoLocalBinds dflags = unless (active dflags) (hPutStrLn stderr $ messageWith "") messageWith :: String -> String messageWith srcModule | srcModule == [] = msgStem ++ "." | otherwise = msgStem ++ " in module: " ++ srcModule where msgStem = "Warning: Extension MonoLocalBinds disabled. This might lead to unexpected logic duplication" active :: GHC.DynFlags -> Bool #if MIN_VERSION_base(4,11,0) -- ghc84, ghc86 active = GHC.member LangExt.MonoLocalBinds . GHC.extensionFlags #else -- ghc82 active = member LangExt.MonoLocalBinds . GHC.extensionFlags member :: Enum a => a -> IntSet.IntSet -> Bool member = IntSet.member . fromEnum #endif checkImportDirs :: Foldable t => ClashOpts -> t FilePath -> IO () checkImportDirs opts idirs = when (opt_checkIDir opts) $ forM_ idirs $ \dir -> do doesDirectoryExist dir >>= \case False -> throwGhcException (CmdLineError $ "Missing directory: " ++ dir) _ -> return ()