@@ -121,6 +121,7 @@ import Ide.Types hiding
121121import Language.Haskell.HLint as Hlint hiding
122122 (Error )
123123import Language.LSP.Server (ProgressCancellable (Cancellable ),
124+ getVersionedTextDoc ,
124125 sendRequest ,
125126 withIndefiniteProgress )
126127import Language.LSP.Types hiding
@@ -407,8 +408,11 @@ codeActionProvider :: PluginMethodHandler IdeState TextDocumentCodeAction
407408codeActionProvider ideState pluginId (CodeActionParams _ _ documentId _ context)
408409 | let TextDocumentIdentifier uri = documentId
409410 , Just docNormalizedFilePath <- uriToNormalizedFilePath (toNormalizedUri uri)
410- = liftIO $ fmap (Right . LSP. List . map LSP. InR ) $ do
411+ = do
412+ verTxtDocId <- getVersionedTextDoc documentId
413+ liftIO $ fmap (Right . LSP. List . map LSP. InR ) $ do
411414 allDiagnostics <- atomically $ getDiagnostics ideState
415+
412416 let numHintsInDoc = length
413417 [diagnostic | (diagnosticNormalizedFilePath, _, diagnostic) <- allDiagnostics
414418 , validCommand diagnostic
@@ -425,19 +429,19 @@ codeActionProvider ideState pluginId (CodeActionParams _ _ documentId _ context)
425429 pure if | Just modSummaryResult <- modSummaryResult
426430 , Just source <- source
427431 , let dynFlags = ms_hspp_opts $ msrModSummary modSummaryResult ->
428- diags >>= diagnosticToCodeActions dynFlags source pluginId documentId
432+ diags >>= diagnosticToCodeActions dynFlags source pluginId verTxtDocId
429433 | otherwise -> []
430434 | otherwise -> pure []
431435 if numHintsInDoc > 1 && numHintsInContext > 0 then do
432- pure $ singleHintCodeActions ++ [applyAllAction]
436+ pure $ singleHintCodeActions ++ [applyAllAction verTxtDocId ]
433437 else
434438 pure singleHintCodeActions
435439 | otherwise
436440 = pure $ Right $ LSP. List []
437441
438442 where
439- applyAllAction =
440- let args = Just [toJSON (documentId ^. LSP. uri) ]
443+ applyAllAction verTxtDocId =
444+ let args = Just [toJSON verTxtDocId ]
441445 cmd = mkLspCommand pluginId " applyAll" " Apply all hints" args
442446 in LSP. CodeAction " Apply all hints" (Just LSP. CodeActionQuickFix ) Nothing Nothing Nothing Nothing (Just cmd) Nothing
443447
@@ -451,25 +455,24 @@ codeActionProvider ideState pluginId (CodeActionParams _ _ documentId _ context)
451455
452456-- | Convert a hlint diagnostic into an apply and an ignore code action
453457-- if applicable
454- diagnosticToCodeActions :: DynFlags -> T. Text -> PluginId -> TextDocumentIdentifier -> LSP. Diagnostic -> [LSP. CodeAction ]
455- diagnosticToCodeActions dynFlags fileContents pluginId documentId diagnostic
458+ diagnosticToCodeActions :: DynFlags -> T. Text -> PluginId -> VersionedTextDocumentIdentifier -> LSP. Diagnostic -> [LSP. CodeAction ]
459+ diagnosticToCodeActions dynFlags fileContents pluginId verTxtDocId diagnostic
456460 | LSP. Diagnostic { _source = Just " hlint" , _code = Just (InR code), _range = LSP. Range start _ } <- diagnostic
457- , let TextDocumentIdentifier uri = documentId
458461 , let isHintApplicable = " refact:" `T.isPrefixOf` code
459462 , let hint = T. replace " refact:" " " code
460463 , let suppressHintTitle = " Ignore hint \" " <> hint <> " \" in this module"
461464 , let suppressHintTextEdits = mkSuppressHintTextEdits dynFlags fileContents hint
462465 , let suppressHintWorkspaceEdit =
463466 LSP. WorkspaceEdit
464- (Just (Map. singleton uri (List suppressHintTextEdits)))
467+ (Just (Map. singleton (verTxtDocId ^. LSP. uri) (List suppressHintTextEdits)))
465468 Nothing
466469 Nothing
467470 = catMaybes
468471 -- Applying the hint is marked preferred because it addresses the underlying error.
469472 -- Disabling the rule isn't, because less often used and configuration can be adapted.
470473 [ if | isHintApplicable
471474 , let applyHintTitle = " Apply hint \" " <> hint <> " \" "
472- applyHintArguments = [toJSON (AOP (documentId ^. LSP. uri) start hint)]
475+ applyHintArguments = [toJSON (AOP verTxtDocId start hint)]
473476 applyHintCommand = mkLspCommand pluginId " applyOne" applyHintTitle (Just applyHintArguments) ->
474477 Just (mkCodeAction applyHintTitle diagnostic Nothing (Just applyHintCommand) True )
475478 | otherwise -> Nothing
@@ -511,13 +514,13 @@ mkSuppressHintTextEdits dynFlags fileContents hint =
511514 combinedTextEdit : lineSplitTextEditList
512515-- ---------------------------------------------------------------------
513516
514- applyAllCmd :: Recorder (WithPriority Log ) -> CommandFunction IdeState Uri
515- applyAllCmd recorder ide uri = do
516- let file = maybe (error $ show uri ++ " is not a file." )
517+ applyAllCmd :: Recorder (WithPriority Log ) -> CommandFunction IdeState VersionedTextDocumentIdentifier
518+ applyAllCmd recorder ide verTxtDocId = do
519+ let file = maybe (error $ show (verTxtDocId ^. LSP. uri) ++ " is not a file." )
517520 toNormalizedFilePath'
518- (uriToFilePath' uri)
521+ (uriToFilePath' (verTxtDocId ^. LSP. uri) )
519522 withIndefiniteProgress " Applying all hints" Cancellable $ do
520- res <- liftIO $ applyHint recorder ide file Nothing
523+ res <- liftIO $ applyHint recorder ide file Nothing verTxtDocId
521524 logWith recorder Debug $ LogApplying file res
522525 case res of
523526 Left err -> pure $ Left (responseError (T. pack $ " hlint:applyAll: " ++ show err))
@@ -528,10 +531,10 @@ applyAllCmd recorder ide uri = do
528531-- ---------------------------------------------------------------------
529532
530533data ApplyOneParams = AOP
531- { file :: Uri
532- , start_pos :: Position
534+ { verTxtDocId :: VersionedTextDocumentIdentifier
535+ , start_pos :: Position
533536 -- | There can be more than one hint suggested at the same position, so HintTitle is used to distinguish between them.
534- , hintTitle :: HintTitle
537+ , hintTitle :: HintTitle
535538 } deriving (Eq ,Show ,Generic ,FromJSON ,ToJSON )
536539
537540type HintTitle = T. Text
@@ -542,22 +545,22 @@ data OneHint = OneHint
542545 } deriving (Eq , Show )
543546
544547applyOneCmd :: Recorder (WithPriority Log ) -> CommandFunction IdeState ApplyOneParams
545- applyOneCmd recorder ide (AOP uri pos title) = do
548+ applyOneCmd recorder ide (AOP verTxtDocId pos title) = do
546549 let oneHint = OneHint pos title
547- let file = maybe (error $ show uri ++ " is not a file." ) toNormalizedFilePath'
548- (uriToFilePath' uri)
550+ let file = maybe (error $ show (verTxtDocId ^. LSP. uri) ++ " is not a file." ) toNormalizedFilePath'
551+ (uriToFilePath' (verTxtDocId ^. LSP. uri) )
549552 let progTitle = " Applying hint: " <> title
550553 withIndefiniteProgress progTitle Cancellable $ do
551- res <- liftIO $ applyHint recorder ide file (Just oneHint)
554+ res <- liftIO $ applyHint recorder ide file (Just oneHint) verTxtDocId
552555 logWith recorder Debug $ LogApplying file res
553556 case res of
554557 Left err -> pure $ Left (responseError (T. pack $ " hlint:applyOne: " ++ show err))
555558 Right fs -> do
556559 _ <- sendRequest SWorkspaceApplyEdit (ApplyWorkspaceEditParams Nothing fs) (\ _ -> pure () )
557560 pure $ Right Null
558561
559- applyHint :: Recorder (WithPriority Log ) -> IdeState -> NormalizedFilePath -> Maybe OneHint -> IO (Either String WorkspaceEdit )
560- applyHint recorder ide nfp mhint =
562+ applyHint :: Recorder (WithPriority Log ) -> IdeState -> NormalizedFilePath -> Maybe OneHint -> VersionedTextDocumentIdentifier -> IO (Either String WorkspaceEdit )
563+ applyHint recorder ide nfp mhint verTxtDocId =
561564 runExceptT $ do
562565 let runAction' :: Action a -> IO a
563566 runAction' = runAction " applyHint" ide
@@ -614,8 +617,7 @@ applyHint recorder ide nfp mhint =
614617#endif
615618 case res of
616619 Right appliedFile -> do
617- let uri = fromNormalizedUri (filePathToUri' nfp)
618- let wsEdit = diffText' True (uri, oldContent) (T. pack appliedFile) IncludeDeletions
620+ let wsEdit = diffText' True (verTxtDocId, oldContent) (T. pack appliedFile) IncludeDeletions
619621 ExceptT $ return (Right wsEdit)
620622 Left err ->
621623 throwE err
0 commit comments