Skip to content

Commit e27c7c6

Browse files
committed
ExecuteCommand plugins work via pluginDescriptor
Demonstrated by adding missing pragmas derived from GHC error messages.
1 parent 7dbfb97 commit e27c7c6

File tree

4 files changed

+31
-35
lines changed

4 files changed

+31
-35
lines changed

exe/Main.hs

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,7 @@ import Control.Concurrent.Extra
1515
import Control.Exception
1616
import Control.Monad.Extra
1717
import Control.Monad.IO.Class
18-
-- import qualified Crypto.Hash.SHA1 as H
19-
-- import Data.ByteString.Base16
20-
-- import qualified Data.ByteString.Char8 as B
2118
import Data.Default
22-
-- import Data.Functor ((<&>))
2319
import qualified Data.HashSet as HashSet
2420
import Data.List.Extra
2521
import qualified Data.Map.Strict as Map
@@ -44,23 +40,12 @@ import Development.IDE.Types.Location
4440
import Development.IDE.Types.Logger
4541
import Development.IDE.Types.Options
4642
import Development.Shake (Action, Rules, action)
47-
-- import DynFlags
48-
-- import GHC hiding (def)
49-
-- import qualified GHC.Paths
5043
import HIE.Bios
5144
import qualified Language.Haskell.LSP.Core as LSP
52-
-- import HIE.Bios.Cradle
53-
-- import HIE.Bios.Environment
54-
-- import HIE.Bios.Types
5545
import Ide.Plugin
56-
-- import Ide.PluginDescriptors
5746
import Ide.Plugin.Config
58-
-- import Ide.Plugin.Formatter
5947
import Language.Haskell.LSP.Messages
6048
import Language.Haskell.LSP.Types (LspId(IdInt))
61-
-- import qualified Language.Haskell.LSP.Core as LSP
62-
-- import Linker
63-
-- import Paths_haskell_language_server
6449
import RuleTypes
6550
import Rules
6651
import qualified System.Directory.Extra as IO
@@ -126,8 +111,8 @@ idePlugins includeExamples
126111
-- , hsimportDescriptor "hsimport"
127112
-- , liquidDescriptor "liquid"
128113
-- , packageDescriptor "package"
129-
-- , pragmasDescriptor "pragmas"
130-
Floskell.descriptor "floskell"
114+
Pragmas.descriptor "pragmas"
115+
, Floskell.descriptor "floskell"
131116
-- , genericDescriptor "generic"
132117
-- , ghcmodDescriptor "ghcmod"
133118
, Ormolu.descriptor "ormolu"
@@ -172,7 +157,8 @@ main = do
172157
dir <- IO.getCurrentDirectory
173158

174159
pid <- getPid
175-
let plugins = idePlugins argsExamplePlugin
160+
-- let plugins = idePlugins argsExamplePlugin
161+
let plugins = idePlugins True
176162
options = def { LSP.executeCommandCommands = Just (commandIds pid)
177163
, LSP.completionTriggerCharacters = Just "."
178164
}

ghcide

src/Ide/Plugin.hs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import Data.Maybe
3030
import qualified Data.Text as T
3131
import Development.IDE.Core.Rules
3232
import Development.IDE.LSP.Server
33-
import Development.IDE.Plugin hiding (pluginCommands)
33+
import Development.IDE.Plugin hiding (pluginCommands, pluginRules)
3434
import Development.IDE.Types.Diagnostics as D
3535
import Development.Shake hiding ( Diagnostic, command )
3636
import GHC.Generics
@@ -53,6 +53,7 @@ import Text.Regex.TDFA.Text()
5353
-- category ('Notifaction', 'Request' etc).
5454
asGhcIdePlugin :: IdePlugins -> Plugin Config
5555
asGhcIdePlugin mp =
56+
mkPlugin rulesPlugins (Just . pluginRules) <>
5657
mkPlugin executeCommandPlugins (Just . pluginCommands) <>
5758
mkPlugin codeActionPlugins pluginCodeActionProvider <>
5859
-- diagnostics from pluginDiagnosticProvider
@@ -66,7 +67,7 @@ asGhcIdePlugin mp =
6667

6768
ls = Map.toList (ipMap mp)
6869

69-
mkPlugin :: ([(PluginId, b)] -> t) -> (PluginDescriptor -> Maybe b) -> t
70+
mkPlugin :: ([(PluginId, b)] -> Plugin Config) -> (PluginDescriptor -> Maybe b) -> Plugin Config
7071
mkPlugin maker selector
7172
= maker $ concatMap (\(pid, p) -> justs (pid, selector p)) ls
7273

