@@ -144,7 +144,7 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile with
144
144
145
145
private case class ClassDependency (from : Symbol , to : Symbol )
146
146
147
- private class DependencyTraverser (processor : DependencyProcessor ) extends Traverser {
147
+ private final class DependencyTraverser (processor : DependencyProcessor ) extends Traverser {
148
148
// are we traversing an Import node at the moment?
149
149
private var inImportNode = false
150
150
@@ -255,13 +255,6 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile with
255
255
()
256
256
}
257
257
258
- def addTypeDependencies (tpe : Type ): Unit = {
259
- // Defined in GlobalHelpers.scala
260
- object TypeDependencyTraverser extends TypeDependencyTraverser (addDependency)
261
- TypeDependencyTraverser .traverse(tpe)
262
- TypeDependencyTraverser .reinitializeVisited()
263
- }
264
-
265
258
private def addDependency (dep : Symbol ): Unit = {
266
259
val fromClass = resolveDependencySource
267
260
if (ignoredSymbol(fromClass) || fromClass.hasPackageFlag) {
@@ -272,6 +265,48 @@ final class Dependency(val global: CallbackGlobal) extends LocateClassFile with
272
265
}
273
266
}
274
267
268
+ /** Define a type traverser to keep track of the type dependencies. */
269
+ object TypeDependencyTraverser extends TypeDependencyTraverser {
270
+ type Handler = Symbol => Unit
271
+ // Type dependencies are always added to member references
272
+ val memberRefHandler = processor.memberRef
273
+ def createHandler (fromClass : Symbol ): Handler = { (dep : Symbol ) =>
274
+ if (ignoredSymbol(fromClass) || fromClass.hasPackageFlag) {
275
+ if (inImportNode) addTopLevelImportDependency(dep)
276
+ else devWarning(Feedback .missingEnclosingClass(dep, currentOwner))
277
+ } else {
278
+ addClassDependency(_memberRefCache, memberRefHandler, fromClass, dep)
279
+ }
280
+ }
281
+
282
+ val cache = scala.collection.mutable.Map .empty[Symbol , (Handler , scala.collection.mutable.HashSet [Type ])]
283
+ private var handler : Handler = _
284
+ private var visitedOwner : Symbol = _
285
+ def setOwner (owner : Symbol ) = {
286
+ if (visitedOwner != owner) {
287
+ cache.get(owner) match {
288
+ case Some ((h, ts)) =>
289
+ visited = ts
290
+ handler = h
291
+ case None =>
292
+ val newVisited = scala.collection.mutable.HashSet .empty[Type ]
293
+ handler = createHandler(owner)
294
+ cache += owner -> (handler -> newVisited)
295
+ visited = newVisited
296
+ visitedOwner = owner
297
+ }
298
+ }
299
+ }
300
+
301
+ override def addDependency (symbol : global.Symbol ) = handler(symbol)
302
+ }
303
+
304
+ def addTypeDependencies (tpe : Type ): Unit = {
305
+ val fromClass = resolveDependencySource
306
+ TypeDependencyTraverser .setOwner(fromClass)
307
+ TypeDependencyTraverser .traverse(tpe)
308
+ }
309
+
275
310
private def addInheritanceDependency (dep : Symbol ): Unit = {
276
311
val fromClass = resolveDependencySource
277
312
if (_isLocalSource) {
0 commit comments