@@ -14,10 +14,9 @@ import Completer (completerTests)
14
14
import Context (contextTests )
15
15
import Control.Lens ((^.) )
16
16
import Control.Lens.Fold ((^?) )
17
- import Control.Monad (guard )
17
+ import Control.Monad (forM_ , guard )
18
18
import qualified Data.ByteString as BS
19
19
import Data.Either (isRight )
20
- import Data.List.Extra (nubOrdOn )
21
20
import qualified Data.Maybe as Maybe
22
21
import Data.Text (Text )
23
22
import qualified Data.Text as T
@@ -26,6 +25,7 @@ import Definition (gotoDefinitionTests)
26
25
import Development.IDE.Test
27
26
import Ide.Plugin.Cabal.LicenseSuggest (licenseErrorSuggestion )
28
27
import qualified Ide.Plugin.Cabal.Parse as Lib
28
+ import Language.LSP.Protocol.Lens (HasRange (.. ))
29
29
import qualified Language.LSP.Protocol.Lens as L
30
30
import qualified Language.LSP.Protocol.Message as L
31
31
import Outline (outlineTests )
@@ -191,32 +191,29 @@ codeActionTests = testGroup "Code Actions"
191
191
, " build-depends: base"
192
192
, " default-language: Haskell2010"
193
193
]
194
- , runCabalGoldenSession " Code Actions - Can fix field names" " code-actions" " FieldSuggestions" $ \ doc -> do
195
- _ <- waitForDiagnosticsFrom doc
196
- cas <- Maybe. mapMaybe (^? _R) <$> getAllCodeActions doc
197
- -- Filter out the code actions we want to invoke.
198
- -- We only want to invoke Code Actions with certain titles, and
199
- -- we want to invoke them only once, not once for each cursor request.
200
- -- 'getAllCodeActions' iterates over each cursor position and requests code actions.
201
- let selectedCas = nubOrdOn (^. L. title) $ filter
202
- (\ ca -> (ca ^. L. title) `elem`
203
- [ " Replace with license"
204
- , " Replace with build-type"
205
- , " Replace with extra-doc-files"
206
- , " Replace with ghc-options"
207
- , " Replace with location"
208
- , " Replace with default-language"
209
- , " Replace with import"
210
- , " Replace with build-depends"
211
- , " Replace with main-is"
212
- , " Replace with hs-source-dirs"
213
- ]) cas
214
- mapM_ executeCodeAction selectedCas
215
- pure ()
194
+ , runCabalGoldenSession
195
+ " Code Actions - Can complete field names"
196
+ " code-actions"
197
+ " FieldSuggestions"
198
+ executeFirstActionPerDiagnostic
199
+ , runCabalGoldenSession
200
+ " Code Actions - Can fix field typos"
201
+ " code-actions"
202
+ " FieldSuggestionsTypos"
203
+ executeFirstActionPerDiagnostic
216
204
, cabalAddDependencyTests
217
205
, cabalAddModuleTests
218
206
]
219
207
where
208
+ executeFirstActionPerDiagnostic doc = do
209
+ _ <- waitForDiagnosticsFrom doc
210
+ diagnotics <- getCurrentDiagnostics doc
211
+ -- Execute the first code action at each diagnostic point
212
+ forM_ diagnotics $ \ diagnostic -> do
213
+ codeActions <- getCodeActions doc (diagnostic ^. range)
214
+ case codeActions of
215
+ [] -> pure ()
216
+ ca : _ -> mapM_ executeCodeAction (ca ^? _R)
220
217
getLicenseAction :: T. Text -> [Command |? CodeAction ] -> [CodeAction ]
221
218
getLicenseAction license codeActions = do
222
219
InR action@ CodeAction {_title} <- codeActions
0 commit comments