99
1010-- | Provides code actions to add missing pragmas (whenever GHC suggests to)
1111module Ide.Plugin.Pragmas
12- ( descriptor
12+ ( suggestPragmaDescriptor
13+ , completionDescriptor
14+ , suggestDisableWarningDescriptor
1315 -- For testing
1416 , validPragmas
1517 ) where
@@ -33,22 +35,40 @@ import qualified Text.Fuzzy as Fuzzy
3335
3436-- ---------------------------------------------------------------------
3537
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
4047 , pluginPriority = ghcideCompletionsPluginPriority + 1
4148 }
4249
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+
4357-- ---------------------------------------------------------------------
4458-- | Title and pragma
4559type PragmaEdit = (T. Text , Pragma )
4660
4761data Pragma = LangExt T. Text | OptGHC T. Text
4862 deriving (Show , Eq , Ord )
4963
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))
5272 | let J. TextDocumentIdentifier { _uri = uri } = docId
5373 , Just normalizedFilePath <- J. uriToNormalizedFilePath $ toNormalizedUri uri = do
5474 -- ghc session to get some dynflags even if module isn't parsed
@@ -60,7 +80,7 @@ codeActionProvider state _plId (J.CodeActionParams _ _ docId _ (J.CodeActionCont
6080 case ghcSession of
6181 Just (hscEnv -> hsc_dflags -> sessionDynFlags, _) ->
6282 let nextPragmaInfo = Pragmas. getNextPragmaInfo sessionDynFlags fileContents
63- pedits = nubOrdOn snd . concat $ suggest parsedModuleDynFlags <$> diags
83+ pedits = ( nubOrdOn snd . concat $ mkSuggest parsedModuleDynFlags <$> diags)
6484 in
6585 pure $ Right $ List $ pragmaEditToAction uri nextPragmaInfo <$> pedits
6686 Nothing -> pure $ Right $ List []
@@ -95,7 +115,6 @@ pragmaEditToAction uri Pragmas.NextPragmaInfo{ nextPragmaLine, lineSplitTextEdit
95115suggest :: Maybe DynFlags -> Diagnostic -> [PragmaEdit ]
96116suggest dflags diag =
97117 suggestAddPragma dflags diag
98- ++ suggestDisableWarning diag
99118
100119-- ---------------------------------------------------------------------
101120
0 commit comments