@@ -6,9 +6,10 @@ module Development.IDE.Plugin.HLS
6
6
) where
7
7
8
8
import Control.Exception (SomeException , catch )
9
- import Control.Lens ( (^.) )
9
+ import Control.Lens ((^.) )
10
10
import Control.Monad
11
11
import qualified Data.Aeson as J
12
+ import qualified Data.DList as DList
12
13
import Data.Either
13
14
import qualified Data.List as List
14
15
import qualified Data.Map as Map
@@ -33,6 +34,7 @@ import Development.Shake (Rules)
33
34
import Ide.PluginUtils (getClientConfig , pluginEnabled , getPluginConfig , responseError , getProcessID )
34
35
import Development.IDE.Types.Logger (logInfo )
35
36
import Development.IDE.Core.Tracing
37
+ import Control.Concurrent.Async (mapConcurrently )
36
38
37
39
-- ---------------------------------------------------------------------
38
40
@@ -97,7 +99,7 @@ makeCodeAction cas lf ideState (CodeActionParams docId range context _) = do
97
99
if pluginEnabled pluginConfig plcCodeActionsOn
98
100
then otTracedProvider pid " codeAction" $ provider lf ideState pid docId range context
99
101
else return $ Right (List [] )
100
- r <- mapM makeAction cas
102
+ r <- mapConcurrently makeAction cas
101
103
let actions = filter wasRequested . foldMap unL $ rights r
102
104
res <- send caps actions
103
105
return $ Right res
@@ -171,7 +173,7 @@ makeCodeLens cas lf ideState params = do
171
173
doOneRight (pid, Right a) = [(pid,a)]
172
174
doOneRight (_, Left _) = []
173
175
174
- r <- mapM makeLens cas
176
+ r <- mapConcurrently makeLens cas
175
177
case breakdown r of
176
178
([] ,[] ) -> return $ Right $ List []
177
179
(es,[] ) -> return $ Left $ ResponseError InternalError (T. pack $ " codeLens failed:" ++ show es) Nothing
@@ -306,7 +308,7 @@ makeHover hps lf ideState params
306
308
if pluginEnabled pluginConfig plcHoverOn
307
309
then otTracedProvider pid " hover" $ p ideState params
308
310
else return $ Right Nothing
309
- mhs <- mapM makeHover hps
311
+ mhs <- mapConcurrently makeHover hps
310
312
-- TODO: We should support ServerCapabilities and declare that
311
313
-- we don't support hover requests during initialization if we
312
314
-- don't have any hover providers
@@ -361,7 +363,7 @@ makeSymbols sps lf ideState params
361
363
if pluginEnabled pluginConfig plcSymbolsOn
362
364
then otTracedProvider pid " symbols" $ p lf ideState params
363
365
else return $ Right []
364
- mhs <- mapM makeSymbols sps
366
+ mhs <- mapConcurrently makeSymbols sps
365
367
case rights mhs of
366
368
[] -> return $ Left $ responseError $ T. pack $ show $ lefts mhs
367
369
hs -> return $ Right $ convertSymbols $ concat hs
@@ -391,7 +393,7 @@ renameWith providers lspFuncs state params = do
391
393
then otTracedProvider pid " rename" $ p lspFuncs state params
392
394
else return $ Right $ WorkspaceEdit Nothing Nothing
393
395
-- TODO:AZ: we need to consider the right way to combine possible renamers
394
- results <- mapM makeAction providers
396
+ results <- mapConcurrently makeAction providers
395
397
case partitionEithers results of
396
398
(errors, [] ) -> return $ Left $ responseError $ T. pack $ show errors
397
399
(_, edits) -> return $ Right $ mconcat edits
@@ -436,22 +438,23 @@ makeCompletions :: [(PluginId, CompletionProvider IdeState)]
436
438
makeCompletions sps lf ideState params@ (CompletionParams (TextDocumentIdentifier doc) pos _context _mt)
437
439
= do
438
440
mprefix <- getPrefixAtPos lf doc pos
439
- _snippets <- WithSnippets . completionSnippetsOn <$> getClientConfig lf
441
+ maxCompletions <- maxCompletions <$> getClientConfig lf
440
442
441
443
let
442
444
combine :: [CompletionResponseResult ] -> CompletionResponseResult
443
- combine cs = go (Completions $ List [] ) cs
444
- where
445
- go acc [] = acc
446
- go (Completions (List ls)) (Completions (List ls2): rest)
447
- = go (Completions (List (ls <> ls2))) rest
448
- go (Completions (List ls)) (CompletionList (CompletionListType complete (List ls2)): rest)
449
- = go (CompletionList $ CompletionListType complete (List (ls <> ls2))) rest
450
- go (CompletionList (CompletionListType complete (List ls))) (CompletionList (CompletionListType complete2 (List ls2)): rest)
451
- = go (CompletionList $ CompletionListType (complete || complete2) (List (ls <> ls2))) rest
452
- go (CompletionList (CompletionListType complete (List ls))) (Completions (List ls2): rest)
453
- = go (CompletionList $ CompletionListType complete (List (ls <> ls2))) rest
454
- makeAction (pid,p) = do
445
+ combine cs = go True mempty cs
446
+
447
+ go ! comp acc [] =
448
+ CompletionList (CompletionListType comp (List $ DList. toList acc))
449
+ go comp acc (Completions (List ls) : rest) =
450
+ go comp (acc <> DList. fromList ls) rest
451
+ go comp acc (CompletionList (CompletionListType comp' (List ls)) : rest) =
452
+ go (comp && comp') (acc <> DList. fromList ls) rest
453
+
454
+ makeAction ::
455
+ (PluginId , CompletionProvider IdeState ) ->
456
+ IO (Either ResponseError CompletionResponseResult )
457
+ makeAction (pid, p) = do
455
458
pluginConfig <- getPluginConfig lf pid
456
459
if pluginEnabled pluginConfig plcCompletionOn
457
460
then otTracedProvider pid " completions" $ p lf ideState params
@@ -460,10 +463,19 @@ makeCompletions sps lf ideState params@(CompletionParams (TextDocumentIdentifier
460
463
case mprefix of
461
464
Nothing -> return $ Right $ Completions $ List []
462
465
Just _prefix -> do
463
- mhs <- mapM makeAction sps
466
+ mhs <- mapConcurrently makeAction sps
464
467
case rights mhs of
465
468
[] -> return $ Left $ responseError $ T. pack $ show $ lefts mhs
466
- hs -> return $ Right $ combine hs
469
+ hs -> return $ Right $ snd $ consumeCompletionResponse maxCompletions $ combine hs
470
+
471
+ -- | Crops a completion response. Returns the final number of completions and the cropped response
472
+ consumeCompletionResponse :: Int -> CompletionResponseResult -> (Int , CompletionResponseResult )
473
+ consumeCompletionResponse limit it@ (CompletionList (CompletionListType _ (List xx))) =
474
+ case splitAt limit xx of
475
+ (_, [] ) -> (limit - length xx, it)
476
+ (xx', _) -> (0 , CompletionList (CompletionListType False (List xx')))
477
+ consumeCompletionResponse n (Completions (List xx)) =
478
+ consumeCompletionResponse n (CompletionList (CompletionListType False (List xx)))
467
479
468
480
getPrefixAtPos :: LSP. LspFuncs Config -> Uri -> Position -> IO (Maybe VFS. PosPrefixInfo )
469
481
getPrefixAtPos lf uri pos = do
0 commit comments