From 2542553018617a0ea40f766a1fda25edd4e6b44b Mon Sep 17 00:00:00 2001 From: Pepe Iborra Date: Sun, 10 Oct 2021 11:09:18 +0100 Subject: [PATCH] ignore null WatchedFile events --- ghcide/src/Development/IDE/Core/FileExists.hs | 8 ++------ ghcide/src/Development/IDE/Core/FileStore.hs | 19 ++++++------------- .../src/Development/IDE/LSP/Notifications.hs | 16 +++++++++------- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/ghcide/src/Development/IDE/Core/FileExists.hs b/ghcide/src/Development/IDE/Core/FileExists.hs index 80bdd84203..af9c402838 100644 --- a/ghcide/src/Development/IDE/Core/FileExists.hs +++ b/ghcide/src/Development/IDE/Core/FileExists.hs @@ -88,14 +88,10 @@ getFileExistsMapUntracked = do liftIO $ readVar v -- | Modify the global store of file exists. -modifyFileExists :: IdeState -> [FileEvent] -> IO () +modifyFileExists :: IdeState -> [(NormalizedFilePath, FileChangeType)] -> IO () modifyFileExists state changes = do FileExistsMapVar var <- getIdeGlobalState state - changesMap <- evaluate $ HashMap.fromList $ - [ (toNormalizedFilePath' f, change) - | FileEvent uri change <- changes - , Just f <- [uriToFilePath uri] - ] + changesMap <- evaluate $ HashMap.fromList changes -- Masked to ensure that the previous values are flushed together with the map update mask $ \_ -> do -- update the map diff --git a/ghcide/src/Development/IDE/Core/FileStore.hs b/ghcide/src/Development/IDE/Core/FileStore.hs index cf7034de27..2cc9d1c7f1 100644 --- a/ghcide/src/Development/IDE/Core/FileStore.hs +++ b/ghcide/src/Development/IDE/Core/FileStore.hs @@ -32,14 +32,12 @@ import Control.Monad.Extra import Control.Monad.IO.Class import qualified Data.ByteString as BS import Data.Either.Extra -import qualified Data.HashMap.Strict as HM import qualified Data.Map.Strict as Map import Data.Maybe import qualified Data.Rope.UTF16 as Rope import qualified Data.Text as T import Data.Time import Data.Time.Clock.POSIX -import Development.IDE.Core.OfInterest (OfInterestVar (..)) import Development.IDE.Core.RuleTypes import Development.IDE.Core.Shake import Development.IDE.GHC.Orphans () @@ -74,12 +72,9 @@ import Language.LSP.Server hiding import qualified Language.LSP.Server as LSP import Language.LSP.Types (DidChangeWatchedFilesRegistrationOptions (DidChangeWatchedFilesRegistrationOptions), FileChangeType (FcChanged), - FileEvent (FileEvent), FileSystemWatcher (..), WatchKind (..), - _watchers, - toNormalizedFilePath, - uriToFilePath) + _watchers) import qualified Language.LSP.Types as LSP import qualified Language.LSP.Types.Capabilities as LSP import Language.LSP.VFS @@ -170,18 +165,16 @@ resetInterfaceStore state f = do deleteValue state GetModificationTime f -- | Reset the GetModificationTime state of watched files -resetFileStore :: IdeState -> [FileEvent] -> IO () +-- Assumes the list does not include any FOIs +resetFileStore :: IdeState -> [(NormalizedFilePath, FileChangeType)] -> IO () resetFileStore ideState changes = mask $ \_ -> do -- we record FOIs document versions in all the stored values -- so NEVER reset FOIs to avoid losing their versions - OfInterestVar foisVar <- getIdeGlobalExtras (shakeExtras ideState) - fois <- readVar foisVar - forM_ changes $ \(FileEvent uri c) -> do + -- FOI filtering is done by the caller (LSP Notification handler) + forM_ changes $ \(nfp, c) -> do case c of FcChanged - | Just f <- uriToFilePath uri - , nfp <- toNormalizedFilePath f - , not $ HM.member nfp fois + -- already checked elsewhere | not $ HM.member nfp fois -> deleteValue (shakeExtras ideState) GetModificationTime nfp _ -> pure () diff --git a/ghcide/src/Development/IDE/LSP/Notifications.hs b/ghcide/src/Development/IDE/LSP/Notifications.hs index 4fb1d4fac4..b2901bf32c 100644 --- a/ghcide/src/Development/IDE/LSP/Notifications.hs +++ b/ghcide/src/Development/IDE/LSP/Notifications.hs @@ -87,15 +87,17 @@ descriptor plId = (defaultPluginDescriptor plId) { pluginNotificationHandlers = -- filter also uris that do not map to filenames, since we cannot handle them filesOfInterest <- getFilesOfInterest ide let fileEvents' = - [ f | f@(FileEvent uri _) <- fileEvents + [ (nfp, event) | (FileEvent uri event) <- fileEvents , Just fp <- [uriToFilePath uri] - , not $ HM.member (toNormalizedFilePath fp) filesOfInterest + , let nfp = toNormalizedFilePath fp + , not $ HM.member nfp filesOfInterest ] - let msg = show fileEvents' - logDebug (ideLogger ide) $ "Watched file events: " <> Text.pack msg - modifyFileExists ide fileEvents' - resetFileStore ide fileEvents' - setSomethingModified ide [] msg + unless (null fileEvents') $ do + let msg = show fileEvents' + logDebug (ideLogger ide) $ "Watched file events: " <> Text.pack msg + modifyFileExists ide fileEvents' + resetFileStore ide fileEvents' + setSomethingModified ide [] msg , mkPluginNotificationHandler LSP.SWorkspaceDidChangeWorkspaceFolders $ \ide _ (DidChangeWorkspaceFoldersParams events) -> liftIO $ do