Skip to content

Commit 6e5553e

Browse files
committed
Limit CodeActions within passed range
Return only actions within range specified by client.
1 parent 9f8a172 commit 6e5553e

File tree

4 files changed

+25
-6
lines changed

4 files changed

+25
-6
lines changed

hls-plugin-api/src/Ide/PluginUtils.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ module Ide.PluginUtils
1919
mkLspCommand,
2020
mkLspCmdId,
2121
getPid,
22-
allLspCmdIds,allLspCmdIds',installSigUsr1Handler, subRange)
22+
allLspCmdIds,allLspCmdIds',installSigUsr1Handler, subRange, positionInRange)
2323
where
2424

2525

plugins/hls-hlint-plugin/src/Ide/Plugin/Hlint.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -268,20 +268,20 @@ getHlintSettingsRule usage =
268268
-- ---------------------------------------------------------------------
269269

270270
codeActionProvider :: PluginMethodHandler IdeState TextDocumentCodeAction
271-
codeActionProvider ideState plId (CodeActionParams _ _ docId _ context) = Right . LSP.List . map InR <$> liftIO getCodeActions
271+
codeActionProvider ideState plId (CodeActionParams _ _ docId caRange context) = Right . LSP.List . map InR <$> liftIO getCodeActions
272272
where
273-
274273
getCodeActions = do
275274
diags <- getDiagnostics ideState
276275
let docNfp = toNormalizedFilePath' <$> uriToFilePath' (docId ^. LSP.uri)
277-
numHintsInDoc = length
278-
[d | (nfp, _, d) <- diags
276+
numHintsInRange = length
277+
[d | (nfp, _, d@LSP.Diagnostic{_range = LSP.Range{_start = start}}) <- diags
279278
, validCommand d
280279
, Just nfp == docNfp
280+
, positionInRange start caRange
281281
]
282282
-- We only want to show the applyAll code action if there is more than 1
283283
-- hint in the current document
284-
if numHintsInDoc > 1 then do
284+
if numHintsInRange > 1 then do
285285
pure $ applyAllAction:applyOneActions
286286
else
287287
pure applyOneActions

test/functional/FunctionalCodeAction.hs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,22 @@ hlintTests = testGroup "hlint suggestions" [
170170

171171
, testCase "apply-refact preserve regular comments" $ runHlintSession "" $ do
172172
testRefactor "ApplyRefact6.hs" "Redundant bracket" expectedComments
173+
174+
, testCase "applyAll is shown only when there is at least one diagnostic in range" $ runHlintSession "" $ do
175+
doc <- openDoc "ApplyRefact7.hs" "haskell"
176+
_ <- waitForDiagnosticsFromSource doc "hlint"
177+
178+
firstLine <- map fromAction <$> getCodeActions doc (mkRange 0 0 0 0)
179+
secondLine <- map fromAction <$> getCodeActions doc (mkRange 1 0 1 0)
180+
thirdLine <- map fromAction <$> getCodeActions doc (mkRange 2 0 2 0)
181+
multiLine <- map fromAction <$> getCodeActions doc (mkRange 0 0 2 0)
182+
183+
let hasApplyAll = isJust . find (\ca -> "Apply all hints" `T.isSuffixOf` (ca ^. L.title))
184+
185+
liftIO $ not (hasApplyAll firstLine) @? "There is no apply all code action"
186+
liftIO $ not (hasApplyAll secondLine) @? "There is no apply all code action"
187+
liftIO $ not (hasApplyAll thirdLine) @? "There is an apply all code action"
188+
liftIO $ hasApplyAll multiLine @? "There is no apply all code action"
173189
]
174190
where
175191
runHlintSession :: FilePath -> Session a -> IO a

test/testdata/hlint/ApplyRefact7.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
f = (1)
2+
g = (1)
3+

0 commit comments

Comments
 (0)