@@ -9,49 +9,50 @@ 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- import UnliftIO.Async (forConcurrently )
54- import UnliftIO.Exception (catchAny )
51+ import Prettyprinter.Render.String (renderString )
52+ import Text.Regex.TDFA.Text ()
53+ import UnliftIO (MonadUnliftIO , liftIO )
54+ import UnliftIO.Async (forConcurrently )
55+ import UnliftIO.Exception (catchAny )
5556
5657-- ---------------------------------------------------------------------
5758--
@@ -250,7 +251,14 @@ extensiblePlugins recorder plugins = mempty { P.pluginHandlers = handlers }
250251 PluginHandlers hs = HLS. pluginHandlers pluginDesc
251252 handlers = mconcat $ do
252253 (IdeMethod m :=> IdeHandler fs') <- DMap. assocs handlers'
253- pure $ requestHandler m $ \ ide params -> do
254+ pure $ requestHandler m $ \ ide params' -> do
255+ -- issue https://github.com/haskell/haskell-language-server/issues/4056
256+ -- established that HLS should rely on server-side diagnostics to compute codeaction
257+ -- To ensure consistency, we intercept codeAction requests and explicitly inject
258+ -- server-side diagnostics before delegating to the plugin handler.
259+ params <- case m of
260+ SMethod_TextDocumentCodeAction -> liftIO $ injectServerDiagnostics ide params'
261+ _ -> pure params'
254262 config <- Ide.PluginUtils. getClientConfig
255263 -- Only run plugins that are allowed to run on this request, save the
256264 -- list of disabled plugins incase that's all we have
0 commit comments