on master help sign in
Add code action for GHC's suggestions for not-found module
commitf53faf87340f900efa5b4d0649e313a16b0f2e76 authorJacek Generowicz <jacg@my-post-office.net> dateFri 13 Sep 2019, 01:08 (7 years ago) parent4aa1821
2 files changed+32
src/Development/IDE/LSP/CodeAction.hs+10 test/exe/Main.hs+22
src/Development/IDE/LSP/CodeAction.hs+10
@@ -20,6 +20,7 @@ import Language.Haskell.LSP.Messages
2020import qualified Data.Rope.UTF16 as Rope
2121import Data.Char
2222import Data.Maybe
23+import Data.List
2324import qualified Data.Text as T
2425
2526-- | Generate code actions.
@@ -97,6 +98,15 @@ suggestAction contents Diagnostic{_range=_range@Range{..},..}
9798 | exts@(_:_) <- filter (`Set.member` ghcExtensions) $ T.split (not . isAlpha) $ T.replace "-X" "" _message
9899 = [("Add " <> x <> " extension", [TextEdit (Range (Position 0 0) (Position 0 0)) $ "{-# LANGUAGE " <> x <> " #-}\n"]) | x <- exts]
99100
101+-- src/Development/IDE/Core/Compile.hs:58:1: error:
102+-- Could not find module ‘Data.Cha’
103+-- Perhaps you meant Data.Char (from base-4.12.0.0)
104+ | "Could not find module" `T.isInfixOf` _message
105+ , "Perhaps you meant" `T.isInfixOf` _message
106+ = map proposeModule $ nub $ findSuggestedModules _message where
107+ findSuggestedModules = (map (head . T.words) . drop 2 . T.lines)
108+ proposeModule mod = ("replace with " <> mod, [TextEdit _range mod])
109+
100110suggestAction _ _ = []
101111
102112mkRenameEdit :: Maybe T.Text -> Range -> T.Text -> TextEdit
test/exe/Main.hs+22
@@ -213,6 +213,7 @@ codeActionTests = testGroup "code actions"
213213 [ renameActionTests
214214 , typeWildCardActionTests
215215 , removeImportTests
216+ , importRenameActionTests
216217 ]
217218
218219renameActionTests :: TestTree
@@ -413,6 +414,27 @@ removeImportTests = testGroup "remove import actions"
413414 liftIO $ expectedContentAfterAction @=? contentAfterAction
414415 ]
415416
417+importRenameActionTests :: TestTree
418+importRenameActionTests = testGroup "import rename actions"
419+ [ testSession "Data.Mape -> Data.Map" $ check "Map"
420+ , testSession "Data.Mape -> Data.Maybe" $ check "Maybe" ] where
421+ check modname = do
422+ let content = T.unlines
423+ [ "module Testing where"
424+ , "import Data.Mape"
425+ ]
426+ doc <- openDoc' "Testing.hs" "haskell" content
427+ _ <- waitForDiagnostics
428+ actionsOrCommands <- getCodeActions doc (Range (Position 2 8) (Position 2 16))
429+ let [changeToMap] = [action | CACodeAction action@CodeAction{ _title = actionTitle } <- actionsOrCommands, ("Data." <> modname) `T.isInfixOf` actionTitle ]
430+ executeCodeAction changeToMap
431+ contentAfterAction <- documentContents doc
432+ let expectedContentAfterAction = T.unlines
433+ [ "module Testing where"
434+ , "import Data." <> modname
435+ ]
436+ liftIO $ expectedContentAfterAction @=? contentAfterAction
437+
416438----------------------------------------------------------------------
417439-- Utils
418440