@@ -9,50 +9,51 @@ module Development.IDE.Plugin.HLS
99 , Log (.. )
1010 ) where
1111
12- import Control.Exception (SomeException )
13- import Control.Lens ((^.) )
12+ import Control.Exception (SomeException )
13+ import Control.Lens ((^.) )
1414import Control.Monad
15- import qualified Control.Monad.Extra as Extra
16- import Control.Monad.IO.Class (MonadIO )
17- import Control.Monad.Trans.Except (runExceptT )
18- import qualified Data.Aeson as A
19- import Data.Bifunctor (first )
20- import Data.Dependent.Map (DMap )
21- import qualified Data.Dependent.Map as DMap
15+ import qualified Control.Monad.Extra as Extra
16+ import Control.Monad.IO.Class (MonadIO )
17+ import Control.Monad.Trans.Except (runExceptT )
18+ import qualified Data.Aeson as A
19+ import Data.Bifunctor (first )
20+ import Data.Dependent.Map (DMap )
21+ import qualified Data.Dependent.Map as DMap
2222import Data.Dependent.Sum
2323import Data.Either
24- import qualified Data.List as List
25- import Data.List.NonEmpty (NonEmpty , nonEmpty , toList )
26- import qualified Data.List.NonEmpty as NE
27- import qualified Data.Map as Map
28- import Data.Maybe (isNothing , mapMaybe )
24+ import qualified Data.List as List
25+ import Data.List.NonEmpty (NonEmpty , nonEmpty , toList )
26+ import qualified Data.List.NonEmpty as NE
27+ import qualified Data.Map as Map
28+ import Data.Maybe (isNothing , mapMaybe )
2929import Data.Some
3030import Data.String
31- import Data.Text (Text )
32- import qualified Data.Text as T
33- import Development.IDE.Core.Shake hiding (Log )
31+ import Data.Text (Text )
32+ import qualified Data.Text as T
33+ import Development.IDE.Core.PluginUtils (injectServerDiagnostics )
34+ import Development.IDE.Core.Shake hiding (Log )
3435import Development.IDE.Core.Tracing
35- import Development.IDE.Graph (Rules )
36+ import Development.IDE.Graph (Rules )
3637import Development.IDE.LSP.Server
3738import Development.IDE.Plugin
38- import qualified Development.IDE.Plugin as P
39+ import qualified Development.IDE.Plugin as P
3940import Ide.Logger
4041import Ide.Plugin.Config
4142import Ide.Plugin.Error
4243import Ide.Plugin.HandleRequestTypes
43- import Ide.PluginUtils (getClientConfig )
44- import Ide.Types as HLS
45- import qualified Language.LSP.Protocol.Lens as JL
44+ import Ide.PluginUtils (getClientConfig )
45+ import Ide.Types as HLS
46+ import qualified Language.LSP.Protocol.Lens as JL
4647import Language.LSP.Protocol.Message
4748import Language.LSP.Protocol.Types
48- import qualified Language.LSP.Server as LSP
49+ import qualified Language.LSP.Server as LSP
4950import Language.LSP.VFS
50- import Prettyprinter.Render.String (renderString )
51- import Text.Regex.TDFA.Text ()
52- import UnliftIO (MonadUnliftIO , liftIO ,
53- readTVarIO )
54- import UnliftIO.Async (forConcurrently )
55- import UnliftIO.Exception (catchAny )
51+ import Prettyprinter.Render.String (renderString )
52+ import Text.Regex.TDFA.Text ()
53+ import UnliftIO (MonadUnliftIO , liftIO ,
54+ readTVarIO )
55+ import UnliftIO.Async (forConcurrently )
56+ import UnliftIO.Exception (catchAny )
5657
5758-- ---------------------------------------------------------------------
5859--
@@ -251,8 +252,9 @@ extensiblePlugins recorder plugins = mempty { P.pluginHandlers = handlers }
251252 PluginHandlers hs = HLS. pluginHandlers pluginDesc
252253 handlers = mconcat $ do
253254 (IdeMethod m :=> IdeHandler fs') <- DMap. assocs handlers'
254- pure $ requestHandler m $ \ ide params -> do
255+ pure $ requestHandler m $ \ ide params' -> do
255256 vfs <- readTVarIO $ vfsVar $ shakeExtras ide
257+ params <- liftIO $ preprocessMessageParams ide m params'
256258 config <- Ide.PluginUtils. getClientConfig
257259 -- Only run plugins that are allowed to run on this request, save the
258260 -- list of disabled plugins incase that's all we have
@@ -289,6 +291,18 @@ extensiblePlugins recorder plugins = mempty { P.pluginHandlers = handlers }
289291 Just xs -> do
290292 pure $ Right $ combineResponses m config caps params xs
291293
294+
295+ -- | Preprocess 'MessageParams' and insert custom data.
296+ --
297+ -- In issue https://github.com/haskell/haskell-language-server/issues/4056, we
298+ -- established that HLS should rely on server-side 'Diagnostic's to compute 'CodeAction's
299+ -- To ensure consistency, we intercept 'CodeAction's requests and explicitly inject
300+ -- server-side 'Diagnostic's before delegating to the 'PluginHandler'.
301+ preprocessMessageParams :: IdeState -> SMethod m -> MessageParams m -> IO (MessageParams m )
302+ preprocessMessageParams ide m params = case m of
303+ SMethod_TextDocumentCodeAction -> injectServerDiagnostics ide params
304+ _ -> pure params
305+
292306-- | Fallback Handler for resolve requests.
293307-- For all kinds of `*/resolve` requests, if they don't have a 'data_' value,
294308-- produce the original item, since no other plugin has any resolve data.
0 commit comments