@@ -34,6 +34,7 @@ import Development.Shake (Rules)
34
34
import Ide.PluginUtils (getClientConfig , pluginEnabled , getPluginConfig , responseError , getProcessID )
35
35
import Development.IDE.Types.Logger (logInfo )
36
36
import Development.IDE.Core.Tracing
37
+ import Control.Concurrent.Async (mapConcurrently )
37
38
38
39
-- ---------------------------------------------------------------------
39
40
@@ -437,7 +438,7 @@ makeCompletions :: [(PluginId, CompletionProvider IdeState)]
437
438
makeCompletions sps lf ideState params@ (CompletionParams (TextDocumentIdentifier doc) pos _context _mt)
438
439
= do
439
440
mprefix <- getPrefixAtPos lf doc pos
440
- config <- getClientConfig lf
441
+ maxCompletions <- maxCompletions <$> getClientConfig lf
441
442
442
443
let
443
444
combine :: [CompletionResponseResult ] -> CompletionResponseResult
@@ -450,37 +451,28 @@ makeCompletions sps lf ideState params@(CompletionParams (TextDocumentIdentifier
450
451
go comp acc (CompletionList (CompletionListType comp' (List ls)) : rest) =
451
452
go (comp && comp') (acc <> DList. fromList ls) rest
452
453
453
- -- | Process a list of completion providers until we reach a max number of results
454
454
makeAction ::
455
- Int ->
456
- [(PluginId , CompletionProvider IdeState )] ->
457
- IO [Either ResponseError CompletionResponseResult ]
458
- makeAction 0 _ = return []
459
- makeAction _ [] = return []
460
- makeAction limit ((pid, p) : rest) = do
455
+ (PluginId , CompletionProvider IdeState ) ->
456
+ IO (Either ResponseError CompletionResponseResult )
457
+ makeAction (pid, p) = do
461
458
pluginConfig <- getPluginConfig lf pid
462
- results <- if pluginEnabled pluginConfig plcCompletionOn
459
+ if pluginEnabled pluginConfig plcCompletionOn
463
460
then otTracedProvider pid " completions" $ p lf ideState params
464
461
else return $ Right $ Completions $ List []
465
- case results of
466
- Right resp -> do
467
- let (limit', results') = consumeCompletionResponse limit resp
468
- (Right results' : ) <$> makeAction limit' rest
469
- Left err ->
470
- (Left err : ) <$> makeAction limit rest
471
462
472
463
case mprefix of
473
464
Nothing -> return $ Right $ Completions $ List []
474
465
Just _prefix -> do
475
- mhs <- makeAction (maxCompletions config) sps
466
+ mhs <- mapConcurrently makeAction sps
476
467
case rights mhs of
477
468
[] -> return $ Left $ responseError $ T. pack $ show $ lefts mhs
478
- hs -> return $ Right $ combine hs
469
+ hs -> return $ Right $ snd $ consumeCompletionResponse maxCompletions $ combine hs
479
470
480
471
-- | Crops a completion response. Returns the final number of completions and the cropped response
481
472
consumeCompletionResponse :: Int -> CompletionResponseResult -> (Int , CompletionResponseResult )
482
473
consumeCompletionResponse limit it@ (CompletionList (CompletionListType _ (List xx))) =
483
474
case splitAt limit xx of
475
+ (_, [] ) -> (limit - length xx, it)
484
476
(xx', _) -> (0 , CompletionList (CompletionListType False (List xx')))
485
477
consumeCompletionResponse n (Completions (List xx)) =
486
478
consumeCompletionResponse n (CompletionList (CompletionListType False (List xx)))
0 commit comments