Skip to content

Commit f591e2a

Browse files
author
Jan Vogt
committed
Provide GHC structured diagnostics in GhcideCodeActions
1 parent 576eb44 commit f591e2a

File tree

1 file changed

+44
-34
lines changed
  • plugins/hls-refactor-plugin/src/Development/IDE/Plugin/CodeAction

1 file changed

+44
-34
lines changed

plugins/hls-refactor-plugin/src/Development/IDE/Plugin/CodeAction/Args.hs

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ import Data.Either (fromRight,
2222
import Data.Functor ((<&>))
2323
import Data.IORef.Extra
2424
import qualified Data.Map as Map
25-
import Data.Maybe (fromMaybe)
25+
import Data.Maybe (fromMaybe,
26+
maybeToList)
2627
import qualified Data.Text as T
2728
import qualified Data.Text.Utf16.Rope.Mixed as Rope
2829
import Development.IDE hiding
2930
(pluginHandlers)
31+
import Development.IDE.Core.PluginUtils (activeDiagnosticsInRange,
32+
uriToNormalizedFilePathE)
3033
import Development.IDE.Core.Shake
3134
import Development.IDE.GHC.Compat
3235
import Development.IDE.GHC.ExactPrint
@@ -53,38 +56,42 @@ type GhcideCodeAction = ExceptT PluginError (ReaderT CodeActionArgs IO) GhcideCo
5356
-------------------------------------------------------------------------------------------------
5457

5558
runGhcideCodeAction :: IdeState -> MessageParams Method_TextDocumentCodeAction -> GhcideCodeAction -> HandlerM Config GhcideCodeActionResult
56-
runGhcideCodeAction state (CodeActionParams _ _ (TextDocumentIdentifier uri) _range CodeActionContext {_diagnostics = diags}) codeAction = do
57-
let mbFile = toNormalizedFilePath' <$> uriToFilePath uri
58-
runRule key = runAction ("GhcideCodeActions." <> show key) state $ runMaybeT $ MaybeT (pure mbFile) >>= MaybeT . use key
59-
caaGhcSession <- onceIO $ runRule GhcSession
60-
caaExportsMap <-
61-
onceIO $
62-
caaGhcSession >>= \case
63-
Just env -> do
64-
pkgExports <- envPackageExports env
65-
localExports <- readTVarIO (exportsMap $ shakeExtras state)
66-
pure $ localExports <> pkgExports
67-
_ -> pure mempty
68-
caaIdeOptions <- onceIO $ runAction "GhcideCodeActions.getIdeOptions" state getIdeOptions
69-
caaParsedModule <- onceIO $ runRule GetParsedModuleWithComments
70-
caaContents <-
71-
onceIO $
72-
runRule GetFileContents <&> \case
73-
Just (_, mbContents) -> fmap Rope.toText mbContents
74-
Nothing -> Nothing
75-
caaDf <- onceIO $ fmap (ms_hspp_opts . pm_mod_summary) <$> caaParsedModule
76-
caaAnnSource <- onceIO $ runRule GetAnnotatedParsedSource
77-
caaTmr <- onceIO $ runRule TypeCheck
78-
caaHar <- onceIO $ runRule GetHieAst
79-
caaBindings <- onceIO $ runRule GetBindings
80-
caaGblSigs <- onceIO $ runRule GetGlobalBindingTypeSigs
81-
results <- liftIO $
82-
sequence
83-
[ runReaderT (runExceptT codeAction) CodeActionArgs {..}
84-
| caaDiagnostic <- diags
85-
]
86-
let (_errs, successes) = partitionEithers results
87-
pure $ concat successes
59+
runGhcideCodeAction state (CodeActionParams _ _ (TextDocumentIdentifier uri) _range _) codeAction
60+
| Just nfp <- toNormalizedFilePath' <$> uriToFilePath uri = do
61+
let runRule key = runAction ("GhcideCodeActions." <> show key) state $ runMaybeT $ MaybeT (pure (Just nfp)) >>= MaybeT . use key
62+
caaGhcSession <- onceIO $ runRule GhcSession
63+
caaExportsMap <-
64+
onceIO $
65+
caaGhcSession >>= \case
66+
Just env -> do
67+
pkgExports <- envPackageExports env
68+
localExports <- readTVarIO (exportsMap $ shakeExtras state)
69+
pure $ localExports <> pkgExports
70+
_ -> pure mempty
71+
caaIdeOptions <- onceIO $ runAction "GhcideCodeActions.getIdeOptions" state getIdeOptions
72+
caaParsedModule <- onceIO $ runRule GetParsedModuleWithComments
73+
caaContents <-
74+
onceIO $
75+
runRule GetFileContents <&> \case
76+
Just (_, mbContents) -> fmap Rope.toText mbContents
77+
Nothing -> Nothing
78+
caaDf <- onceIO $ fmap (ms_hspp_opts . pm_mod_summary) <$> caaParsedModule
79+
caaAnnSource <- onceIO $ runRule GetAnnotatedParsedSource
80+
caaTmr <- onceIO $ runRule TypeCheck
81+
caaHar <- onceIO $ runRule GetHieAst
82+
caaBindings <- onceIO $ runRule GetBindings
83+
caaGblSigs <- onceIO $ runRule GetGlobalBindingTypeSigs
84+
diags <- concat . maybeToList <$> activeDiagnosticsInRange (shakeExtras state) nfp _range
85+
results <- liftIO $
86+
sequence
87+
[
88+
runReaderT (runExceptT codeAction) CodeActionArgs {..}
89+
| caaDiagnostic <- diags
90+
]
91+
let (_errs, successes) = partitionEithers results
92+
pure $ concat successes
93+
| otherwise = pure []
94+
8895

8996
mkCA :: T.Text -> Maybe CodeActionKind -> Maybe Bool -> [Diagnostic] -> WorkspaceEdit -> (Command |? CodeAction)
9097
mkCA title kind isPreferred diags edit =
@@ -145,7 +152,7 @@ data CodeActionArgs = CodeActionArgs
145152
caaHar :: IO (Maybe HieAstResult),
146153
caaBindings :: IO (Maybe Bindings),
147154
caaGblSigs :: IO (Maybe GlobalBindingTypeSigsResult),
148-
caaDiagnostic :: Diagnostic
155+
caaDiagnostic :: FileDiagnostic
149156
}
150157

151158
-- | There's no concurrency in each provider,
@@ -223,6 +230,9 @@ instance ToCodeAction r => ToCodeAction (IdeOptions -> r) where
223230
toCodeAction = toCodeAction3 caaIdeOptions
224231

225232
instance ToCodeAction r => ToCodeAction (Diagnostic -> r) where
233+
toCodeAction f = ExceptT . ReaderT $ \caa@CodeActionArgs {caaDiagnostic = x} -> flip runReaderT caa . runExceptT . toCodeAction $ f (fdLspDiagnostic x)
234+
235+
instance ToCodeAction r => ToCodeAction (FileDiagnostic -> r) where
226236
toCodeAction f = ExceptT . ReaderT $ \caa@CodeActionArgs {caaDiagnostic = x} -> flip runReaderT caa . runExceptT . toCodeAction $ f x
227237

228238
instance ToCodeAction r => ToCodeAction (Maybe ParsedModule -> r) where

0 commit comments

Comments
 (0)