@@ -6,9 +6,10 @@ module Development.IDE.Plugin.HLS
66 ) where
77
88import Control.Exception (SomeException , catch )
9- import Control.Lens ( (^.) )
9+ import Control.Lens ((^.) )
1010import Control.Monad
1111import qualified Data.Aeson as J
12+ import qualified Data.DList as DList
1213import Data.Either
1314import qualified Data.List as List
1415import qualified Data.Map as Map
@@ -33,6 +34,7 @@ import Development.Shake (Rules)
3334import Ide.PluginUtils (getClientConfig , pluginEnabled , getPluginConfig , responseError , getProcessID )
3435import Development.IDE.Types.Logger (logInfo )
3536import Development.IDE.Core.Tracing
37+ import Control.Concurrent.Async (mapConcurrently )
3638
3739-- ---------------------------------------------------------------------
3840
@@ -97,7 +99,7 @@ makeCodeAction cas lf ideState (CodeActionParams docId range context _) = do
9799 if pluginEnabled pluginConfig plcCodeActionsOn
98100 then otTracedProvider pid " codeAction" $ provider lf ideState pid docId range context
99101 else return $ Right (List [] )
100- r <- mapM makeAction cas
102+ r <- mapConcurrently makeAction cas
101103 let actions = filter wasRequested . foldMap unL $ rights r
102104 res <- send caps actions
103105 return $ Right res
@@ -171,7 +173,7 @@ makeCodeLens cas lf ideState params = do
171173 doOneRight (pid, Right a) = [(pid,a)]
172174 doOneRight (_, Left _) = []
173175
174- r <- mapM makeLens cas
176+ r <- mapConcurrently makeLens cas
175177 case breakdown r of
176178 ([] ,[] ) -> return $ Right $ List []
177179 (es,[] ) -> return $ Left $ ResponseError InternalError (T. pack $ " codeLens failed:" ++ show es) Nothing
@@ -306,7 +308,7 @@ makeHover hps lf ideState params
306308 if pluginEnabled pluginConfig plcHoverOn
307309 then otTracedProvider pid " hover" $ p ideState params
308310 else return $ Right Nothing
309- mhs <- mapM makeHover hps
311+ mhs <- mapConcurrently makeHover hps
310312 -- TODO: We should support ServerCapabilities and declare that
311313 -- we don't support hover requests during initialization if we
312314 -- don't have any hover providers
@@ -361,7 +363,7 @@ makeSymbols sps lf ideState params
361363 if pluginEnabled pluginConfig plcSymbolsOn
362364 then otTracedProvider pid " symbols" $ p lf ideState params
363365 else return $ Right []
364- mhs <- mapM makeSymbols sps
366+ mhs <- mapConcurrently makeSymbols sps
365367 case rights mhs of
366368 [] -> return $ Left $ responseError $ T. pack $ show $ lefts mhs
367369 hs -> return $ Right $ convertSymbols $ concat hs
@@ -391,7 +393,7 @@ renameWith providers lspFuncs state params = do
391393 then otTracedProvider pid " rename" $ p lspFuncs state params
392394 else return $ Right $ WorkspaceEdit Nothing Nothing
393395 -- TODO:AZ: we need to consider the right way to combine possible renamers
394- results <- mapM makeAction providers
396+ results <- mapConcurrently makeAction providers
395397 case partitionEithers results of
396398 (errors, [] ) -> return $ Left $ responseError $ T. pack $ show errors
397399 (_, edits) -> return $ Right $ mconcat edits
@@ -436,22 +438,23 @@ makeCompletions :: [(PluginId, CompletionProvider IdeState)]
436438makeCompletions sps lf ideState params@ (CompletionParams (TextDocumentIdentifier doc) pos _context _mt)
437439 = do
438440 mprefix <- getPrefixAtPos lf doc pos
439- _snippets <- WithSnippets . completionSnippetsOn <$> getClientConfig lf
441+ maxCompletions <- maxCompletions <$> getClientConfig lf
440442
441443 let
442444 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
455458 pluginConfig <- getPluginConfig lf pid
456459 if pluginEnabled pluginConfig plcCompletionOn
457460 then otTracedProvider pid " completions" $ p lf ideState params
@@ -460,10 +463,19 @@ makeCompletions sps lf ideState params@(CompletionParams (TextDocumentIdentifier
460463 case mprefix of
461464 Nothing -> return $ Right $ Completions $ List []
462465 Just _prefix -> do
463- mhs <- mapM makeAction sps
466+ mhs <- mapConcurrently makeAction sps
464467 case rights mhs of
465468 [] -> 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)))
467479
468480getPrefixAtPos :: LSP. LspFuncs Config -> Uri -> Position -> IO (Maybe VFS. PosPrefixInfo )
469481getPrefixAtPos lf uri pos = do
0 commit comments