@@ -242,12 +242,12 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
242
242
if (source.isEffectiveRoot) responsibleForImports else source
243
243
}
244
244
245
- private def addUsedName (enclosingSym : Symbol , name : Name )(implicit ctx : Context ) = {
245
+ private def addUsedName (enclosingSym : Symbol , name : Name , scope : UseScope )(implicit ctx : Context ) = {
246
246
val enclosingName =
247
247
if (enclosingSym == defn.RootClass ) classNameAsString(responsibleForImports)
248
248
else classNameAsString(enclosingSym)
249
249
val nameUsed = _usedNames.getOrElseUpdate(enclosingName, new UsedNamesInClass )
250
- nameUsed.update(name, UseScope . Default )
250
+ nameUsed.update(name, scope )
251
251
}
252
252
253
253
private def addDependency (sym : Symbol )(implicit ctx : Context ): Unit =
@@ -257,7 +257,7 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
257
257
if (tlClass.ne(NoSymbol )) {
258
258
_dependencies += ClassDependency (from, tlClass, DependencyByMemberRef )
259
259
}
260
- addUsedName(from, sym.name.stripModuleClassSuffix)
260
+ addUsedName(from, sym.name.stripModuleClassSuffix, UseScope . Default )
261
261
}
262
262
263
263
private def ignoreDependency (sym : Symbol )(implicit ctx : Context ) =
@@ -269,26 +269,14 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
269
269
private def addInheritanceDependency (parent : Symbol )(implicit ctx : Context ): Unit =
270
270
_dependencies += ClassDependency (resolveDependencySource, parent.topLevelClass, DependencyByInheritance )
271
271
272
- private class PatMatDependencyTraverser (ctx0 : Context ) extends ExtractTypesCollector (ctx0) {
273
- override protected def addDependency (symbol : Symbol )(implicit ctx : Context ): Unit = {
274
- if (! ignoreDependency(symbol) && symbol.is(Sealed )) {
275
- val encName = classNameAsString(resolveDependencySource)
276
- val nameUsed = _usedNames.getOrElseUpdate(encName, new UsedNamesInClass )
277
-
278
- nameUsed.update(symbol.name, UseScope .Default )
279
- nameUsed.update(symbol.name, UseScope .PatMatTarget )
280
- }
281
- }
282
- }
283
-
284
272
/** Traverse the tree of a source file and record the dependencies which
285
273
* can be retrieved using `topLevelDependencies`, `topLevelInheritanceDependencies`,
286
274
* and `usedNames`
287
275
*/
288
276
override def traverse (tree : Tree )(implicit ctx : Context ): Unit = {
289
277
tree match {
290
- case v @ ValDef (_, tpt, _) if v.symbol.is( Case ) && v.symbol.is( Synthetic ) =>
291
- new PatMatDependencyTraverser (ctx).traverse(tpt .tpe)
278
+ case Match (selector, _ ) =>
279
+ addPatMatDependency(selector .tpe)
292
280
case Import (expr, selectors) =>
293
281
def lookupImported (name : Name ) = expr.tpe.member(name).symbol
294
282
def addImported (name : Name ) = {
@@ -302,7 +290,7 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
302
290
case Thicket (Ident (name) :: Ident (rename) :: Nil ) =>
303
291
addImported(name)
304
292
if (rename ne nme.WILDCARD ) {
305
- addUsedName(resolveDependencySource, rename)
293
+ addUsedName(resolveDependencySource, rename, UseScope . Default )
306
294
}
307
295
case _ =>
308
296
}
@@ -311,10 +299,10 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
311
299
// record it as a dependency
312
300
traverse(call)
313
301
case t : TypeTree =>
314
- new usedTypeTraverser(ctx).traverse (t.tpe)
302
+ addTypeDependency (t.tpe)
315
303
case ref : RefTree =>
316
304
addDependency(ref.symbol)
317
- new usedTypeTraverser(ctx).traverse (ref.tpe)
305
+ addTypeDependency (ref.tpe)
318
306
case t @ Template (_, parents, _, _) =>
319
307
t.parents.foreach(p => addInheritanceDependency(p.tpe.classSymbol))
320
308
case _ =>
@@ -355,7 +343,9 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
355
343
* The tests in sbt `types-in-used-names-a`, `types-in-used-names-b`,
356
344
* `as-seen-from-a` and `as-seen-from-b` rely on this.
357
345
*/
358
- private class ExtractTypesCollector (ctx0 : Context ) extends TypeTraverser ()(ctx0) {
346
+ private abstract class TypeDependencyTraverser (implicit ctx : Context ) extends TypeTraverser ()(ctx) {
347
+ protected def addDependency (symbol : Symbol ): Unit
348
+
359
349
val seen = new mutable.HashSet [Type ]
360
350
def traverse (tp : Type ): Unit = if (! seen.contains(tp)) {
361
351
seen += tp
@@ -378,10 +368,25 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
378
368
traverseChildren(tp)
379
369
}
380
370
}
371
+ }
381
372
382
- protected def addDependency (symbol : Symbol )(implicit ctx : Context ): Unit =
383
- thisTreeTraverser.addDependency(symbol)
373
+ def addTypeDependency (tpe : Type )(implicit ctx : Context ) = {
374
+ val traverser = new TypeDependencyTraverser {
375
+ def addDependency (symbol : Symbol ) = thisTreeTraverser.addDependency(symbol)
376
+ }
377
+ traverser.traverse(tpe)
384
378
}
385
379
386
- private class usedTypeTraverser (ctx0 : Context ) extends ExtractTypesCollector (ctx0)
380
+ def addPatMatDependency (tpe : Type )(implicit ctx : Context ) = {
381
+ val traverser = new TypeDependencyTraverser {
382
+ def addDependency (symbol : Symbol ) =
383
+ if (! ignoreDependency(symbol) && symbol.is(Sealed )) {
384
+ val enclosingSym = resolveDependencySource
385
+ val usedName = symbol.name.stripModuleClassSuffix
386
+ addUsedName(enclosingSym, usedName, UseScope .Default )
387
+ addUsedName(enclosingSym, usedName, UseScope .PatMatTarget )
388
+ }
389
+ }
390
+ traverser.traverse(tpe)
391
+ }
387
392
}
0 commit comments