@@ -22,7 +22,8 @@ module Test.Hls
2222 waitForAllProgressDone ,
2323 PluginDescriptor ,
2424 IdeState ,
25- )
25+ waitForBuildQueue
26+ )
2627where
2728
2829import Control.Applicative.Combinators
@@ -31,6 +32,7 @@ import Control.Concurrent.Extra
3132import Control.Exception.Base
3233import Control.Monad (unless )
3334import Control.Monad.IO.Class
35+ import Data.Aeson (Value (Null ), toJSON )
3436import Data.ByteString.Lazy (ByteString )
3537import Data.Default (def )
3638import qualified Data.Text as T
@@ -42,6 +44,7 @@ import Development.IDE.Graph (ShakeOptions (shakeThreads))
4244import Development.IDE.Main
4345import qualified Development.IDE.Main as Ghcide
4446import qualified Development.IDE.Plugin.HLS.GhcIde as Ghcide
47+ import Development.IDE.Plugin.Test (TestRequest (WaitForShakeQueue ))
4548import Development.IDE.Types.Options
4649import GHC.IO.Handle
4750import Ide.Plugin.Config (Config , formattingProvider )
@@ -208,3 +211,14 @@ waitForAllProgressDone = loop
208211 _ -> Nothing
209212 done <- null <$> getIncompleteProgressSessions
210213 unless done loop
214+
215+ -- | Wait for the build queue to be empty
216+ waitForBuildQueue :: Session Seconds
217+ waitForBuildQueue = do
218+ let m = SCustomMethod " test"
219+ waitId <- sendRequest m (toJSON WaitForShakeQueue )
220+ (td, resp) <- duration $ skipManyTill anyMessage $ responseForId m waitId
221+ case resp of
222+ ResponseMessage {_result= Right Null } -> return td
223+ -- assume a ghcide binary lacking the WaitForShakeQueue method
224+ _ -> return 0
0 commit comments