@@ -17,6 +17,7 @@ import Development.IDE.Core.RuleTypes
17
17
import Development.IDE.Core.Service
18
18
import Development.IDE.Core.Shake
19
19
import Development.IDE.GHC.Error
20
+ import Development.IDE.GHC.Util
20
21
import Development.IDE.LSP.Server
21
22
import Development.IDE.Types.Location
22
23
import Development.IDE.Types.Options
@@ -32,9 +33,13 @@ import Data.Maybe
32
33
import Data.List.Extra
33
34
import qualified Data.Text as T
34
35
import Data.Tuple.Extra ((&&&) )
36
+ import HscTypes
37
+ import OccName
38
+ import Parser
39
+ import RdrName
35
40
import Text.Regex.TDFA ((=~) , (=~~) )
36
41
import Text.Regex.TDFA.Text ()
37
- import Outputable (ppr , showSDocUnsafe )
42
+ import Outputable (showSDoc , ppr , showSDocUnsafe )
38
43
import DynFlags (xFlags , FlagSpec (.. ))
39
44
import GHC.LanguageExtensions.Type (Extension )
40
45
@@ -54,12 +59,15 @@ codeAction lsp state (TextDocumentIdentifier uri) _range CodeActionContext{_diag
54
59
-- logInfo (ideLogger ide) $ T.pack $ "Code action req: " ++ show arg
55
60
contents <- LSP. getVirtualFileFunc lsp $ toNormalizedUri uri
56
61
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
60
68
pure $ Right
61
69
[ 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
63
71
, let edit = WorkspaceEdit (Just $ Map. singleton uri $ List tedit) Nothing
64
72
]
65
73
@@ -98,10 +106,10 @@ executeAddSignatureCommand _lsp _ideState ExecuteCommandParams{..}
98
106
| otherwise
99
107
= return (Null , Nothing )
100
108
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
103
111
[ suggestAddExtension diag
104
- , suggestExtendImport text diag
112
+ , suggestExtendImport dflags text diag
105
113
, suggestFillHole diag
106
114
, suggestFillTypeWildcard diag
107
115
, suggestFixConstructorImport text diag
@@ -268,20 +276,23 @@ suggestFillHole Diagnostic{_range=_range,..}
268
276
269
277
| otherwise = []
270
278
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,.. }
273
281
| Just [binding, mod , srcspan] <-
274
282
matchRegex _message
275
283
" Perhaps you want to add ‘([^’]*)’ to the import list in the import of ‘([^’]*)’ *\\ ((.*)\\ ).$"
276
284
, Just c <- contents
285
+ , POk _ (L _ name) <- runParser dflags (T. unpack binding) parseIdentifier
277
286
= let range = case [ x | (x," " ) <- readSrcSpan (T. unpack srcspan)] of
278
287
[s] -> let x = srcSpanToRange s
279
288
in x{_end = (_end x){_character = succ (_character (_end x))}}
280
289
_ -> error " bug in srcspan parser"
281
290
importLine = textInRange range c
291
+ printedName = let rn = rdrNameOcc name in showSDoc dflags $ parenSymOcc rn (ppr rn)
282
292
in [(" Add " <> binding <> " to the import list of " <> mod
283
- , [TextEdit range (addBindingToImportList binding importLine)])]
293
+ , [TextEdit range (addBindingToImportList ( T. pack printedName) importLine)])]
284
294
| otherwise = []
295
+ suggestExtendImport Nothing _ _ = []
285
296
286
297
suggestFixConstructorImport :: Maybe T. Text -> Diagnostic -> [(T. Text , [TextEdit ])]
287
298
suggestFixConstructorImport _ Diagnostic {_range= _range,.. }
0 commit comments