@@ -23,7 +23,7 @@ import Comments._, Contexts._, Flags._, Names._, NameOps._, Symbols._, SymDenota
2323import classpath .ClassPathEntries
2424import reporting ._ , reporting .diagnostic .{Message , MessageContainer , messages }
2525import typer .Typer
26- import util ._
26+ import util .{ Set => _ , _ }
2727import interactive ._ , interactive .InteractiveDriver ._
2828import Interactive .Include
2929import 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 = {
@@ -315,7 +324,7 @@ class DottyLanguageServer extends LanguageServer
315324 } else {
316325 definitions.flatMap { definition =>
317326 val config = configFor(toUri(definition.pos.source))
318- transitivelyDependentProjects (config) + config
327+ dependentProjects (config) + config
319328 }
320329 }
321330
0 commit comments