Safe Haskell | None |
---|---|
Language | Haskell2010 |
The logic for setting up a ghcide session by tapping into hie-bios.
Synopsis
- data SessionLoadingOptions = SessionLoadingOptions {}
- data CacheDirs = CacheDirs {}
- loadSession :: FilePath -> IO (Action IdeGhcSession)
- loadSessionWithOptions :: SessionLoadingOptions -> FilePath -> IO (Action IdeGhcSession)
- setInitialDynFlags :: Logger -> FilePath -> SessionLoadingOptions -> IO (Maybe LibDir)
- getHieDbLoc :: FilePath -> IO FilePath
- runWithDb :: Logger -> FilePath -> (WithHieDb -> IndexQueue -> IO ()) -> IO ()
- retryOnSqliteBusy :: (MonadIO m, MonadCatch m, RandomGen g) => Logger -> g -> m a -> m a
- retryOnException :: (MonadIO m, MonadCatch m, RandomGen g, Exception e) => (e -> Maybe e) -> Logger -> Int -> Int -> Int -> g -> m a -> m a
Documentation
data SessionLoadingOptions Source #
SessionLoadingOptions | |
|
Instances
Default SessionLoadingOptions Source # | |
Defined in Development.IDE.Session |
loadSession :: FilePath -> IO (Action IdeGhcSession) Source #
Given a root directory, return a Shake Action
which setups an
IdeGhcSession
given a file.
Some of the many things this does:
- Find the cradle for the file
- Get the session options,
- Get the GHC lib directory
- Make sure the GHC compiletime and runtime versions match
- Restart the Shake session
This is the key function which implements multi-component support. All components mapping to the same hie.yaml file are mapped to the same HscEnv which is updated as new components are discovered.
setInitialDynFlags :: Logger -> FilePath -> SessionLoadingOptions -> IO (Maybe LibDir) Source #
Sets unsafeGlobalDynFlags
on using the hie-bios cradle and returns the GHC libdir
runWithDb :: Logger -> FilePath -> (WithHieDb -> IndexQueue -> IO ()) -> IO () Source #
Wraps withHieDb
to provide a database connection for reading, and a HieWriterChan
for
writing. Actions are picked off one by one from the HieWriterChan
and executed in serial
by a worker thread using a dedicated database connection.
This is done in order to serialize writes to the database, or else SQLite becomes unhappy
retryOnSqliteBusy :: (MonadIO m, MonadCatch m, RandomGen g) => Logger -> g -> m a -> m a Source #
:: (MonadIO m, MonadCatch m, RandomGen g, Exception e) | |
=> (e -> Maybe e) | only retry on exception if this predicate returns Just |
-> Logger | |
-> Int | maximum backoff delay in microseconds |
-> Int | base backoff delay in microseconds |
-> Int | maximum number of times to retry |
-> g | random number generator |
-> m a | action that may throw exception |
-> m a |
If the action throws exception that satisfies predicate then we sleep for
a duration determined by the random exponential backoff formula,
`uniformRandom(0, min (maxDelay, (baseDelay * 2) ^ retryAttempt))`, and try
the action again for a maximum of maxRetryCount
times.
MonadIO
, MonadCatch
are used as constraints because there are a few
HieDb functions that don't return IO values.