on master help sign in
Merge pull request #52 from jacg/module-not-found-action
de7295aMoritz Kiefer
src/Development/IDE/LSP/CodeAction.hs+10
@@ -20,6 +20,7 @@ import Language.Haskell.LSP.Messages
20import qualified Data.Rope.UTF16 as Rope
20import qualified Data.Rope.UTF16 as Rope
21import Data.Char
21import Data.Char
22import Data.Maybe
22import Data.Maybe
23+import Data.List.Extra
23import qualified Data.Text as T
24import qualified Data.Text as T
24
25
25-- | Generate code actions.
26-- | Generate code actions.
@@ -97,6 +98,15 @@ suggestAction contents Diagnostic{_range=_range@Range{..},..}
97 | exts@(_:_) <- filter (`Set.member` ghcExtensions) $ T.split (not . isAlpha) $ T.replace "-X" "" _message
98 | exts@(_:_) <- filter (`Set.member` ghcExtensions) $ T.split (not . isAlpha) $ T.replace "-X" "" _message
98 = [("Add " <> x <> " extension", [TextEdit (Range (Position 0 0) (Position 0 0)) $ "{-# LANGUAGE " <> x <> " #-}\n"]) | x <- exts]
99 = [("Add " <> x <> " extension", [TextEdit (Range (Position 0 0) (Position 0 0)) $ "{-# LANGUAGE " <> x <> " #-}\n"]) | x <- exts]
99
100
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 $ nubOrd $ findSuggestedModules _message where
107+ findSuggestedModules = map (head . T.words) . drop 2 . T.lines
108+ proposeModule mod = ("replace with " <> mod, [TextEdit _range mod])
109+
100suggestAction _ _ = []
110suggestAction _ _ = []
101
111
102mkRenameEdit :: Maybe T.Text -> Range -> T.Text -> TextEdit
112mkRenameEdit :: Maybe T.Text -> Range -> T.Text -> TextEdit
test/exe/Main.hs+22
@@ -231,6 +231,7 @@ codeActionTests = testGroup "code actions"
231 [ renameActionTests
231 [ renameActionTests
232 , typeWildCardActionTests
232 , typeWildCardActionTests
233 , removeImportTests
233 , removeImportTests
234+ , importRenameActionTests
234 ]
235 ]
235
236
236renameActionTests :: TestTree
237renameActionTests :: TestTree
@@ -431,6 +432,27 @@ removeImportTests = testGroup "remove import actions"
431 liftIO $ expectedContentAfterAction @=? contentAfterAction
432 liftIO $ expectedContentAfterAction @=? contentAfterAction
432 ]
433 ]
433
434
435+importRenameActionTests :: TestTree
436+importRenameActionTests = testGroup "import rename actions"
437+ [ testSession "Data.Mape -> Data.Map" $ check "Map"
438+ , testSession "Data.Mape -> Data.Maybe" $ check "Maybe" ] where
439+ check modname = do
440+ let content = T.unlines
441+ [ "module Testing where"
442+ , "import Data.Mape"
443+ ]
444+ doc <- openDoc' "Testing.hs" "haskell" content
445+ _ <- waitForDiagnostics
446+ actionsOrCommands <- getCodeActions doc (Range (Position 2 8) (Position 2 16))
447+ let [changeToMap] = [action | CACodeAction action@CodeAction{ _title = actionTitle } <- actionsOrCommands, ("Data." <> modname) `T.isInfixOf` actionTitle ]
448+ executeCodeAction changeToMap
449+ contentAfterAction <- documentContents doc
450+ let expectedContentAfterAction = T.unlines
451+ [ "module Testing where"
452+ , "import Data." <> modname
453+ ]
454+ liftIO $ expectedContentAfterAction @=? contentAfterAction
455+
434----------------------------------------------------------------------
456----------------------------------------------------------------------
435-- Utils
457-- Utils
436
458