@@ -13,10 +13,14 @@ module Development.IDE.Types.HscEnvEq
13
13
14
14
15
15
import Control.Concurrent.Async (Async , async , waitCatch )
16
+ import Control.Concurrent.MVar (newEmptyMVar , putMVar , readMVar )
17
+ import Control.Concurrent.STM (atomically )
18
+ import Control.Concurrent.STM.TQueue (unGetTQueue )
16
19
import Control.Concurrent.Strict (modifyVar , newVar )
17
20
import Control.DeepSeq (force )
18
21
import Control.Exception (evaluate , mask , throwIO )
19
22
import Control.Exception.Safe (tryAny )
23
+ import Control.Monad (unless )
20
24
import Control.Monad.Extra (eitherM , join , mapMaybeM , void )
21
25
import Data.Either (fromRight )
22
26
import Data.Foldable (traverse_ )
@@ -27,7 +31,7 @@ import qualified Data.Text as T
27
31
import Data.Unique (Unique )
28
32
import qualified Data.Unique as Unique
29
33
import Development.IDE.Core.Compile (HieDbModuleQuery (HieDbModuleQuery ), indexHieFile , loadHieFile )
30
- import Development.IDE.Core.Shake (ShakeExtras (ideNc , logger ), mkUpdater )
34
+ import Development.IDE.Core.Shake (HieDbWriter ( indexQueue ), ShakeExtras (hiedbWriter , ideNc , logger , lspEnv ), mkUpdater )
31
35
import Development.IDE.GHC.Compat
32
36
import qualified Development.IDE.GHC.Compat.Util as Maybes
33
37
import Development.IDE.GHC.Error (catchSrcErrors )
@@ -36,9 +40,10 @@ import Development.IDE.Graph.Classes
36
40
import Development.IDE.Types.Exports (ExportsMap , createExportsMap )
37
41
import Development.IDE.Types.Location (toNormalizedFilePath' )
38
42
import qualified Development.IDE.Types.Logger as Logger
39
- import HieDb (SourceFile (FakeFile ))
43
+ import HieDb (SourceFile (FakeFile ), removeDependencySrcFiles )
44
+ import Language.LSP.Server (resRootPath )
40
45
import OpenTelemetry.Eventlog (withSpan )
41
- import System.Directory (makeAbsolute )
46
+ import System.Directory (doesDirectoryExist , makeAbsolute )
42
47
import System.FilePath
43
48
44
49
-- | An 'HscEnv' with equality. Two values are considered equal
@@ -117,8 +122,22 @@ newHscEnvEqWithImportPaths envImportPaths se hscEnv deps = do
117
122
return HscEnvEq {.. }
118
123
where
119
124
indexDependencyHieFiles :: IO ()
120
- indexDependencyHieFiles = void
121
- $ Map. traverseWithKey indexPackageHieFiles packagesWithModules
125
+ indexDependencyHieFiles = do
126
+ dotHlsDirExists <- maybe (pure False ) doesDirectoryExist mHlsDir
127
+ unless dotHlsDirExists deleteMissingDependencySources
128
+ void $ Map. traverseWithKey indexPackageHieFiles packagesWithModules
129
+ mHlsDir :: Maybe FilePath
130
+ mHlsDir = do
131
+ projectDir <- resRootPath =<< lspEnv se
132
+ pure $ projectDir </> " .hls"
133
+ deleteMissingDependencySources :: IO ()
134
+ deleteMissingDependencySources = do
135
+ completionToken <- newEmptyMVar
136
+ atomically $ unGetTQueue (indexQueue $ hiedbWriter se) $
137
+ \ withHieDb -> withHieDb $ \ db -> do
138
+ removeDependencySrcFiles db
139
+ putMVar completionToken ()
140
+ readMVar completionToken
122
141
indexPackageHieFiles :: Package -> [Module ] -> IO ()
123
142
indexPackageHieFiles (Package package) modules = do
124
143
let pkgLibDir :: FilePath
0 commit comments