Skip to content

Commit 26241d0

Browse files
committed
Cleanup
1 parent 2db0047 commit 26241d0

File tree

1 file changed

+48
-33
lines changed

1 file changed

+48
-33
lines changed

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

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,33 @@ class ExtractDependencies extends Phase {
5454
val unit = ctx.compilationUnit
5555
val dumpInc = ctx.settings.YdumpSbtInc.value
5656
val forceRun = dumpInc || ctx.settings.YforceSbtPhases.value
57-
if ((ctx.sbtCallback != null || forceRun) && !unit.isJava) {
58-
val extractDeps = new ExtractDependenciesCollector
59-
extractDeps.traverse(unit.tpdTree)
57+
val shouldRun = !unit.isJava && (ctx.sbtCallback != null || forceRun)
58+
59+
if (shouldRun) {
60+
val collector = new ExtractDependenciesCollector
61+
collector.traverse(unit.tpdTree)
6062

6163
if (dumpInc) {
62-
val names = extractDeps.usedNames.map { case (clazz, names) => s"$clazz: $names" }.toArray[Object]
63-
val deps = extractDeps.dependencies.map(_.toString).toArray[Object]
64-
Arrays.sort(names)
64+
val deps = collector.dependencies.map(_.toString).toArray[Object]
65+
val names = collector.usedNames.map { case (clazz, names) => s"$clazz: $names" }.toArray[Object]
6566
Arrays.sort(deps)
67+
Arrays.sort(names)
6668

67-
val sourceFile = unit.source.file
68-
val pw = io.File(sourceFile.jpath).changeExtension("inc").toFile.printWriter()
69+
val pw = io.File(unit.source.file.jpath).changeExtension("inc").toFile.printWriter()
70+
// val pw = Console.out
6971
try {
70-
pw.println(s"// usedNames: ${names.mkString(",")}")
71-
pw.println(s"// Dependencies: ${deps.mkString(",")}")
72+
pw.println("Used Names:")
73+
pw.println("===========")
74+
names.foreach(pw.println)
75+
pw.println()
76+
pw.println("Dependencies:")
77+
pw.println("=============")
78+
deps.foreach(pw.println)
7279
} finally pw.close()
7380
}
7481

7582
if (ctx.sbtCallback != null) {
76-
extractDeps.usedNames.foreach {
83+
collector.usedNames.foreach {
7784
case (clazz, usedNames) =>
7885
val className = classNameAsString(clazz)
7986
usedNames.names.foreach {
@@ -82,7 +89,7 @@ class ExtractDependencies extends Phase {
8289
}
8390
}
8491

85-
extractDeps.dependencies.foreach(recordDependency)
92+
collector.dependencies.foreach(recordDependency)
8693
}
8794
}
8895
}
@@ -146,6 +153,10 @@ object ExtractDependencies {
146153

147154
def isLocal(sym: Symbol)(implicit ctx: Context): Boolean =
148155
sym.ownersIterator.exists(_.isTerm)
156+
157+
/** Return the enclosing class or the module class if it's a module. */
158+
def enclOrModuleClass(dep: Symbol)(implicit ctx: Context): Symbol =
159+
if (dep.is(ModuleVal)) dep.moduleClass else dep.enclosingClass
149160
}
150161

151162
private case class ClassDependency(from: Symbol, to: Symbol, context: DependencyContext)
@@ -255,36 +266,41 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
255266
}
256267
}
257268

258-
private def addDependency(sym: Symbol)(implicit ctx: Context): Unit =
269+
private def addMemberRefDependency(sym: Symbol)(implicit ctx: Context): Unit =
259270
if (!ignoreDependency(sym)) {
260-
val tlClass = sym.topLevelClass
261-
val from = resolveDependencySource
262-
if (tlClass.ne(NoSymbol)) {
263-
_dependencies += ClassDependency(from, tlClass, DependencyByMemberRef)
271+
val depClass = sym.topLevelClass // FIXME should be enclOrModuleClass(sym) in Zinc > 1.0
272+
// assert(depClass.isClass, s"$depClass, $sym, ${sym.isClass}")
273+
274+
if (depClass ne NoSymbol) {
275+
assert(depClass.isClass)
276+
val fromClass = resolveDependencySource
277+
if (fromClass ne NoSymbol) {
278+
assert(fromClass.isClass)
279+
_dependencies += ClassDependency(fromClass, depClass, DependencyByMemberRef)
280+
addUsedName(fromClass, sym.name.stripModuleClassSuffix, UseScope.Default)
281+
}
264282
}
265-
addUsedName(from, sym.name.stripModuleClassSuffix, UseScope.Default)
266283
}
267284

268-
private def ignoreDependency(sym: Symbol)(implicit ctx: Context) =
269-
sym.eq(NoSymbol) ||
270-
sym.isEffectiveRoot ||
271-
sym.isAnonymousFunction ||
272-
sym.isAnonymousClass
273-
274285
private def addInheritanceDependency(tree: Template)(implicit ctx: Context): Unit =
275286
if (tree.parents.nonEmpty) {
276287
val depContext =
277288
if (isLocal(tree.symbol.owner)) LocalDependencyByInheritance
278289
else DependencyByInheritance
279290
val from = resolveDependencySource
280291
tree.parents.foreach { parent =>
281-
_dependencies += ClassDependency(from, parent.tpe.classSymbol.topLevelClass, depContext)
292+
_dependencies += ClassDependency(from, parent.tpe.classSymbol, depContext)
282293
}
283294
}
284295

285-
/** Traverse the tree of a source file and record the dependencies which
286-
* can be retrieved using `topLevelDependencies`, `topLevelInheritanceDependencies`,
287-
* and `usedNames`
296+
private def ignoreDependency(sym: Symbol)(implicit ctx: Context) =
297+
sym.eq(NoSymbol) ||
298+
sym.isEffectiveRoot ||
299+
sym.isAnonymousFunction ||
300+
sym.isAnonymousClass
301+
302+
/** Traverse the tree of a source file and record the dependencies and used names which
303+
* can be retrieved using `dependencies` and`usedNames`.
288304
*/
289305
override def traverse(tree: Tree)(implicit ctx: Context): Unit = {
290306
tree match {
@@ -294,8 +310,8 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
294310
def lookupImported(name: Name) = expr.tpe.member(name).symbol
295311
def addImported(name: Name) = {
296312
// importing a name means importing both a term and a type (if they exist)
297-
addDependency(lookupImported(name.toTermName))
298-
addDependency(lookupImported(name.toTypeName))
313+
addMemberRefDependency(lookupImported(name.toTermName))
314+
addMemberRefDependency(lookupImported(name.toTypeName))
299315
}
300316
selectors foreach {
301317
case Ident(name) =>
@@ -314,7 +330,7 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
314330
case t: TypeTree =>
315331
addTypeDependency(t.tpe)
316332
case ref: RefTree =>
317-
addDependency(ref.symbol)
333+
addMemberRefDependency(ref.symbol)
318334
addTypeDependency(ref.tpe)
319335
case t: Template =>
320336
addInheritanceDependency(t)
@@ -385,7 +401,7 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
385401

386402
def addTypeDependency(tpe: Type)(implicit ctx: Context) = {
387403
val traverser = new TypeDependencyTraverser {
388-
def addDependency(symbol: Symbol) = thisTreeTraverser.addDependency(symbol)
404+
def addDependency(symbol: Symbol) = addMemberRefDependency(symbol)
389405
}
390406
traverser.traverse(tpe)
391407
}
@@ -395,7 +411,6 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
395411
def addDependency(symbol: Symbol) =
396412
if (!ignoreDependency(symbol) && symbol.is(Sealed)) {
397413
val usedName = symbol.name.stripModuleClassSuffix
398-
addUsedName(usedName, UseScope.Default)
399414
addUsedName(usedName, UseScope.PatMatTarget)
400415
}
401416
}

0 commit comments

Comments
 (0)