Skip to content

Commit 6b9aa1f

Browse files
committed
Rework type traverser
1 parent bd2a665 commit 6b9aa1f

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

compiler/src/dotty/tools/dotc/sbt/ExtractDependencies.scala

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,12 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
242242
if (source.isEffectiveRoot) responsibleForImports else source
243243
}
244244

245-
private def addUsedName(enclosingSym: Symbol, name: Name)(implicit ctx: Context) = {
245+
private def addUsedName(enclosingSym: Symbol, name: Name, scope: UseScope)(implicit ctx: Context) = {
246246
val enclosingName =
247247
if (enclosingSym == defn.RootClass) classNameAsString(responsibleForImports)
248248
else classNameAsString(enclosingSym)
249249
val nameUsed = _usedNames.getOrElseUpdate(enclosingName, new UsedNamesInClass)
250-
nameUsed.update(name, UseScope.Default)
250+
nameUsed.update(name, scope)
251251
}
252252

253253
private def addDependency(sym: Symbol)(implicit ctx: Context): Unit =
@@ -257,7 +257,7 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
257257
if (tlClass.ne(NoSymbol)) {
258258
_dependencies += ClassDependency(from, tlClass, DependencyByMemberRef)
259259
}
260-
addUsedName(from, sym.name.stripModuleClassSuffix)
260+
addUsedName(from, sym.name.stripModuleClassSuffix, UseScope.Default)
261261
}
262262

263263
private def ignoreDependency(sym: Symbol)(implicit ctx: Context) =
@@ -269,26 +269,14 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
269269
private def addInheritanceDependency(parent: Symbol)(implicit ctx: Context): Unit =
270270
_dependencies += ClassDependency(resolveDependencySource, parent.topLevelClass, DependencyByInheritance)
271271

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-
284272
/** Traverse the tree of a source file and record the dependencies which
285273
* can be retrieved using `topLevelDependencies`, `topLevelInheritanceDependencies`,
286274
* and `usedNames`
287275
*/
288276
override def traverse(tree: Tree)(implicit ctx: Context): Unit = {
289277
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)
292280
case Import(expr, selectors) =>
293281
def lookupImported(name: Name) = expr.tpe.member(name).symbol
294282
def addImported(name: Name) = {
@@ -302,7 +290,7 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
302290
case Thicket(Ident(name) :: Ident(rename) :: Nil) =>
303291
addImported(name)
304292
if (rename ne nme.WILDCARD) {
305-
addUsedName(resolveDependencySource, rename)
293+
addUsedName(resolveDependencySource, rename, UseScope.Default)
306294
}
307295
case _ =>
308296
}
@@ -311,10 +299,10 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
311299
// record it as a dependency
312300
traverse(call)
313301
case t: TypeTree =>
314-
new usedTypeTraverser(ctx).traverse(t.tpe)
302+
addTypeDependency(t.tpe)
315303
case ref: RefTree =>
316304
addDependency(ref.symbol)
317-
new usedTypeTraverser(ctx).traverse(ref.tpe)
305+
addTypeDependency(ref.tpe)
318306
case t @ Template(_, parents, _, _) =>
319307
t.parents.foreach(p => addInheritanceDependency(p.tpe.classSymbol))
320308
case _ =>
@@ -355,7 +343,9 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
355343
* The tests in sbt `types-in-used-names-a`, `types-in-used-names-b`,
356344
* `as-seen-from-a` and `as-seen-from-b` rely on this.
357345
*/
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+
359349
val seen = new mutable.HashSet[Type]
360350
def traverse(tp: Type): Unit = if (!seen.contains(tp)) {
361351
seen += tp
@@ -378,10 +368,25 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
378368
traverseChildren(tp)
379369
}
380370
}
371+
}
381372

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)
384378
}
385379

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+
}
387392
}

0 commit comments

Comments
 (0)