Skip to content

Commit 29edf32

Browse files
committed
Cache computation of dependent projects
1 parent 5caf85e commit 29edf32

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import Comments._, Contexts._, Flags._, Names._, NameOps._, Symbols._, SymDenota
2323
import classpath.ClassPathEntries
2424
import reporting._, reporting.diagnostic.{Message, MessageContainer, messages}
2525
import typer.Typer
26-
import util._
26+
import util.{Set => _, _}
2727
import interactive._, interactive.InteractiveDriver._
2828
import Interactive.Include
2929
import config.Printers.interactiv
@@ -60,6 +60,8 @@ class DottyLanguageServer extends LanguageServer
6060

6161
private[this] var myDrivers: mutable.Map[ProjectConfig, InteractiveDriver] = _
6262

63+
private[this] var myDependentProjects: mutable.Map[ProjectConfig, mutable.Set[ProjectConfig]] = _
64+
6365
def drivers: Map[ProjectConfig, InteractiveDriver] = thisServer.synchronized {
6466
if (myDrivers == null) {
6567
assert(rootUri != null, "`drivers` cannot be called before `initialize`")
@@ -125,17 +127,24 @@ class DottyLanguageServer extends LanguageServer
125127
drivers(configFor(uri))
126128
}
127129

128-
/** The set of projects that transitively depend on `config` */
129-
def transitivelyDependentProjects(config: ProjectConfig): immutable.Set[ProjectConfig] = {
130-
val allProjects = drivers.keySet.toSet
131-
allProjects.filter(transitiveDependencies(_).contains(config))
132-
}
130+
/** A mapping from project `p` to the set of projects that transitively depend on `p`. */
131+
def dependentProjects: Map[ProjectConfig, Set[ProjectConfig]] = thisServer.synchronized {
132+
if (myDependentProjects == null) {
133+
val idToConfig = drivers.keys.map(k => k.id -> k).toMap
134+
val allProjects = drivers.keySet
135+
136+
def transitiveDependencies(config: ProjectConfig): Set[ProjectConfig] = {
137+
val dependencies = config.dependencies.map(idToConfig).toSet
138+
dependencies ++ dependencies.flatMap(transitiveDependencies)
139+
}
133140

134-
/** The set of transitive dependencies of `config`. */
135-
def transitiveDependencies(config: ProjectConfig): immutable.Set[ProjectConfig] = {
136-
val idToConfig = drivers.keys.map(k => k.id -> k).toMap
137-
val dependencies = config.dependencies.map(idToConfig).toSet
138-
dependencies ++ dependencies.flatMap(transitiveDependencies)
141+
myDependentProjects = new mutable.HashMap().withDefaultValue(mutable.Set.empty)
142+
for { project <- allProjects
143+
dependency <- transitiveDependencies(project) } {
144+
myDependentProjects(dependency) += project
145+
}
146+
}
147+
myDependentProjects
139148
}
140149

141150
def connect(client: WorksheetClient): Unit = {
@@ -317,7 +326,7 @@ class DottyLanguageServer extends LanguageServer
317326
definition <- definitions
318327
uri <- toUriOption(definition.pos.source).toSet
319328
config = configFor(uri)
320-
project <- transitivelyDependentProjects(config) + config
329+
project <- dependentProjects(config) + config
321330
} yield project
322331
}
323332

0 commit comments

Comments
 (0)