@@ -54,26 +54,33 @@ class ExtractDependencies extends Phase {
54
54
val unit = ctx.compilationUnit
55
55
val dumpInc = ctx.settings.YdumpSbtInc .value
56
56
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)
60
62
61
63
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 ]
65
66
Arrays .sort(deps)
67
+ Arrays .sort(names)
66
68
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
69
71
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)
72
79
} finally pw.close()
73
80
}
74
81
75
82
if (ctx.sbtCallback != null ) {
76
- extractDeps .usedNames.foreach {
83
+ collector .usedNames.foreach {
77
84
case (clazz, usedNames) =>
78
85
val className = classNameAsString(clazz)
79
86
usedNames.names.foreach {
@@ -82,7 +89,7 @@ class ExtractDependencies extends Phase {
82
89
}
83
90
}
84
91
85
- extractDeps .dependencies.foreach(recordDependency)
92
+ collector .dependencies.foreach(recordDependency)
86
93
}
87
94
}
88
95
}
@@ -146,6 +153,10 @@ object ExtractDependencies {
146
153
147
154
def isLocal (sym : Symbol )(implicit ctx : Context ): Boolean =
148
155
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
149
160
}
150
161
151
162
private case class ClassDependency (from : Symbol , to : Symbol , context : DependencyContext )
@@ -255,36 +266,41 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
255
266
}
256
267
}
257
268
258
- private def addDependency (sym : Symbol )(implicit ctx : Context ): Unit =
269
+ private def addMemberRefDependency (sym : Symbol )(implicit ctx : Context ): Unit =
259
270
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
+ }
264
282
}
265
- addUsedName(from, sym.name.stripModuleClassSuffix, UseScope .Default )
266
283
}
267
284
268
- private def ignoreDependency (sym : Symbol )(implicit ctx : Context ) =
269
- sym.eq(NoSymbol ) ||
270
- sym.isEffectiveRoot ||
271
- sym.isAnonymousFunction ||
272
- sym.isAnonymousClass
273
-
274
285
private def addInheritanceDependency (tree : Template )(implicit ctx : Context ): Unit =
275
286
if (tree.parents.nonEmpty) {
276
287
val depContext =
277
288
if (isLocal(tree.symbol.owner)) LocalDependencyByInheritance
278
289
else DependencyByInheritance
279
290
val from = resolveDependencySource
280
291
tree.parents.foreach { parent =>
281
- _dependencies += ClassDependency (from, parent.tpe.classSymbol.topLevelClass , depContext)
292
+ _dependencies += ClassDependency (from, parent.tpe.classSymbol, depContext)
282
293
}
283
294
}
284
295
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`.
288
304
*/
289
305
override def traverse (tree : Tree )(implicit ctx : Context ): Unit = {
290
306
tree match {
@@ -294,8 +310,8 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
294
310
def lookupImported (name : Name ) = expr.tpe.member(name).symbol
295
311
def addImported (name : Name ) = {
296
312
// 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))
299
315
}
300
316
selectors foreach {
301
317
case Ident (name) =>
@@ -314,7 +330,7 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
314
330
case t : TypeTree =>
315
331
addTypeDependency(t.tpe)
316
332
case ref : RefTree =>
317
- addDependency (ref.symbol)
333
+ addMemberRefDependency (ref.symbol)
318
334
addTypeDependency(ref.tpe)
319
335
case t : Template =>
320
336
addInheritanceDependency(t)
@@ -385,7 +401,7 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
385
401
386
402
def addTypeDependency (tpe : Type )(implicit ctx : Context ) = {
387
403
val traverser = new TypeDependencyTraverser {
388
- def addDependency (symbol : Symbol ) = thisTreeTraverser.addDependency (symbol)
404
+ def addDependency (symbol : Symbol ) = addMemberRefDependency (symbol)
389
405
}
390
406
traverser.traverse(tpe)
391
407
}
@@ -395,7 +411,6 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
395
411
def addDependency (symbol : Symbol ) =
396
412
if (! ignoreDependency(symbol) && symbol.is(Sealed )) {
397
413
val usedName = symbol.name.stripModuleClassSuffix
398
- addUsedName(usedName, UseScope .Default )
399
414
addUsedName(usedName, UseScope .PatMatTarget )
400
415
}
401
416
}
0 commit comments