Source:
<code>public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext invocationContext) { <START> ArrayList<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(); <END> IEditorPart editor = LSPEclipseUtils.getActiveTextEditor(); if (editor != null) { ITextEditor textEditor = (ITextEditor) editor; IDocument document = LSPEclipseUtils.getDocument(textEditor); if (document == null) { return NO_PROPOSALS; } infos = LanguageServiceAccessor.getLSPDocumentInfosFor(document, LSPCodeActionMarkerResolution::providesCodeActions); if (infos.isEmpty()) { return NO_PROPOSALS; } ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); try { this.range = new Range(LSPEclipseUtils.toPosition(selection.getOffset(), document), LSPEclipseUtils.toPosition(selection.getOffset() + selection.getLength(), document)); } catch (BadLocationException e) { LanguageServerPlugin.logError(e); } } CodeActionParams params = prepareCodeActionParams(infos); Set<CompletableFuture<?>> runningFutures = new HashSet<>(); for (LSPDocumentInfo info : this.infos) { final CompletableFuture<List<Either<Command, CodeAction>>> codeActions = info.getInitializedLanguageClient() .thenComposeAsync(languageServer -> languageServer.getTextDocumentService().codeAction(params)); runningFutures.add(codeActions); codeActions.thenAcceptAsync(actions -> { for (Either<Command, CodeAction> action : actions) { if (action != null) { CodeActionCompletionProposal proposal = new CodeActionCompletionProposal(action, info); proposals.add(proposal); } } runningFutures.remove(codeActions); }); } try { CompletableFuture.allOf(runningFutures.toArray(new CompletableFuture[runningFutures.size()])).get(200, TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException e) { LanguageServerPlugin.logError(e); } catch (TimeoutException e) { } if (!runningFutures.isEmpty()) { proposals.add(COMPUTING); } return proposals.toArray(new ICompletionProposal[proposals.size()]); }</code><technical_language>This list accessed multiple threads, needs "synchronized" List<ICompletionProposal> proposals = Collections.synchronizedList(new ArrayList<>());</technical_language>

Target:
public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext invocationContext) { List<ICompletionProposal> proposals = Collections.synchronizedList(new ArrayList<>()); IEditorPart editor = LSPEclipseUtils.getActiveTextEditor(); if (editor != null) { ITextEditor textEditor = (ITextEditor) editor; IDocument document = LSPEclipseUtils.getDocument(textEditor); if (document == null) { return NO_PROPOSALS; } infos = LanguageServiceAccessor.getLSPDocumentInfosFor(document, LSPCodeActionMarkerResolution::providesCodeActions); if (infos.isEmpty()) { return NO_PROPOSALS; } ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); try { this.range = new Range(LSPEclipseUtils.toPosition(selection.getOffset(), document), LSPEclipseUtils.toPosition(selection.getOffset() + selection.getLength(), document)); } catch (BadLocationException e) { LanguageServerPlugin.logError(e); } } CodeActionParams params = prepareCodeActionParams(infos); try { List<CompletableFuture<Void>> cfs = infos.stream() .map(info -> info.getInitializedLanguageClient() .thenComposeAsync(ls -> ls.getTextDocumentService().codeAction(params) .thenAcceptAsync(actions -> actions.stream().filter(Objects::nonNull) .map(action -> new CodeActionCompletionProposal(action, info)) .forEach(proposals::add)))) .collect(Collectors.toList()); CompletableFuture.allOf(cfs.toArray(new CompletableFuture[cfs.size()])).get(200, TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException e) { LanguageServerPlugin.logError(e); } catch (TimeoutException e) { proposals.add(COMPUTING); } return proposals.toArray(new ICompletionProposal[proposals.size()]); }