9
9
10
10
-- | Provides code actions to add missing pragmas (whenever GHC suggests to)
11
11
module Ide.Plugin.Pragmas
12
- ( descriptor
12
+ ( suggestPragmaDescriptor
13
+ , completionDescriptor
14
+ , suggestDisableWarningDescriptor
13
15
-- For testing
14
16
, validPragmas
15
17
) where
@@ -33,22 +35,40 @@ import qualified Text.Fuzzy as Fuzzy
33
35
34
36
-- ---------------------------------------------------------------------
35
37
36
- descriptor :: PluginId -> PluginDescriptor IdeState
37
- descriptor plId = (defaultPluginDescriptor plId)
38
- { pluginHandlers = mkPluginHandler J. STextDocumentCodeAction codeActionProvider
39
- <> mkPluginHandler J. STextDocumentCompletion completion
38
+ suggestPragmaDescriptor :: PluginId -> PluginDescriptor IdeState
39
+ suggestPragmaDescriptor plId = (defaultPluginDescriptor plId)
40
+ { pluginHandlers = mkPluginHandler J. STextDocumentCodeAction suggestPragmaProvider
41
+ , pluginPriority = defaultPluginPriority + 1000
42
+ }
43
+
44
+ completionDescriptor :: PluginId -> PluginDescriptor IdeState
45
+ completionDescriptor plId = (defaultPluginDescriptor plId)
46
+ { pluginHandlers = mkPluginHandler J. STextDocumentCompletion completion
40
47
, pluginPriority = ghcideCompletionsPluginPriority + 1
41
48
}
42
49
50
+ suggestDisableWarningDescriptor :: PluginId -> PluginDescriptor IdeState
51
+ suggestDisableWarningDescriptor plId = (defaultPluginDescriptor plId)
52
+ { pluginHandlers = mkPluginHandler J. STextDocumentCodeAction suggestDisableWarningProvider
53
+ -- #3636 Suggestions to disable warnings should appear last.
54
+ , pluginPriority = 0
55
+ }
56
+
43
57
-- ---------------------------------------------------------------------
44
58
-- | Title and pragma
45
59
type PragmaEdit = (T. Text , Pragma )
46
60
47
61
data Pragma = LangExt T. Text | OptGHC T. Text
48
62
deriving (Show , Eq , Ord )
49
63
50
- codeActionProvider :: PluginMethodHandler IdeState 'J.TextDocumentCodeAction
51
- codeActionProvider state _plId (J. CodeActionParams _ _ docId _ (J. CodeActionContext (J. List diags) _monly))
64
+ suggestPragmaProvider :: PluginMethodHandler IdeState 'J.TextDocumentCodeAction
65
+ suggestPragmaProvider = mkCodeActionProvider suggest
66
+
67
+ suggestDisableWarningProvider :: PluginMethodHandler IdeState 'J.TextDocumentCodeAction
68
+ suggestDisableWarningProvider = mkCodeActionProvider $ const suggestDisableWarning
69
+
70
+ mkCodeActionProvider :: (Maybe DynFlags -> Diagnostic -> [PragmaEdit ]) -> PluginMethodHandler IdeState 'J.TextDocumentCodeAction
71
+ mkCodeActionProvider mkSuggest state _plId (J. CodeActionParams _ _ docId _ (J. CodeActionContext (J. List diags) _monly))
52
72
| let J. TextDocumentIdentifier { _uri = uri } = docId
53
73
, Just normalizedFilePath <- J. uriToNormalizedFilePath $ toNormalizedUri uri = do
54
74
-- ghc session to get some dynflags even if module isn't parsed
@@ -60,7 +80,7 @@ codeActionProvider state _plId (J.CodeActionParams _ _ docId _ (J.CodeActionCont
60
80
case ghcSession of
61
81
Just (hscEnv -> hsc_dflags -> sessionDynFlags, _) ->
62
82
let nextPragmaInfo = Pragmas. getNextPragmaInfo sessionDynFlags fileContents
63
- pedits = nubOrdOn snd . concat $ suggest parsedModuleDynFlags <$> diags
83
+ pedits = ( nubOrdOn snd . concat $ mkSuggest parsedModuleDynFlags <$> diags)
64
84
in
65
85
pure $ Right $ List $ pragmaEditToAction uri nextPragmaInfo <$> pedits
66
86
Nothing -> pure $ Right $ List []
@@ -95,7 +115,6 @@ pragmaEditToAction uri Pragmas.NextPragmaInfo{ nextPragmaLine, lineSplitTextEdit
95
115
suggest :: Maybe DynFlags -> Diagnostic -> [PragmaEdit ]
96
116
suggest dflags diag =
97
117
suggestAddPragma dflags diag
98
- ++ suggestDisableWarning diag
99
118
100
119
-- ---------------------------------------------------------------------
101
120
0 commit comments