@@ -76,6 +77,11 @@ pluginDescToIdePlugins plugins = IdePlugins $ Map.fromList $ map (\p -> (pluginI
7677

7778
-- ---------------------------------------------------------------------
7879

80+
rulesPlugins :: [(PluginId, Rules ())] -> Plugin Config
81+
rulesPlugins rs = Plugin mempty rules mempty
82+
where
83+
rules = mconcat $ map snd rs
84+
7985
codeActionPlugins :: [(PluginId, CodeActionProvider)] -> Plugin Config
8086
codeActionPlugins cas = Plugin mempty codeActionRules (codeActionHandlers cas)
8187

@@ -286,9 +292,12 @@ runPluginCommand m p@(PluginId p') com@(CommandId com') arg =
286292
ResponseError InvalidParams ("error while parsing args for " <> com' <> " in plugin " <> p' <> ": " <> T.pack err) Nothing, Nothing)
287293
J.Success a -> do
288294
res <- f a
289-
case res of
290-
Left e -> return (Left e, Nothing)
291-
Right r -> return (Right $ J.toJSON r, Nothing)
295+
return res
296+
-- case res of
297+
-- Left e -> return (Left e, Nothing)
298+
-- -- Right r -> return (Right $ J.toJSON r, Nothing)
299+
-- Right r -> return r
300+
-- -- return (Right J.Null, Just(WorkspaceApplyEdit, _ r))
292301

293302
-- -----------------------------------------------------------
294303

src/Ide/Plugin/Pragmas.hs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
-- | Provides code actions to add missing pragmas (whenever GHC suggests to)
66
module Ide.Plugin.Pragmas
77
(
8-
codeAction
8+
descriptor
9+
, codeAction
910
, commands
1011
) where
1112

@@ -18,19 +19,16 @@ import Ide.Types
1819
import qualified GHC.Generics as Generics
1920
import qualified Language.Haskell.LSP.Types as J
2021
import qualified Language.Haskell.LSP.Types.Lens as J
21-
2222
import Development.IDE.Types.Diagnostics as D
2323
import Language.Haskell.LSP.Types
2424

2525
-- ---------------------------------------------------------------------
2626

27-
_pragmasDescriptor :: PluginId -> PluginDescriptor
28-
_pragmasDescriptor plId = PluginDescriptor
27+
descriptor :: PluginId -> PluginDescriptor
28+
descriptor plId = PluginDescriptor
2929
{ pluginId = plId
3030
, pluginRules = mempty
31-
, pluginCommands =
32-
[ PluginCommand "addPragma" "add the given pragma" addPragmaCmd
33-
]
31+
, pluginCommands = commands
3432
, pluginCodeActionProvider = Just codeActionProvider
3533
, pluginDiagnosticProvider = Nothing
3634
, pluginHoverProvider = Nothing
@@ -58,7 +56,9 @@ data AddPragmaParams = AddPragmaParams
5856
-- Pragma is added to the first line of the Uri.
5957
-- It is assumed that the pragma name is a valid pragma,
6058
-- thus, not validated.
61-
addPragmaCmd :: AddPragmaParams -> IO (Either ResponseError J.WorkspaceEdit)
59+
-- addPragmaCmd :: AddPragmaParams -> IO (Either ResponseError J.WorkspaceEdit)
60+
addPragmaCmd :: AddPragmaParams -> IO (Either ResponseError Value,
61+
Maybe (ServerMethod, ApplyWorkspaceEditParams))
6262
addPragmaCmd (AddPragmaParams uri pragmaName) = do
6363
let
6464
pos = J.Position 0 0
@@ -69,7 +69,7 @@ addPragmaCmd (AddPragmaParams uri pragmaName) = do
6969
res = J.WorkspaceEdit
7070
(Just $ H.singleton uri textEdits)
7171
Nothing
72-
return $ Right res
72+
return $ (Right Null, Just (WorkspaceApplyEdit, ApplyWorkspaceEditParams res))
7373

7474
-- ---------------------------------------------------------------------
7575

@@ -80,11 +80,12 @@ codeAction = codeActionProvider
8080
-- Pragmas are defined by a curated list of known pragmas, see 'possiblePragmas'.
8181
codeActionProvider :: CodeActionProvider
8282
codeActionProvider _ plId docId _ (J.CodeActionContext (J.List diags) _monly) = do
83-
cmds <- mapM mkCommand pragmas
83+
-- cmds <- mapM mkCommand pragmas
84+
cmds <- mapM mkCommand ("FooPragma":pragmas)
8485
return $ Right $ List cmds
8586
where
8687
-- Filter diagnostics that are from ghcmod
87-
ghcDiags = filter (\d -> d ^. J.source == Just "bios") diags
88+
ghcDiags = filter (\d -> d ^. J.source == Just "typecheck") diags
8889
-- Get all potential Pragmas for all diagnostics.
8990
pragmas = concatMap (\d -> findPragma (d ^. J.message)) ghcDiags
9091
mkCommand pragmaName = do

0 commit comments

Comments
 (0)