Use hie data type BiosOptions instead of ghc-mod Options

This commit is contained in:
Alan Zimmerman 2019-04-28 14:45:01 +02:00
parent fbd686086d
commit 1d4a52c123
6 changed files with 82 additions and 50 deletions

View File

@ -5,7 +5,6 @@ module Main where
import Control.Monad
import Data.Monoid ((<>))
import Data.Version (showVersion)
import qualified GhcMod.Types as GM
import Haskell.Ide.Engine.MonadFunctions
import Haskell.Ide.Engine.MonadTypes
import Haskell.Ide.Engine.Options
@ -121,13 +120,12 @@ run opts = do
d <- getCurrentDirectory
logm $ "Current directory:" ++ d
let vomitOptions = GM.defaultOptions { GM.optOutput = oo { GM.ooptLogLevel = GM.GmVomit}}
oo = GM.optOutput GM.defaultOptions
let defaultOpts = if optGhcModVomit opts then vomitOptions else GM.defaultOptions
let vomitOptions = defaultOptions { boLogging = BlVomit}
let defaultOpts = if optGhcModVomit opts then vomitOptions else defaultOptions
-- Running HIE on projects with -Werror breaks most of the features since all warnings
-- will be treated with the same severity of type errors. In order to offer a more useful
-- experience, we make sure warnings are always reported as warnings by setting -Wwarn
ghcModOptions = defaultOpts { GM.optGhcUserOptions = ["-Wwarn"] }
biosOptions = defaultOpts { boGhcUserOptions = ["-Wwarn"] }
when (optGhcModVomit opts) $
logm "Enabling --vomit for ghc-mod. Output will be on stderr"
@ -139,8 +137,8 @@ run opts = do
-- launch the dispatcher.
if optJson opts then do
scheduler <- newScheduler plugins' ghcModOptions
scheduler <- newScheduler plugins' biosOptions
jsonStdioTransport scheduler
else do
scheduler <- newScheduler plugins' ghcModOptions
scheduler <- newScheduler plugins' biosOptions
lspStdioTransport scheduler origDir plugins' (optCaptureFile opts)

View File

@ -28,10 +28,8 @@ setTypecheckedModule
module Haskell.Ide.Engine.PluginApi
(
-- ** Re-exported from ghc-mod
GM.Options(..)
, GM.defaultOptions
, GP.GmModuleGraph(..)
-- ** Re-exported from ghc-mod via ghc-project-types
GP.GmModuleGraph(..)
, GP.ModulePath(..)
, GP.GmComponent(..)
, GP.GmComponentType(..)
@ -60,21 +58,14 @@ module Haskell.Ide.Engine.PluginApi
, HIE.CachedInfo(..)
-- * used for tests in HaRe
, GM.globalArgSpec
, GM.OutputOpts(..)
, GM.GmLogLevel(..)
, GM.OutputStyle(..)
, GM.LineSeparator(..)
, HIE.BiosLogLevel(..)
, HIE.BiosOptions(..)
, HIE.defaultOptions
) where
import qualified GhcMod.Options.Options as GM (globalArgSpec)
-- import qualified GhcMod.Types as GM (ModulePath(..),GmModuleGraph(..),GmComponent(..),GmComponentType(..),OutputOpts(..),GmLogLevel(..),OutputStyle(..),LineSeparator(..))
import qualified GhcMod.Types as GM (OutputOpts(..),GmLogLevel(..),OutputStyle(..),LineSeparator(..))
import qualified GhcMod.Utils as GM (mkRevRedirMapFunc)
import qualified GhcModCore as GM (Options(..),defaultOptions)
import qualified GhcProject.Types as GP
import qualified GhcProject.Types as GP
import qualified Haskell.Ide.Engine.Ghc as HIE
import qualified Haskell.Ide.Engine.GhcModuleCache as HIE (CachedInfo(..),HasGhcModuleCache(..))
import qualified Haskell.Ide.Engine.GhcModuleCache as HIE (CachedInfo(..),HasGhcModuleCache(..))
import qualified Haskell.Ide.Engine.ModuleCache as HIE (ifCachedModule)
import qualified Haskell.Ide.Engine.PluginsIdeMonads as HIE
import qualified Language.Haskell.LSP.Types as LSP ( filePathToUri )

