ghcide-2.4.0.0: The core of an IDE
Safe HaskellSafe-Inferred
LanguageHaskell2010

Development.IDE.Session

Description

The logic for setting up a ghcide session by tapping into hie-bios.

Synopsis

Documentation

data SessionLoadingOptions #

Constructors

SessionLoadingOptions 

Fields

  • findCradle :: FilePath -> IO (Maybe FilePath)
     
  • loadCradle :: Maybe FilePath -> FilePath -> IO (Cradle Void)

    Load the cradle with an optional 'hie.yaml' location. If a 'hie.yaml' is given, use it to load the cradle. Otherwise, use the provided project root directory to determine the cradle type.

  • getCacheDirs :: String -> [String] -> IO CacheDirs

    Given the project name and a set of command line flags, return the path for storing generated GHC artifacts, or Nothing to respect the cradle setting

  • getInitialGhcLibDir :: Recorder (WithPriority Log) -> FilePath -> IO (Maybe LibDir)

    Return the GHC lib dir to use for the unsafeGlobalDynFlags

Instances

Instances details
Default SessionLoadingOptions # 
Instance details

Defined in Development.IDE.Session

data CacheDirs #

Constructors

CacheDirs 

Fields

loadSession :: Recorder (WithPriority Log) -> FilePath -> IO (Action IdeGhcSession) #

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 :: Recorder (WithPriority Log) -> FilePath -> SessionLoadingOptions -> IO (Maybe LibDir) #

Sets unsafeGlobalDynFlags on using the hie-bios cradle and returns the GHC libdir

getHieDbLoc :: FilePath -> IO FilePath #

runWithDb :: Recorder (WithPriority Log) -> FilePath -> (WithHieDb -> IndexQueue -> IO ()) -> IO () #

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

retryOnException #

Arguments

:: (MonadIO m, MonadCatch m, RandomGen g, Exception e) 
=> (e -> Maybe e)

only retry on exception if this predicate returns Just

-> Recorder (WithPriority Log) 
-> 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.