9393import org .eclipse .lsp4j .jsonrpc .messages .Either ;
9494import org .eclipse .lsp4j .jsonrpc .messages .Either3 ;
9595import org .eclipse .lsp4j .services .TextDocumentService ;
96+ import org .springframework .scheduling .concurrent .CustomizableThreadFactory ;
9697import org .springframework .stereotype .Component ;
9798
9899import java .net .URI ;
99100import java .util .Collections ;
100101import java .util .List ;
101102import java .util .concurrent .CompletableFuture ;
102- import java .util .stream .Collectors ;
103+ import java .util .concurrent .ExecutorService ;
104+ import java .util .concurrent .Executors ;
103105
104106@ Component
105107@ RequiredArgsConstructor
@@ -123,14 +125,17 @@ public class BSLTextDocumentService implements TextDocumentService, ProtocolExte
123125 private final RenameProvider renameProvider ;
124126 private final InlayHintProvider inlayHintProvider ;
125127
128+ private final ExecutorService executorService = Executors .newCachedThreadPool (new CustomizableThreadFactory ("text-document-service-" ));
129+
126130 @ Override
127131 public CompletableFuture <Hover > hover (HoverParams params ) {
128132 var documentContext = context .getDocument (params .getTextDocument ().getUri ());
129133 if (documentContext == null ) {
130134 return CompletableFuture .completedFuture (null );
131135 }
132- return CompletableFuture .supplyAsync (() ->
133- hoverProvider .getHover (documentContext , params ).orElse (null )
136+ return CompletableFuture .supplyAsync (
137+ () -> hoverProvider .getHover (documentContext , params ).orElse (null ),
138+ executorService
134139 );
135140 }
136141
@@ -143,8 +148,9 @@ public CompletableFuture<Either<List<? extends Location>, List<? extends Locatio
143148 return CompletableFuture .completedFuture (Either .forRight (Collections .emptyList ()));
144149 }
145150
146- return CompletableFuture .supplyAsync (() ->
147- Either .forRight (definitionProvider .getDefinition (documentContext , params ))
151+ return CompletableFuture .supplyAsync (
152+ () -> Either .forRight (definitionProvider .getDefinition (documentContext , params )),
153+ executorService
148154 );
149155 }
150156
@@ -155,7 +161,10 @@ public CompletableFuture<List<? extends Location>> references(ReferenceParams pa
155161 return CompletableFuture .completedFuture (Collections .emptyList ());
156162 }
157163
158- return CompletableFuture .supplyAsync (() -> referencesProvider .getReferences (documentContext , params ));
164+ return CompletableFuture .supplyAsync (
165+ () -> referencesProvider .getReferences (documentContext , params ),
166+ executorService
167+ );
159168 }
160169
161170 @ Override
@@ -167,10 +176,11 @@ public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> docume
167176 return CompletableFuture .completedFuture (null );
168177 }
169178
170- return CompletableFuture .supplyAsync (() ->
171- documentSymbolProvider .getDocumentSymbols (documentContext ).stream ()
179+ return CompletableFuture .supplyAsync (
180+ () -> documentSymbolProvider .getDocumentSymbols (documentContext ).stream ()
172181 .map (Either ::<SymbolInformation , DocumentSymbol >forRight )
173- .collect (Collectors .toList ())
182+ .toList (),
183+ executorService
174184 );
175185 }
176186
@@ -181,7 +191,10 @@ public CompletableFuture<List<Either<Command, CodeAction>>> codeAction(CodeActio
181191 return CompletableFuture .completedFuture (null );
182192 }
183193
184- return CompletableFuture .supplyAsync (() -> codeActionProvider .getCodeActions (params , documentContext ));
194+ return CompletableFuture .supplyAsync (
195+ () -> codeActionProvider .getCodeActions (params , documentContext ),
196+ executorService
197+ );
185198 }
186199
187200 @ Override
@@ -191,7 +204,10 @@ public CompletableFuture<List<? extends CodeLens>> codeLens(CodeLensParams param
191204 return CompletableFuture .completedFuture (Collections .emptyList ());
192205 }
193206
194- return CompletableFuture .supplyAsync (() -> codeLensProvider .getCodeLens (documentContext ));
207+ return CompletableFuture .supplyAsync (
208+ () -> codeLensProvider .getCodeLens (documentContext ),
209+ executorService
210+ );
195211 }
196212
197213 @ Override
@@ -201,7 +217,10 @@ public CompletableFuture<CodeLens> resolveCodeLens(CodeLens unresolved) {
201217 if (documentContext == null ) {
202218 return CompletableFuture .completedFuture (unresolved );
203219 }
204- return CompletableFuture .supplyAsync (() -> codeLensProvider .resolveCodeLens (documentContext , unresolved , data ));
220+ return CompletableFuture .supplyAsync (
221+ () -> codeLensProvider .resolveCodeLens (documentContext , unresolved , data ),
222+ executorService
223+ );
205224 }
206225
207226 @ Override
@@ -211,8 +230,10 @@ public CompletableFuture<List<? extends TextEdit>> formatting(DocumentFormatting
211230 return CompletableFuture .completedFuture (null );
212231 }
213232
214- List <TextEdit > edits = formatProvider .getFormatting (params , documentContext );
215- return CompletableFuture .completedFuture (edits );
233+ return CompletableFuture .supplyAsync (
234+ () -> formatProvider .getFormatting (params , documentContext ),
235+ executorService
236+ );
216237 }
217238
218239 @ Override
@@ -222,8 +243,10 @@ public CompletableFuture<List<? extends TextEdit>> rangeFormatting(DocumentRange
222243 return CompletableFuture .completedFuture (null );
223244 }
224245
225- List <TextEdit > edits = formatProvider .getRangeFormatting (params , documentContext );
226- return CompletableFuture .completedFuture (edits );
246+ return CompletableFuture .supplyAsync (
247+ () -> formatProvider .getRangeFormatting (params , documentContext ),
248+ executorService
249+ );
227250 }
228251
229252 @ Override
@@ -233,7 +256,10 @@ public CompletableFuture<List<FoldingRange>> foldingRange(FoldingRangeRequestPar
233256 return CompletableFuture .completedFuture (null );
234257 }
235258
236- return CompletableFuture .supplyAsync (() -> foldingRangeProvider .getFoldingRange (documentContext ));
259+ return CompletableFuture .supplyAsync (
260+ () -> foldingRangeProvider .getFoldingRange (documentContext ),
261+ executorService
262+ );
237263 }
238264
239265 @ Override
@@ -244,13 +270,15 @@ public CompletableFuture<List<CallHierarchyItem>> prepareCallHierarchy(CallHiera
244270 return CompletableFuture .completedFuture (null );
245271 }
246272
247- return CompletableFuture .supplyAsync (() -> {
248- List <CallHierarchyItem > callHierarchyItems = callHierarchyProvider .prepareCallHierarchy (documentContext , params );
249- if (callHierarchyItems .isEmpty ()) {
250- return null ;
251- }
252- return callHierarchyItems ;
253- });
273+ return CompletableFuture .supplyAsync (
274+ () -> {
275+ List <CallHierarchyItem > callHierarchyItems = callHierarchyProvider .prepareCallHierarchy (documentContext , params );
276+ if (callHierarchyItems .isEmpty ()) {
277+ return null ;
278+ }
279+ return callHierarchyItems ;
280+ },
281+ executorService );
254282 }
255283
256284 @ Override
@@ -262,7 +290,10 @@ public CompletableFuture<List<CallHierarchyIncomingCall>> callHierarchyIncomingC
262290 return CompletableFuture .completedFuture (Collections .emptyList ());
263291 }
264292
265- return CompletableFuture .supplyAsync (() -> callHierarchyProvider .incomingCalls (documentContext , params ));
293+ return CompletableFuture .supplyAsync (
294+ () -> callHierarchyProvider .incomingCalls (documentContext , params ),
295+ executorService
296+ );
266297 }
267298
268299 @ Override
@@ -274,7 +305,10 @@ public CompletableFuture<List<CallHierarchyOutgoingCall>> callHierarchyOutgoingC
274305 return CompletableFuture .completedFuture (Collections .emptyList ());
275306 }
276307
277- return CompletableFuture .supplyAsync (() -> callHierarchyProvider .outgoingCalls (documentContext , params ));
308+ return CompletableFuture .supplyAsync (
309+ () -> callHierarchyProvider .outgoingCalls (documentContext , params ),
310+ executorService
311+ );
278312 }
279313
280314 @ Override
@@ -284,7 +318,10 @@ public CompletableFuture<List<SelectionRange>> selectionRange(SelectionRangePara
284318 return CompletableFuture .completedFuture (Collections .emptyList ());
285319 }
286320
287- return CompletableFuture .supplyAsync (() -> selectionRangeProvider .getSelectionRange (documentContext , params ));
321+ return CompletableFuture .supplyAsync (
322+ () -> selectionRangeProvider .getSelectionRange (documentContext , params ),
323+ executorService
324+ );
288325 }
289326
290327 @ Override
@@ -294,7 +331,10 @@ public CompletableFuture<List<ColorInformation>> documentColor(DocumentColorPara
294331 return CompletableFuture .completedFuture (Collections .emptyList ());
295332 }
296333
297- return CompletableFuture .supplyAsync (() -> colorProvider .getDocumentColor (documentContext ));
334+ return CompletableFuture .supplyAsync (
335+ () -> colorProvider .getDocumentColor (documentContext ),
336+ executorService
337+ );
298338 }
299339
300340 @ Override
@@ -304,7 +344,10 @@ public CompletableFuture<List<ColorPresentation>> colorPresentation(ColorPresent
304344 return CompletableFuture .completedFuture (Collections .emptyList ());
305345 }
306346
307- return CompletableFuture .supplyAsync (() -> colorProvider .getColorPresentation (documentContext , params ));
347+ return CompletableFuture .supplyAsync (
348+ () -> colorProvider .getColorPresentation (documentContext , params ),
349+ executorService
350+ );
308351 }
309352
310353 @ Override
@@ -314,7 +357,10 @@ public CompletableFuture<List<InlayHint>> inlayHint(InlayHintParams params) {
314357 return CompletableFuture .completedFuture (Collections .emptyList ());
315358 }
316359
317- return CompletableFuture .supplyAsync (() -> inlayHintProvider .getInlayHint (documentContext , params ));
360+ return CompletableFuture .supplyAsync (
361+ () -> inlayHintProvider .getInlayHint (documentContext , params ),
362+ executorService
363+ );
318364 }
319365
320366 @ Override
@@ -380,7 +426,10 @@ public CompletableFuture<List<DocumentLink>> documentLink(DocumentLinkParams par
380426 return CompletableFuture .completedFuture (null );
381427 }
382428
383- return CompletableFuture .supplyAsync (() -> documentLinkProvider .getDocumentLinks (documentContext ));
429+ return CompletableFuture .supplyAsync (
430+ () -> documentLinkProvider .getDocumentLinks (documentContext ),
431+ executorService
432+ );
384433 }
385434
386435 @ Override
@@ -397,7 +446,7 @@ public CompletableFuture<Diagnostics> diagnostics(DiagnosticParams params) {
397446 if (range != null ) {
398447 diagnostics = diagnostics .stream ()
399448 .filter (diagnostic -> Ranges .containsRange (range , diagnostic .getRange ()))
400- .collect ( Collectors . toList () );
449+ .toList ();
401450 }
402451 return new Diagnostics (diagnostics , documentContext .getVersion ());
403452 });
@@ -410,8 +459,10 @@ public CompletableFuture<Either3<Range, PrepareRenameResult, PrepareRenameDefaul
410459 return CompletableFuture .completedFuture (null );
411460 }
412461
413- return CompletableFuture .supplyAsync (() ->
414- Either3 .forFirst (renameProvider .getPrepareRename (documentContext , params )));
462+ return CompletableFuture .supplyAsync (
463+ () -> Either3 .forFirst (renameProvider .getPrepareRename (documentContext , params )),
464+ executorService
465+ );
415466 }
416467
417468 @ Override
@@ -421,7 +472,10 @@ public CompletableFuture<WorkspaceEdit> rename(RenameParams params) {
421472 return CompletableFuture .completedFuture (null );
422473 }
423474
424- return CompletableFuture .supplyAsync (() -> renameProvider .getRename (documentContext , params ));
475+ return CompletableFuture .supplyAsync (
476+ () -> renameProvider .getRename (documentContext , params ),
477+ executorService
478+ );
425479 }
426480
427481 public void reset () {
0 commit comments