diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-01-07 16:41:18 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-01-07 16:41:18 +0000 |
commit | 677352f871b46d0e71ae00095808dbf83e7132d0 (patch) | |
tree | 7c9bc94779b19372b210da06842be5da4dc4fef5 | |
parent | e525797f194344338104739e7a5713e08dc4ba92 (diff) | |
download | scala-677352f871b46d0e71ae00095808dbf83e7132d0.tar.gz scala-677352f871b46d0e71ae00095808dbf83e7132d0.tar.bz2 scala-677352f871b46d0e71ae00095808dbf83e7132d0.zip |
Improvements in checking for references during ...
Improvements in checking for references during dependency analysis. For
example more carefully analysis of abstract type members, typerefs etc.
References #2793. review by dragos.
-rw-r--r-- | src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala index 43602aa3dd..5ce0cfdb1c 100644 --- a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala +++ b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala @@ -149,29 +149,52 @@ trait DependencyAnalysis extends SubComponent with Files { && (!tree.symbol.isPackage) && (!tree.symbol.hasFlag(Flags.JAVA)) && ((tree.symbol.sourceFile eq null) - || (tree.symbol.sourceFile.path != file.path))) { - references += file -> (references(file) + tree.symbol.fullNameString) + || (tree.symbol.sourceFile.path != file.path)) + && (!tree.symbol.isClassConstructor)) { + updateReferences(tree.symbol.fullNameString) } + tree match { case cdef: ClassDef if !cdef.symbol.hasFlag(Flags.PACKAGE) => buf += cdef.symbol + atPhase(currentRun.erasurePhase.prev) { + for (s <- cdef.symbol.info.decls) + s match { + case ts: TypeSymbol if !ts.isClass => + checkType(s.tpe) + case _ => + } + } super.traverse(tree) case ddef: DefDef => - atPhase(currentRun.erasurePhase.prev) { - val resTpeSym = ddef.symbol.tpe.resultType.typeSymbol - if (resTpeSym.isAbstractType) - references += file -> (references(file) + resTpeSym.fullNameString) - for (s <- ddef.symbol.tpe.params) - if (s.isAbstractType) - references += file -> (references(file) + resTpeSym.fullNameString) + atPhase(currentRun.typerPhase.prev) { + checkType(ddef.symbol.tpe) } super.traverse(tree) - case _ => + case _ => super.traverse(tree) } } + + def checkType(tpe: Type): Unit = + tpe match { + case t: MethodType => + checkType(t.resultType) + for (s <- t.params) checkType(s.tpe) + + case t: TypeRef => + updateReferences(t.typeSymbol.fullNameString) + for (tp <- t.args) checkType(tp) + + case t => + updateReferences(t.typeSymbol.fullNameString) + } + + def updateReferences(s: String): Unit = + references += file -> (references(file) + s) + }).apply(unit.body) definitions(unit.source.file) = buf.toList |