Skip to content

Commit 768ae65

Browse files
authored
ignore null WatchedFile events (#2278)
1 parent 6c647d1 commit 768ae65

File tree

3 files changed

+17
-26
lines changed

3 files changed

+17
-26
lines changed

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,10 @@ getFileExistsMapUntracked = do
8888
liftIO $ readVar v
8989

9090
-- | Modify the global store of file exists.
91-
modifyFileExists :: IdeState -> [FileEvent] -> IO ()
91+
modifyFileExists :: IdeState -> [(NormalizedFilePath, FileChangeType)] -> IO ()
9292
modifyFileExists state changes = do
9393
FileExistsMapVar var <- getIdeGlobalState state
94-
changesMap <- evaluate $ HashMap.fromList $
95-
[ (toNormalizedFilePath' f, change)
96-
| FileEvent uri change <- changes
97-
, Just f <- [uriToFilePath uri]
98-
]
94+
changesMap <- evaluate $ HashMap.fromList changes
9995
-- Masked to ensure that the previous values are flushed together with the map update
10096
mask $ \_ -> do
10197
-- update the map

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

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,12 @@ import Control.Monad.Extra
3232
import Control.Monad.IO.Class
3333
import qualified Data.ByteString as BS
3434
import Data.Either.Extra
35-
import qualified Data.HashMap.Strict as HM
3635
import qualified Data.Map.Strict as Map
3736
import Data.Maybe
3837
import qualified Data.Rope.UTF16 as Rope
3938
import qualified Data.Text as T
4039
import Data.Time
4140
import Data.Time.Clock.POSIX
42-
import Development.IDE.Core.OfInterest (OfInterestVar (..))
4341
import Development.IDE.Core.RuleTypes
4442
import Development.IDE.Core.Shake
4543
import Development.IDE.GHC.Orphans ()
@@ -74,12 +72,9 @@ import Language.LSP.Server hiding
7472
import qualified Language.LSP.Server as LSP
7573
import Language.LSP.Types (DidChangeWatchedFilesRegistrationOptions (DidChangeWatchedFilesRegistrationOptions),
7674
FileChangeType (FcChanged),
77-
FileEvent (FileEvent),
7875
FileSystemWatcher (..),
7976
WatchKind (..),
80-
_watchers,
81-
toNormalizedFilePath,
82-
uriToFilePath)
77+
_watchers)
8378
import qualified Language.LSP.Types as LSP
8479
import qualified Language.LSP.Types.Capabilities as LSP
8580
import Language.LSP.VFS
@@ -170,18 +165,16 @@ resetInterfaceStore state f = do
170165
deleteValue state GetModificationTime f
171166

172167
-- | Reset the GetModificationTime state of watched files
173-
resetFileStore :: IdeState -> [FileEvent] -> IO ()
168+
-- Assumes the list does not include any FOIs
169+
resetFileStore :: IdeState -> [(NormalizedFilePath, FileChangeType)] -> IO ()
174170
resetFileStore ideState changes = mask $ \_ -> do
175171
-- we record FOIs document versions in all the stored values
176172
-- so NEVER reset FOIs to avoid losing their versions
177-
OfInterestVar foisVar <- getIdeGlobalExtras (shakeExtras ideState)
178-
fois <- readVar foisVar
179-
forM_ changes $ \(FileEvent uri c) -> do
173+
-- FOI filtering is done by the caller (LSP Notification handler)
174+
forM_ changes $ \(nfp, c) -> do
180175
case c of
181176
FcChanged
182-
| Just f <- uriToFilePath uri
183-
, nfp <- toNormalizedFilePath f
184-
, not $ HM.member nfp fois
177+
-- already checked elsewhere | not $ HM.member nfp fois
185178
-> deleteValue (shakeExtras ideState) GetModificationTime nfp
186179
_ -> pure ()
187180

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,17 @@ descriptor plId = (defaultPluginDescriptor plId) { pluginNotificationHandlers =
8787
-- filter also uris that do not map to filenames, since we cannot handle them
8888
filesOfInterest <- getFilesOfInterest ide
8989
let fileEvents' =
90-
[ f | f@(FileEvent uri _) <- fileEvents
90+
[ (nfp, event) | (FileEvent uri event) <- fileEvents
9191
, Just fp <- [uriToFilePath uri]
92-
, not $ HM.member (toNormalizedFilePath fp) filesOfInterest
92+
, let nfp = toNormalizedFilePath fp
93+
, not $ HM.member nfp filesOfInterest
9394
]
94-
let msg = show fileEvents'
95-
logDebug (ideLogger ide) $ "Watched file events: " <> Text.pack msg
96-
modifyFileExists ide fileEvents'
97-
resetFileStore ide fileEvents'
98-
setSomethingModified ide [] msg
95+
unless (null fileEvents') $ do
96+
let msg = show fileEvents'
97+
logDebug (ideLogger ide) $ "Watched file events: " <> Text.pack msg
98+
modifyFileExists ide fileEvents'
99+
resetFileStore ide fileEvents'
100+
setSomethingModified ide [] msg
99101

100102
, mkPluginNotificationHandler LSP.SWorkspaceDidChangeWorkspaceFolders $
101103
\ide _ (DidChangeWorkspaceFoldersParams events) -> liftIO $ do

0 commit comments

Comments
 (0)