Skip to content

Commit 955d966

Browse files
committed
Emit LSP custom messages on kick start/finish
useful to synchonize on these events in tests
1 parent 612c86b commit 955d966

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import Development.IDE.Graph
2727

2828
import Control.Concurrent.STM.Stats (atomically,
2929
modifyTVar')
30+
import Data.Aeson (toJSON)
3031
import qualified Data.ByteString as BS
3132
import Data.Maybe (catMaybes)
3233
import Development.IDE.Core.ProgressReporting
@@ -36,6 +37,9 @@ import Development.IDE.Plugin.Completions.Types
3637
import Development.IDE.Types.Exports
3738
import Development.IDE.Types.Location
3839
import Development.IDE.Types.Logger
40+
import Development.IDE.Types.Options (IdeTesting (..))
41+
import qualified Language.LSP.Server as LSP
42+
import qualified Language.LSP.Types as LSP
3943

4044
newtype OfInterestVar = OfInterestVar (Var (HashMap NormalizedFilePath FileOfInterestStatus))
4145
instance IsIdeGlobal OfInterestVar
@@ -110,7 +114,13 @@ scheduleGarbageCollection state = do
110114
kick :: Action ()
111115
kick = do
112116
files <- HashMap.keys <$> getFilesOfInterestUntracked
113-
ShakeExtras{exportsMap, progress} <- getShakeExtras
117+
ShakeExtras{exportsMap, ideTesting = IdeTesting testing, lspEnv, progress} <- getShakeExtras
118+
let signal msg = when testing $ liftIO $
119+
mRunLspT lspEnv $
120+
LSP.sendNotification (LSP.SCustomMethod msg) $
121+
toJSON $ map fromNormalizedFilePath files
122+
123+
signal "kick/start"
114124
liftIO $ progressUpdate progress KickStarted
115125

116126
-- Update the exports map
@@ -129,3 +139,5 @@ kick = do
129139
when garbageCollectionScheduled $ do
130140
void garbageCollectDirtyKeys
131141
liftIO $ writeVar var False
142+
143+
signal "kick/done"

hls-test-utils/src/Test/Hls.hs

+27-3
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,21 @@ module Test.Hls
2828
waitForTypecheck,
2929
waitForAction,
3030
sendConfigurationChanged,
31-
getLastBuildKeys)
31+
getLastBuildKeys,
32+
waitForKickDone,
33+
waitForKickStart,
34+
)
3235
where
3336

3437
import Control.Applicative.Combinators
3538
import Control.Concurrent.Async (async, cancel, wait)
3639
import Control.Concurrent.Extra
3740
import Control.Exception.Base
38-
import Control.Monad (unless, void)
41+
import Control.Monad (guard, unless, void)
3942
import Control.Monad.IO.Class
40-
import Data.Aeson (Value (Null), toJSON)
43+
import Data.Aeson (Result (Success),
44+
Value (Null), fromJSON,
45+
toJSON)
4146
import qualified Data.Aeson as A
4247
import Data.ByteString.Lazy (ByteString)
4348
import Data.Default (def)
@@ -247,3 +252,22 @@ getLastBuildKeys = callTestPlugin GetBuildKeysBuilt
247252
sendConfigurationChanged :: Value -> Session ()
248253
sendConfigurationChanged config =
249254
sendNotification SWorkspaceDidChangeConfiguration (DidChangeConfigurationParams config)
255+
256+
waitForKickDone :: Session ()
257+
waitForKickDone = void $ skipManyTill anyMessage nonTrivialKickDone
258+
259+
waitForKickStart :: Session ()
260+
waitForKickStart = void $ skipManyTill anyMessage nonTrivialKickStart
261+
262+
nonTrivialKickDone :: Session ()
263+
nonTrivialKickDone = kick "done" >>= guard . not . null
264+
265+
nonTrivialKickStart :: Session ()
266+
nonTrivialKickStart = kick "start" >>= guard . not . null
267+
268+
kick :: T.Text -> Session [FilePath]
269+
kick msg = do
270+
NotMess NotificationMessage{_params} <- customNotification $ "kick/" <> msg
271+
case fromJSON _params of
272+
Success x -> return x
273+
other -> error $ "Failed to parse kick/done details: " <> show other

0 commit comments

Comments
 (0)