Skip to content

Commit

Permalink
Make find implementation run on a separate thread for each file
Browse files Browse the repository at this point in the history
  • Loading branch information
tgodzik committed Oct 15, 2019
1 parent b2f2adf commit 2add119
Showing 1 changed file with 32 additions and 20 deletions.
Expand Up @@ -27,6 +27,8 @@ import scala.collection.mutable
import scala.meta.internal.symtab.GlobalSymbolTable
import scala.util.control.NonFatal
import scala.meta.internal.mtags.Mtags
import scala.concurrent.ExecutionContext
import java.util.concurrent.ConcurrentLinkedQueue

final class ImplementationProvider(
semanticdbs: Semanticdbs,
Expand All @@ -35,7 +37,7 @@ final class ImplementationProvider(
buildTargets: BuildTargets,
buffer: Buffers,
definitionProvider: DefinitionProvider
) {
)(implicit ec: ExecutionContext) {
import ImplementationProvider._

private val globalTable = new GlobalClassTable(buildTargets)
Expand Down Expand Up @@ -81,7 +83,9 @@ final class ImplementationProvider(
}
}

def implementations(params: TextDocumentPositionParams): List[Location] = {
def implementations(
params: TextDocumentPositionParams
): List[Location] = {
val source = params.getTextDocument.getUri.toAbsolutePath
lazy val global = globalTable.globalSymbolTableFor(source)
val locations = for {
Expand Down Expand Up @@ -177,29 +181,37 @@ final class ImplementationProvider(
}

import TokenEditDistance.fromBuffer

val allLocations = new ConcurrentLinkedQueue[Location]
for {
classContext <- inheritanceContext.toIterable
plainParentSymbol <- classContext.findSymbol(symbol).toIterable
parentSymbol = addParameterSignatures(plainParentSymbol, classContext)
symbolClass <- classFromSymbol(parentSymbol, classContext.findSymbol)
(file, locations) <- findImplementation(symbolClass.symbol, classContext)
implPath = AbsolutePath(file)
implDocument <- findSemanticdb(implPath).toIterable
distance = fromBuffer(implPath, implDocument.text, buffer)
implLocation <- locations
implReal = implLocation.toRealNames(symbolClass, translateKey = true)
implSymbol <- findImplementationSymbol(
parentSymbol,
implDocument,
symbolClass,
classContext,
implReal
)
implOccurrence <- findDefOccurrence(implDocument, implSymbol, source)
range <- implOccurrence.range
revised <- distance.toRevised(range.toLSP)
} yield new Location(file.toUri.toString, revised)
parallelMap = findImplementation(
symbolClass.symbol,
classContext
).par
} parallelMap.foreach {
case (file, locations) =>
val implPath = AbsolutePath(file)
for {
implDocument <- findSemanticdb(implPath).toIterable
distance = fromBuffer(implPath, implDocument.text, buffer)
implLocation <- locations
implReal = implLocation.toRealNames(symbolClass, translateKey = true)
implSymbol <- findImplementationSymbol(
parentSymbol,
implDocument,
symbolClass,
classContext,
implReal
)
implOccurence <- findDefOccurrence(implDocument, implSymbol, source)
range <- implOccurence.range
revised <- distance.toRevised(range.toLSP)
} allLocations.add(new Location(file.toUri.toString, revised))
}
allLocations.asScala
}

private def findSemanticdb(fileSource: AbsolutePath): Option[TextDocument] =
Expand Down

0 comments on commit 2add119

Please sign in to comment.