@@ -23,7 +23,7 @@ import Comments._, Contexts._, Flags._, Names._, NameOps._, Symbols._, SymDenota
23
23
import classpath .ClassPathEntries
24
24
import reporting ._ , reporting .diagnostic .{Message , MessageContainer , messages }
25
25
import typer .Typer
26
- import util ._
26
+ import util .{ Set => _ , _ }
27
27
import interactive ._ , interactive .InteractiveDriver ._
28
28
import Interactive .Include
29
29
import config .Printers .interactiv
@@ -60,6 +60,8 @@ class DottyLanguageServer extends LanguageServer
60
60
61
61
private [this ] var myDrivers : mutable.Map [ProjectConfig , InteractiveDriver ] = _
62
62
63
+ private [this ] var myDependentProjects : mutable.Map [ProjectConfig , mutable.Set [ProjectConfig ]] = _
64
+
63
65
def drivers : Map [ProjectConfig , InteractiveDriver ] = thisServer.synchronized {
64
66
if (myDrivers == null ) {
65
67
assert(rootUri != null , " `drivers` cannot be called before `initialize`" )
@@ -125,17 +127,24 @@ class DottyLanguageServer extends LanguageServer
125
127
drivers(configFor(uri))
126
128
}
127
129
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
+ }
133
140
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
139
148
}
140
149
141
150
def connect (client : WorksheetClient ): Unit = {
@@ -317,7 +326,7 @@ class DottyLanguageServer extends LanguageServer
317
326
definition <- definitions
318
327
uri <- toUriOption(definition.pos.source).toSet
319
328
config = configFor(uri)
320
- project <- transitivelyDependentProjects (config) + config
329
+ project <- dependentProjects (config) + config
321
330
} yield project
322
331
}
323
332
0 commit comments