@@ -55,6 +55,7 @@ import Data.Map.Strict (Map)
55import Data.Either.Extra
55import Data.Either.Extra
56import Data.List.Extra
56import Data.List.Extra
57import qualified Data.Text as T
57import qualified Data.Text as T
58import Development.IDE.Core.Debouncer
59import Development.IDE.Core.Debouncer
59import Development.IDE.Types.Logger hiding (Priority)
60import Development.IDE.Types.Logger hiding (Priority)
60import Language.Haskell.LSP.Diagnostics
61import Language.Haskell.LSP.Diagnostics
@@ -231,11 +232,47 @@ shakeOpen eventer logger opts rules = do
231 publishedDiagnostics <- newVar mempty
232 publishedDiagnostics <- newVar mempty
232 debouncer <- newDebouncer
233 debouncer <- newDebouncer
233 pure ShakeExtras{..}
234 pure ShakeExtras{..}
235+ (shakeDb, shakeClose) <-
234− (shakeDb, shakeClose) <- shakeOpenDatabase opts{shakeExtra = addShakeExtra shakeExtras $ shakeExtra opts} rules
238+ { shakeExtra = addShakeExtra shakeExtras $ shakeExtra opts
239+ , shakeProgress = lspShakeProgress eventer
235 shakeAbort <- newVar $ return ()
242 shakeAbort <- newVar $ return ()
236 shakeDb <- shakeDb
243 shakeDb <- shakeDb
237 return IdeState{..}
244 return IdeState{..}
246+lspShakeProgress :: (LSP.FromServerMessage -> IO ()) -> IO Progress -> IO ()
247+lspShakeProgress sendMsg prog = do
248+ u <- T.pack . show . hashUnique <$> newUnique
249+ bracket_ (start u) (stop u) (loop u)
251+ start id = sendMsg $ LSP.NotProgressStart $ LSP.fmServerProgressStartNotification
254+ , _title = "Processing"
255+ , _cancellable = Nothing
256+ , _message = Nothing
257+ , _percentage = Nothing
259+ stop id = sendMsg $ LSP.NotProgressDone $ LSP.fmServerProgressDoneNotification
264+ loop id = forever $ do
267+ let done = countSkipped p + countBuilt p
268+ let todo = done + countUnknown p + countTodo p
269+ sendMsg $ LSP.NotProgressReport $ LSP.fmServerProgressReportNotification
270+ ProgressReportParams
272+ , _message = Just $ T.pack $ show done <> "/" <> show todo
273+ , _percentage = Nothing
239shakeProfile :: IdeState -> FilePath -> IO ()
276shakeProfile :: IdeState -> FilePath -> IO ()
240shakeProfile IdeState{..} = shakeProfileDatabase shakeDb
277shakeProfile IdeState{..} = shakeProfileDatabase shakeDb