@@ -14,10 +14,9 @@ import Completer (completerTests)
1414import Context (contextTests )
1515import Control.Lens ((^.) )
1616import Control.Lens.Fold ((^?) )
17- import Control.Monad (guard )
17+ import Control.Monad (forM_ , guard )
1818import qualified Data.ByteString as BS
1919import Data.Either (isRight )
20- import Data.List.Extra (nubOrdOn )
2120import qualified Data.Maybe as Maybe
2221import Data.Text (Text )
2322import qualified Data.Text as T
@@ -26,6 +25,7 @@ import Definition (gotoDefinitionTests)
2625import Development.IDE.Test
2726import Ide.Plugin.Cabal.LicenseSuggest (licenseErrorSuggestion )
2827import qualified Ide.Plugin.Cabal.Parse as Lib
28+ import Language.LSP.Protocol.Lens (HasRange (.. ))
2929import qualified Language.LSP.Protocol.Lens as L
3030import qualified Language.LSP.Protocol.Message as L
3131import Outline (outlineTests )
@@ -191,32 +191,29 @@ codeActionTests = testGroup "Code Actions"
191191 , " build-depends: base"
192192 , " default-language: Haskell2010"
193193 ]
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
216204 , cabalAddDependencyTests
217205 , cabalAddModuleTests
218206 ]
219207 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)
220217 getLicenseAction :: T. Text -> [Command |? CodeAction ] -> [CodeAction ]
221218 getLicenseAction license codeActions = do
222219 InR action@ CodeAction {_title} <- codeActions
0 commit comments