diff --git a/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/emitter/JsonEmitter.java b/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/emitter/JsonEmitter.java index 6724718..58523f1 100644 --- a/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/emitter/JsonEmitter.java +++ b/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/emitter/JsonEmitter.java @@ -33,7 +33,7 @@ public void start() { * .lsif.core.internal.protocol.Element) */ @Override - public void emit(Element element) { + public synchronized void emit(Element element) { if (!isFirst) { LanguageServerIndexerPlugin.println(","); } diff --git a/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/emitter/LineEmitter.java b/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/emitter/LineEmitter.java index 4e401e3..ebd4011 100644 --- a/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/emitter/LineEmitter.java +++ b/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/emitter/LineEmitter.java @@ -29,7 +29,7 @@ public void start() { * .lsif.core.internal.protocol.Element) */ @Override - public void emit(Element element) { + public synchronized void emit(Element element) { LanguageServerIndexerPlugin.println(JsonParser.toJson(element)); } diff --git a/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/indexer/Indexer.java b/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/indexer/Indexer.java index 48eab94..2258d8e 100644 --- a/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/indexer/Indexer.java +++ b/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/indexer/Indexer.java @@ -1,9 +1,12 @@ package com.microsoft.java.lsif.core.internal.indexer; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; @@ -22,6 +25,7 @@ import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.lsp4j.ClientCapabilities; +import com.microsoft.java.lsif.core.internal.LanguageServerIndexerPlugin; import com.microsoft.java.lsif.core.internal.emitter.Emitter; import com.microsoft.java.lsif.core.internal.emitter.JsonEmitter; import com.microsoft.java.lsif.core.internal.emitter.LineEmitter; @@ -109,14 +113,27 @@ private void buildIndex(IPath path, IProgressMonitor monitor, Emitter emitter, L .enlist(sourceFile); currentContext.setDocVertex(docVertex); + List> completableFutures = new ArrayList<>(); for (ProtocolVisitor vis : this.visitors) { vis.setContext(currentContext); - cu.accept(vis); + completableFutures.add(CompletableFuture.runAsync(() -> { + cu.accept(vis); + })); } - // Dump diagnostic information DiagnosticVisitor diagnosticVisitor = new DiagnosticVisitor(currentContext, cu); - diagnosticVisitor.enlist(); + completableFutures.add(CompletableFuture.runAsync(() -> { + diagnosticVisitor.enlist(); + })); + try { + CompletableFuture + .allOf(completableFutures + .toArray(new CompletableFuture[completableFutures.size()])) + .get(); + } catch (InterruptedException | ExecutionException e) { + LanguageServerIndexerPlugin.logException("Exception occurs when indexing: ", + e); + } } } } diff --git a/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/indexer/Repository.java b/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/indexer/Repository.java index 7cfb189..68e3708 100644 --- a/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/indexer/Repository.java +++ b/com.microsoft.java.lsif.core/src/com/microsoft/java/lsif/core/internal/indexer/Repository.java @@ -5,8 +5,8 @@ package com.microsoft.java.lsif.core.internal.indexer; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import com.microsoft.java.lsif.core.internal.protocol.Document; import com.microsoft.java.lsif.core.internal.protocol.HoverResult; @@ -17,21 +17,21 @@ public class Repository { // Key: document URI // Value: Document object - private Map documentMap = new HashMap<>(); + private Map documentMap = new ConcurrentHashMap<>(); // Key: document URI // Value: ranges among the documents // Key: LSP range // LSIF: range - private Map> rangeMap = new HashMap<>(); + private Map> rangeMap = new ConcurrentHashMap<>(); // Key: Range // Value: ResultSet that range refers to - private Map resultSetMap = new HashMap<>(); + private Map resultSetMap = new ConcurrentHashMap<>(); // Key: Hash Code of the Hover Content // Value: HoverResult - private Map hoverResultMap = new HashMap<>(); + private Map hoverResultMap = new ConcurrentHashMap<>(); private static Repository instance = new Repository(); @@ -48,7 +48,7 @@ public void addDocument(Document doc) { public void addRange(Document owner, org.eclipse.lsp4j.Range lspRange, Range range) { Map ranges = this.rangeMap.computeIfAbsent(owner.getUri(), - s -> new HashMap<>()); + s -> new ConcurrentHashMap<>()); ranges.putIfAbsent(lspRange, range); }