@@ -17,6 +17,7 @@ import Development.IDE.Core.RuleTypes
1717import Development.IDE.Core.Service
1818import Development.IDE.Core.Shake
1919import Development.IDE.GHC.Error
20+ import Development.IDE.GHC.Util
2021import Development.IDE.LSP.Server
2122import Development.IDE.Types.Location
2223import Development.IDE.Types.Options
@@ -32,9 +33,13 @@ import Data.Maybe
3233import Data.List.Extra
3334import qualified Data.Text as T
3435import Data.Tuple.Extra ((&&&) )
36+ import HscTypes
37+ import OccName
38+ import Parser
39+ import RdrName
3540import Text.Regex.TDFA ((=~) , (=~~) )
3641import Text.Regex.TDFA.Text ()
37- import Outputable (ppr , showSDocUnsafe )
42+ import Outputable (showSDoc , ppr , showSDocUnsafe )
3843import DynFlags (xFlags , FlagSpec (.. ))
3944import GHC.LanguageExtensions.Type (Extension )
4045
@@ -54,12 +59,15 @@ codeAction lsp state (TextDocumentIdentifier uri) _range CodeActionContext{_diag
5459 -- logInfo (ideLogger ide) $ T.pack $ "Code action req: " ++ show arg
5560 contents <- LSP. getVirtualFileFunc lsp $ toNormalizedUri uri
5661 let text = Rope. toText . (_text :: VirtualFile -> Rope. Rope ) <$> contents
57- (ideOptions, parsedModule) <- runAction state $
58- (,) <$> getIdeOptions
59- <*> (getParsedModule . toNormalizedFilePath) `traverse` uriToFilePath uri
62+ mbFile = toNormalizedFilePath <$> uriToFilePath uri
63+ (ideOptions, parsedModule, env) <- runAction state $
64+ (,,) <$> getIdeOptions
65+ <*> getParsedModule `traverse` mbFile
66+ <*> use_ GhcSession `traverse` mbFile
67+ let dflags = hsc_dflags . hscEnv <$> env
6068 pure $ Right
6169 [ CACodeAction $ CodeAction title (Just CodeActionQuickFix ) (Just $ List [x]) (Just edit) Nothing
62- | x <- xs, (title, tedit) <- suggestAction ideOptions ( join parsedModule ) text x
70+ | x <- xs, (title, tedit) <- suggestAction dflags ideOptions ( join parsedModule ) text x
6371 , let edit = WorkspaceEdit (Just $ Map. singleton uri $ List tedit) Nothing
6472 ]
6573
@@ -98,10 +106,10 @@ executeAddSignatureCommand _lsp _ideState ExecuteCommandParams{..}
98106 | otherwise
99107 = return (Null , Nothing )
100108
101- suggestAction :: IdeOptions -> Maybe ParsedModule -> Maybe T. Text -> Diagnostic -> [(T. Text , [TextEdit ])]
102- suggestAction ideOptions parsedModule text diag = concat
109+ suggestAction :: Maybe DynFlags -> IdeOptions -> Maybe ParsedModule -> Maybe T. Text -> Diagnostic -> [(T. Text , [TextEdit ])]
110+ suggestAction dflags ideOptions parsedModule text diag = concat
103111 [ suggestAddExtension diag
104- , suggestExtendImport text diag
112+ , suggestExtendImport dflags text diag
105113 , suggestFillHole diag
106114 , suggestFillTypeWildcard diag
107115 , suggestFixConstructorImport text diag
@@ -268,20 +276,23 @@ suggestFillHole Diagnostic{_range=_range,..}
268276
269277 | otherwise = []
270278
271- suggestExtendImport :: Maybe T. Text -> Diagnostic -> [(T. Text , [TextEdit ])]
272- suggestExtendImport contents Diagnostic {_range= _range,.. }
279+ suggestExtendImport :: Maybe DynFlags -> Maybe T. Text -> Diagnostic -> [(T. Text , [TextEdit ])]
280+ suggestExtendImport ( Just dflags) contents Diagnostic {_range= _range,.. }
273281 | Just [binding, mod , srcspan] <-
274282 matchRegex _message
275283 " Perhaps you want to add ‘([^’]*)’ to the import list in the import of ‘([^’]*)’ *\\ ((.*)\\ ).$"
276284 , Just c <- contents
285+ , POk _ (L _ name) <- runParser dflags (T. unpack binding) parseIdentifier
277286 = let range = case [ x | (x," " ) <- readSrcSpan (T. unpack srcspan)] of
278287 [s] -> let x = srcSpanToRange s
279288 in x{_end = (_end x){_character = succ (_character (_end x))}}
280289 _ -> error " bug in srcspan parser"
281290 importLine = textInRange range c
291+ printedName = let rn = rdrNameOcc name in showSDoc dflags $ parenSymOcc rn (ppr rn)
282292 in [(" Add " <> binding <> " to the import list of " <> mod
283- , [TextEdit range (addBindingToImportList binding importLine)])]
293+ , [TextEdit range (addBindingToImportList ( T. pack printedName) importLine)])]
284294 | otherwise = []
295+ suggestExtendImport Nothing _ _ = []
285296
286297suggestFixConstructorImport :: Maybe T. Text -> Diagnostic -> [(T. Text , [TextEdit ])]
287298suggestFixConstructorImport _ Diagnostic {_range= _range,.. }
0 commit comments