View File

@ -75,6 +75,11 @@ module Haskell.Ide.Engine.PluginsIdeMonads
, PublishDiagnosticsParams(..)
, List(..)
, FormattingOptions(..)
-- * Options
, BiosLogLevel(..)
, BiosOptions(..)
, defaultOptions
, mkGhcModOptions
)
where
@ -84,7 +89,7 @@ import Control.Monad.IO.Class
import Control.Monad.Reader
import Control.Monad.Trans.Free
import Data.Aeson
import Data.Aeson hiding (defaultOptions)
import qualified Data.ConstrainedDynamic as CD
import Data.Default
import qualified Data.List as List
@ -107,11 +112,10 @@ import qualified DynFlags as GHC
import qualified GHC as GHC
import qualified HscTypes as GHC
import Haskell.Ide.Engine.Compat
import Haskell.Ide.Engine.Config
import Haskell.Ide.Engine.MultiThreadState
import Haskell.Ide.Engine.GhcModuleCache
import Haskell.Ide.Engine.MultiThreadState
import qualified Language.Haskell.LSP.Core as Core
import Language.Haskell.LSP.Types.Capabilities
@ -319,23 +323,24 @@ getDiagnosticProvidersConfig c = Map.fromList [("applyrefact",hlintOn c)
type IdeGhcM = GM.GhcModT IdeM
-- | Run an IdeGhcM with Cradle found from the current directory
runIdeGhcM :: GM.Options -> IdePlugins -> Maybe (Core.LspFuncs Config) -> TVar IdeState -> IdeGhcM a -> IO a
runIdeGhcM ghcModOptions plugins mlf stateVar f = do
runIdeGhcM :: BiosOptions -> IdePlugins -> Maybe (Core.LspFuncs Config) -> TVar IdeState -> IdeGhcM a -> IO a
runIdeGhcM biosOptions plugins mlf stateVar f = do
env <- IdeEnv <$> pure mlf <*> getProcessID <*> pure plugins
let ghcModOptions = mkGhcModOptions biosOptions
(eres, _) <- flip runReaderT stateVar $ flip runReaderT env $ GM.runGhcModT ghcModOptions f
case eres of
Left err -> liftIO $ throwIO err
Right res -> return res
-- | Run an IdeGhcM in an external context (e.g. HaRe), with no plugins or LSP functions
runIdeGhcMBare :: GM.Options -> IdeGhcM a -> IO a
runIdeGhcMBare ghcModOptions f = do
runIdeGhcMBare :: BiosOptions -> IdeGhcM a -> IO a
runIdeGhcMBare biosOptions f = do
let
plugins = IdePlugins Map.empty
mlf = Nothing
initialState = IdeState emptyModuleCache Map.empty Map.empty Nothing
stateVar <- newTVarIO initialState
runIdeGhcM ghcModOptions plugins mlf stateVar f
runIdeGhcM biosOptions plugins mlf stateVar f
-- | A computation that is deferred until the module is cached.
-- Note that the module may not typecheck, in which case 'UriCacheFailed' is passed
@ -536,3 +541,45 @@ data IdeError = IdeError
instance ToJSON IdeError
instance FromJSON IdeError
-- ---------------------------------------------------------------------
-- Probably need to move this some time, but hitting import cycle issues
data BiosLogLevel =
BlError
| BlWarning
| BlInfo
| BlDebug
| BlVomit
deriving (Eq, Ord, Enum, Bounded, Show, Read)
data BiosOptions = BiosOptions {
boGhcUserOptions :: [String]
, boLogging :: BiosLogLevel
} deriving Show
defaultOptions :: BiosOptions
defaultOptions = BiosOptions {
boGhcUserOptions = []
, boLogging = BlWarning
}
fmBiosLog :: BiosLogLevel -> GM.GmLogLevel
fmBiosLog bl = case bl of
BlError -> GM.GmError
BlWarning -> GM.GmWarning
BlInfo -> GM.GmInfo
BlDebug -> GM.GmDebug
BlVomit -> GM.GmVomit
-- ---------------------------------------------------------------------
-- | Apply BiosOptions to default ghc-mod Options
mkGhcModOptions :: BiosOptions -> GM.Options
mkGhcModOptions bo = GM.defaultOptions
{
GM.optGhcUserOptions = boGhcUserOptions bo
, GM.optOutput = (GM.optOutput GM.defaultOptions) { GM.ooptLogLevel = fmBiosLog (boLogging bo) }
}
-- ---------------------------------------------------------------------

View File

@ -41,7 +41,7 @@ import qualified GhcMod.Gap as GM
import qualified GhcMod.SrcUtils as GM
import qualified GhcMod.Types as GM
import Haskell.Ide.Engine.Ghc
import Haskell.Ide.Engine.MonadTypes
import Haskell.Ide.Engine.MonadTypes hiding (defaultOptions)
import Haskell.Ide.Engine.PluginUtils
import qualified Haskell.Ide.Engine.Support.HieExtras as Hie
import Haskell.Ide.Engine.ArtifactMap

View File

@ -60,8 +60,8 @@ data Scheduler m = Scheduler
{ plugins :: IdePlugins
-- ^ The list of plugins that will be used for responding to requests
, ghcModOptions :: GM.Options
-- ^ Options for the ghc-mod session. Since we only keep a single ghc-mod session
, biosOptions :: BiosOptions
-- ^ Options for the bios session. Since we only keep a single bios session
-- at a time, this cannot be changed a runtime.
, requestsToCancel :: STM.TVar (Set.Set J.LspId)
@ -99,10 +99,10 @@ class HasScheduler a m where
newScheduler
:: IdePlugins
-- ^ The list of plugins that will be used for responding to requests
-> GM.Options
-> BiosOptions
-- ^ Options for the ghc-mod session. Since we only keep a single ghc-mod session
-> IO (Scheduler m)
newScheduler plugins ghcModOptions = do
newScheduler plugins biosOpts = do
cancelTVar <- STM.atomically $ STM.newTVar Set.empty
wipTVar <- STM.atomically $ STM.newTVar Set.empty
versionTVar <- STM.atomically $ STM.newTVar Map.empty
@ -110,7 +110,7 @@ newScheduler plugins ghcModOptions = do
ghcChan <- Channel.newChan
return $ Scheduler
{ plugins = plugins
, ghcModOptions = ghcModOptions
, biosOptions = biosOpts
, requestsToCancel = cancelTVar
, requestsInProgress = wipTVar
, documentVersions = versionTVar
@ -152,7 +152,7 @@ runScheduler Scheduler {..} errorHandler callbackHandler mlf = do
stateVar <- STM.newTVarIO initialState
let runGhcDisp = runIdeGhcM ghcModOptions plugins mlf stateVar $
let runGhcDisp = runIdeGhcM biosOptions plugins mlf stateVar $
ghcDispatcher dEnv errorHandler callbackHandler ghcChanOut
runIdeDisp = runIdeM plugins mlf stateVar $
ideDispatcher dEnv errorHandler callbackHandler ideChanOut

View File

@ -25,8 +25,8 @@ import Data.Typeable
import Data.Yaml
import qualified Data.Map as Map
import Data.Maybe
import qualified GhcMod.Monad as GM
import qualified GhcMod.Types as GM
-- import qualified GhcMod.Monad as GM
-- import qualified GhcMod.Types as GM
import qualified Language.Haskell.LSP.Core as Core
import Haskell.Ide.Engine.MonadTypes
import System.Directory
@ -41,16 +41,12 @@ import Text.Blaze.Internal
-- ---------------------------------------------------------------------
testOptions :: GM.Options
testOptions = GM.defaultOptions {
GM.optOutput = GM.OutputOpts {
GM.ooptLogLevel = GM.GmError
-- GM.ooptLogLevel = GM.GmVomit
, GM.ooptStyle = GM.PlainStyle
, GM.ooptLineSeparator = GM.LineSeparator "\0"
, GM.ooptLinePrefix = Nothing
}
testOptions :: BiosOptions
testOptions = defaultOptions {
boLogging = BlError
-- boLoggingg = BlDebug
-- boLoggingg = BlVomit
-- , boGhcUserOptions = ["-v4", "-DDEBUG"]
}