Skip to content

Commit b57b779

Browse files
committed
avoid double rebuilds for FOIs
With VSCode I get a WatchedFile notification immediately after of the TextDocumentDidChange notification, triggering a second rebuild unnecessarily
1 parent 9d01c13 commit b57b779

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

ghcide/src/Development/IDE/Core/OfInterest.hs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
-- open in the editor. The rule is 'IsFileOfInterest'
99
module Development.IDE.Core.OfInterest(
1010
ofInterestRules,
11+
getFilesOfInterest,
1112
getFilesOfInterestUntracked,
1213
addFileOfInterest,
1314
deleteFileOfInterest,
@@ -58,6 +59,11 @@ ofInterestRules = do
5859
------------------------------------------------------------
5960
-- Exposed API
6061

62+
getFilesOfInterest :: IdeState -> IO( HashMap NormalizedFilePath FileOfInterestStatus)
63+
getFilesOfInterest state = do
64+
OfInterestVar var <- getIdeGlobalState state
65+
readVar var
66+
6167
-- | Set the files-of-interest - not usually necessary or advisable.
6268
-- The LSP client will keep this information up to date.
6369
setFilesOfInterest :: IdeState -> HashMap NormalizedFilePath FileOfInterestStatus -> IO ()
@@ -107,4 +113,4 @@ kick = do
107113

108114
-- if idle, perform garbage collection
109115
liftIO $ sleep 5
110-
garbageCollectDirtyKeys
116+
-- garbageCollectDirtyKeys

ghcide/src/Development/IDE/LSP/Notifications.hs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import qualified Data.HashSet as S
2626
import qualified Data.Text as Text
2727

2828
import Control.Monad.IO.Class
29+
import qualified Data.HashMap.Strict as HM
2930
import Development.IDE.Core.FileExists (modifyFileExists,
3031
watchedGlobs)
3132
import Development.IDE.Core.FileStore (registerFileWatches,
@@ -84,8 +85,15 @@ descriptor plId = (defaultPluginDescriptor plId) { pluginNotificationHandlers =
8485
-- what we do with them
8586
let msg = show fileEvents
8687
logDebug (ideLogger ide) $ "Watched file events: " <> Text.pack msg
87-
modifyFileExists ide fileEvents
88-
resetFileStore ide fileEvents
88+
-- filter out files of interest, since we already know all about those
89+
filesOfInterest <- getFilesOfInterest ide
90+
let fileEvents' =
91+
[ f | f@(FileEvent uri _) <- fileEvents
92+
, Just fp <- [uriToFilePath uri]
93+
, not $ HM.member (toNormalizedFilePath fp) filesOfInterest
94+
]
95+
modifyFileExists ide fileEvents'
96+
resetFileStore ide fileEvents'
8997
setSomethingModified ide [] msg
9098

9199
, mkPluginNotificationHandler LSP.SWorkspaceDidChangeWorkspaceFolders $

0 commit comments

Comments
 (0)