@@ -10,40 +10,40 @@ module Development.IDE.Plugin.Completions
10
10
11
11
import Control.Concurrent.Async (concurrently )
12
12
import Control.Concurrent.STM.Stats (readTVarIO )
13
- import Control.Monad.Extra
14
13
import Control.Monad.IO.Class
15
- import Control.Monad.Trans.Maybe
14
+ import Control.Lens ( (&) , (.~) )
16
15
import Data.Aeson
17
16
import qualified Data.HashMap.Strict as Map
18
17
import qualified Data.HashSet as Set
19
- import Data.List (find )
20
18
import Data.Maybe
21
19
import qualified Data.Text as T
22
20
import Development.IDE.Core.PositionMapping
21
+ import Development.IDE.Core.Compile
23
22
import Development.IDE.Core.RuleTypes
24
23
import Development.IDE.Core.Service hiding (Log , LogShake )
25
24
import Development.IDE.Core.Shake hiding (Log )
26
25
import qualified Development.IDE.Core.Shake as Shake
27
26
import Development.IDE.GHC.Compat
28
- import Development.IDE.GHC.Error (rangeToSrcSpan )
29
27
import Development.IDE.GHC.Util (printOutputable )
30
28
import Development.IDE.Graph
29
+ import Development.IDE.Spans.Common
30
+ import Development.IDE.Spans.Documentation
31
31
import Development.IDE.Plugin.Completions.Logic
32
32
import Development.IDE.Plugin.Completions.Types
33
33
import Development.IDE.Types.Exports
34
- import Development.IDE.Types.HscEnvEq (HscEnvEq (envPackageExports ),
34
+ import Development.IDE.Types.HscEnvEq (HscEnvEq (envPackageExports , envVisibleModuleNames ),
35
35
hscEnv )
36
36
import qualified Development.IDE.Types.KnownTargets as KT
37
37
import Development.IDE.Types.Location
38
38
import Development.IDE.Types.Logger (Pretty (pretty ),
39
39
Recorder ,
40
40
WithPriority ,
41
41
cmapWithPrio )
42
- import GHC.Exts (fromList , toList )
43
42
import Ide.Plugin.Config (Config )
44
43
import Ide.Types
45
44
import qualified Language.LSP.Server as LSP
46
45
import Language.LSP.Types
46
+ import qualified Language.LSP.Types.Lens as J
47
47
import qualified Language.LSP.VFS as VFS
48
48
import Numeric.Natural
49
49
import Text.Fuzzy.Parallel (Scored (.. ))
@@ -64,10 +64,12 @@ descriptor :: Recorder (WithPriority Log) -> PluginId -> PluginDescriptor IdeSta
64
64
descriptor recorder plId = (defaultPluginDescriptor plId)
65
65
{ pluginRules = produceCompletions recorder
66
66
, pluginHandlers = mkPluginHandler STextDocumentCompletion getCompletionsLSP
67
+ <> mkPluginHandler SCompletionItemResolve resolveCompletion
67
68
, pluginConfigDescriptor = defaultConfigDescriptor {configCustomConfig = mkCustomConfig properties}
68
69
, pluginPriority = ghcideCompletionsPluginPriority
69
70
}
70
71
72
+
71
73
produceCompletions :: Recorder (WithPriority Log ) -> Rules ()
72
74
produceCompletions recorder = do
73
75
define (cmapWithPrio LogShake recorder) $ \ LocalCompletions file -> do
@@ -92,8 +94,9 @@ produceCompletions recorder = do
92
94
(global, inScope) <- liftIO $ tcRnImportDecls env (dropListFromImportDecl <$> msrImports) `concurrently` tcRnImportDecls env msrImports
93
95
case (global, inScope) of
94
96
((_, Just globalEnv), (_, Just inScopeEnv)) -> do
97
+ visibleMods <- liftIO $ fmap (fromMaybe [] ) $ envVisibleModuleNames sess
95
98
let uri = fromNormalizedUri $ normalizedFilePathToUri file
96
- cdata <- liftIO $ cacheDataProducer uri sess (ms_mod msrModSummary) globalEnv inScopeEnv msrImports
99
+ let cdata = cacheDataProducer uri visibleMods (ms_mod msrModSummary) globalEnv inScopeEnv msrImports
97
100
return ([] , Just cdata)
98
101
(_diag, _) ->
99
102
return ([] , Nothing )
@@ -109,6 +112,44 @@ dropListFromImportDecl iDecl = let
109
112
f x = x
110
113
in f <$> iDecl
111
114
115
+ resolveCompletion :: IdeState -> PluginId -> CompletionItem -> LSP. LspM Config (Either ResponseError CompletionItem )
116
+ resolveCompletion ide _ comp@ CompletionItem {_detail,_documentation,_xdata}
117
+ | Just resolveData <- _xdata
118
+ , Success (uri, NameDetails mod occ) <- fromJSON resolveData
119
+ , Just file <- uriToNormalizedFilePath $ toNormalizedUri uri = do
120
+ mdkm <- liftIO $ runAction " Completion resolve" ide $ use GetDocMap file
121
+ case mdkm of
122
+ Nothing -> pure (Right comp)
123
+ Just (DKMap dm km) -> liftIO $ runAction " Completion resolve" ide $ do
124
+ let nc = ideNc $ shakeExtras ide
125
+ #if MIN_VERSION_ghc(9,3,0)
126
+ name <- liftIO $ lookupNameCache nc mod occ
127
+ #else
128
+ name <- liftIO $ upNameCache nc (lookupNameCache mod occ)
129
+ #endif
130
+ (ms,_) <- useWithStale_ GetModSummaryWithoutTimestamps file
131
+ (sess,_) <- useWithStale_ GhcSessionDeps file
132
+ let cur_mod = ms_mod $ msrModSummary ms
133
+ doc <- case lookupNameEnv dm name of
134
+ Just doc -> pure $ spanDocToMarkdown doc
135
+ Nothing -> liftIO $ spanDocToMarkdown <$> getDocumentationTryGhc (hscEnv sess) cur_mod name
136
+ typ <- case lookupNameEnv km name of
137
+ Just ty -> pure (safeTyThingType ty)
138
+ Nothing -> do
139
+ (safeTyThingType =<< ) <$> liftIO (lookupName (hscEnv sess) cur_mod name)
140
+ let det1 = case typ of
141
+ Just ty -> Just (" :: " <> printOutputable ty <> " \n " )
142
+ Nothing -> Nothing
143
+ doc1 = case _documentation of
144
+ Just (CompletionDocMarkup (MarkupContent MkMarkdown old)) ->
145
+ CompletionDocMarkup $ MarkupContent MkMarkdown $ T. intercalate sectionSeparator (old: doc)
146
+ _ -> CompletionDocMarkup $ MarkupContent MkMarkdown $ T. intercalate sectionSeparator doc
147
+ pure (Right $ comp & J. detail .~ (det1 <> _detail)
148
+ & J. documentation .~ Just doc1
149
+ )
150
+
151
+ resolveCompletion _ _ comp = pure (Right comp)
152
+
112
153
-- | Generate code actions.
113
154
getCompletionsLSP
114
155
:: IdeState
@@ -166,8 +207,7 @@ getCompletionsLSP ide plId
166
207
let clientCaps = clientCapabilities $ shakeExtras ide
167
208
plugins = idePlugins $ shakeExtras ide
168
209
config <- getCompletionsConfig plId
169
-
170
- allCompletions <- liftIO $ getCompletions plugins ideOpts cci' parsedMod astres bindMap pfix clientCaps config moduleExports
210
+ allCompletions <- liftIO $ getCompletions plugins ideOpts cci' parsedMod astres bindMap pfix' clientCaps config moduleExports uri
171
211
pure $ InL (List $ orderedCompletions allCompletions)
172
212
_ -> return (InL $ List [] )
173
213
_ -> return (InL $ List [] )
0 commit comments