@@ -36,6 +36,7 @@ import Development.IDE.Import.FindImports
36import Development.IDE.Core.FileStore
36import Development.IDE.Core.FileStore
37import Development.IDE.Types.Diagnostics
37import Development.IDE.Types.Diagnostics
38import Development.IDE.Types.Location
38import Development.IDE.Types.Location
39+import Development.IDE.GHC.Util
39import Data.Coerce
40import Data.Coerce
40import Data.Either.Extra
41import Data.Either.Extra
41import Data.Maybe
42import Data.Maybe
@@ -54,10 +55,12 @@ import Development.IDE.GHC.Compat
54import UniqSupply
55import UniqSupply
55import NameCache
56import NameCache
56import HscTypes
57import HscTypes
58+import GHC.Generics(Generic)
58import qualified Development.IDE.Spans.AtPoint as AtPoint
60import qualified Development.IDE.Spans.AtPoint as AtPoint
59import Development.IDE.Core.Service
61import Development.IDE.Core.Service
60import Development.IDE.Core.Shake
62import Development.IDE.Core.Shake
63+import Development.Shake.Classes
61import System.Directory
64import System.Directory
62import System.FilePath
65import System.FilePath
63import MkIface
66import MkIface
@@ -116,7 +119,7 @@ getAtPoint file pos = fmap join $ runMaybeT $ do
116getDefinition :: NormalizedFilePath -> Position -> Action (Maybe Location)
119getDefinition :: NormalizedFilePath -> Position -> Action (Maybe Location)
117getDefinition file pos = fmap join $ runMaybeT $ do
120getDefinition file pos = fmap join $ runMaybeT $ do
118 spans <- useE GetSpanInfo file
121 spans <- useE GetSpanInfo file
119− pkgState <- useNoFileE GhcSession
122+ pkgState <- hscEnv <$> useE GhcSession file
120 opts <- lift getIdeOptions
123 opts <- lift getIdeOptions
121 let getHieFile x = useNoFile (GetHieFile x)
124 let getHieFile x = useNoFile (GetHieFile x)
122 lift $ AtPoint.gotoDefinition getHieFile opts pkgState spans pos
125 lift $ AtPoint.gotoDefinition getHieFile opts pkgState spans pos
@@ -131,8 +134,9 @@ writeIfacesAndHie ::
131writeIfacesAndHie ifDir files =
134writeIfacesAndHie ifDir files =
132 runMaybeT $ do
135 runMaybeT $ do
133 tcms <- usesE TypeCheck files
136 tcms <- usesE TypeCheck files
137+ fmap concat $ forM (zip files tcms) $ \(file, tcm) -> do
134− session <- lift $ useNoFile_ GhcSession
138+ session <- lift $ hscEnv <$> use_ GhcSession file
135− liftIO $ concat <$> mapM (writeTcm session) tcms
139+ liftIO $ writeTcm session tcm
137 writeTcm session tcm =
141 writeTcm session tcm =
@@ -174,7 +178,7 @@ getParsedModuleRule :: Rules ()
174getParsedModuleRule =
178getParsedModuleRule =
175 define $ \GetParsedModule file -> do
179 define $ \GetParsedModule file -> do
176 (_, contents) <- getFileContents file
180 (_, contents) <- getFileContents file
177− packageState <- useNoFile_ GhcSession
181+ packageState <- hscEnv <$> use_ GhcSession file
178 opt <- getIdeOptions
182 opt <- getIdeOptions
179 liftIO $ parseModule opt packageState (fromNormalizedFilePath file) contents
183 liftIO $ parseModule opt packageState (fromNormalizedFilePath file) contents
@@ -184,7 +188,7 @@ getLocatedImportsRule =
184 pm <- use_ GetParsedModule file
188 pm <- use_ GetParsedModule file
185 let ms = pm_mod_summary pm
189 let ms = pm_mod_summary pm
186 let imports = [(False, imp) | imp <- ms_textual_imps ms] ++ [(True, imp) | imp <- ms_srcimps ms]
190 let imports = [(False, imp) | imp <- ms_textual_imps ms] ++ [(True, imp) | imp <- ms_srcimps ms]
187− env <- useNoFile_ GhcSession
191+ env <- hscEnv <$> useNoFile_ GhcSession
188 let dflags = addRelativeImport pm $ hsc_dflags env
192 let dflags = addRelativeImport pm $ hsc_dflags env
189 opt <- getIdeOptions
193 opt <- getIdeOptions
190 (diags, imports') <- fmap unzip $ forM imports $ \(isSource, (mbPkgName, modName)) -> do
194 (diags, imports') <- fmap unzip $ forM imports $ \(isSource, (mbPkgName, modName)) -> do
@@ -295,7 +299,7 @@ getSpanInfoRule =
295 define $ \GetSpanInfo file -> do
299 define $ \GetSpanInfo file -> do
296 tc <- use_ TypeCheck file
300 tc <- use_ TypeCheck file
297 (fileImports, _) <- use_ GetLocatedImports file
301 (fileImports, _) <- use_ GetLocatedImports file
298− packageState <- useNoFile_ GhcSession
302+ packageState <- hscEnv <$> use_ GhcSession file
299 x <- liftIO $ getSrcSpanInfos packageState fileImports tc
303 x <- liftIO $ getSrcSpanInfos packageState fileImports tc
300 return ([], Just x)
304 return ([], Just x)
@@ -307,7 +311,7 @@ typeCheckRule =
307 deps <- use_ GetDependencies file
311 deps <- use_ GetDependencies file
308 tms <- uses_ TypeCheck (transitiveModuleDeps deps)
312 tms <- uses_ TypeCheck (transitiveModuleDeps deps)
309 setPriority priorityTypeCheck
313 setPriority priorityTypeCheck
310− packageState <- useNoFile_ GhcSession
314+ packageState <- hscEnv <$> use_ GhcSession file
311 liftIO $ typecheckModule packageState tms pm
315 liftIO $ typecheckModule packageState tms pm
@@ -317,14 +321,33 @@ generateCoreRule =
317 deps <- use_ GetDependencies file
321 deps <- use_ GetDependencies file
318 (tm:tms) <- uses_ TypeCheck (file:transitiveModuleDeps deps)
322 (tm:tms) <- uses_ TypeCheck (file:transitiveModuleDeps deps)
319 setPriority priorityGenerateCore
323 setPriority priorityGenerateCore
320− packageState <- useNoFile_ GhcSession
324+ packageState <- hscEnv <$> use_ GhcSession file
321 liftIO $ compileModule packageState tms tm
325 liftIO $ compileModule packageState tms tm
328+-- A local rule type to get caching. We want to use newCache, but it has
329+-- thread killed exception issues, so we lift it to a full rule.
330+-- https://github.com/digital-asset/daml/pull/2808#issuecomment-529639547
331+type instance RuleResult GhcSessionIO = GhcSessionFun
333+data GhcSessionIO = GhcSessionIO deriving (Eq, Show, Typeable, Generic)
334+instance Hashable GhcSessionIO
335+instance NFData GhcSessionIO
337+newtype GhcSessionFun = GhcSessionFun (FilePath -> Action HscEnvEq)
338+instance Show GhcSessionFun where show _ = "GhcSessionFun"
339+instance NFData GhcSessionFun where rnf !_ = ()
323loadGhcSession :: Rules ()
342loadGhcSession :: Rules ()
324−loadGhcSession =
343+loadGhcSession = do
325− defineNoFile $ \GhcSession -> do
344+ defineNoFile $ \GhcSessionIO -> do
326 opts <- getIdeOptions
345 opts <- getIdeOptions
327− optGhcSession opts
346+ liftIO $ GhcSessionFun <$> optGhcSession opts
347+ define $ \GhcSession file -> do
348+ GhcSessionFun fun <- useNoFile_ GhcSessionIO
349+ val <- fun $ fromNormalizedFilePath file
350+ return ([], Just val)
330getHieFileRule :: Rules ()
353getHieFileRule :: Rules ()