summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2009-12-04 16:45:48 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2009-12-04 16:45:48 +0000
commit36b1d9cf1c03de5e6a7ce82b73088697590dbcd9 (patch)
tree2e2ead3cfccc78cf81656f561d63bd6e41273a40
parent15add6cd50a26efc4ad80365d4ee31890123f770 (diff)
downloadscala-36b1d9cf1c03de5e6a7ce82b73088697590dbcd9.tar.gz
scala-36b1d9cf1c03de5e6a7ce82b73088697590dbcd9.tar.bz2
scala-36b1d9cf1c03de5e6a7ce82b73088697590dbcd9.zip
.scala_dependencies now correctly tracks the cl...
.scala_dependencies now correctly tracks the class files (didn't work for example for case classes and more complicated object/class combinations). Refined build manager now compares different symbols not only by name but takes into consideration some flags. This way we avoid comparing for example class with companion object (both share the name but we should compare class with class). Changes class now correctly filters private, local and lifted symbols ('newMembers -= n' didn't eliminate correctly some of the cases).
-rw-r--r--src/compiler/scala/tools/nsc/dependencies/Changes.scala36
-rw-r--r--src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala11
-rw-r--r--src/compiler/scala/tools/nsc/interactive/BuildManager.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala16
4 files changed, 39 insertions, 26 deletions
diff --git a/src/compiler/scala/tools/nsc/dependencies/Changes.scala b/src/compiler/scala/tools/nsc/dependencies/Changes.scala
index 3c6184bc24..e459494ab6 100644
--- a/src/compiler/scala/tools/nsc/dependencies/Changes.scala
+++ b/src/compiler/scala/tools/nsc/dependencies/Changes.scala
@@ -42,7 +42,7 @@ abstract class Changes {
private def sameType(tp1: Type, tp2: Type) = {
def typeOf(tp: Type): String = tp.toString + "[" + tp.getClass + "]"
val res = sameType0(tp1, tp2)
-// if (!res) println("\t different types: " + typeOf(tp1) + " : " + typeOf(tp2))
+ //if (!res) println("\t different types: " + typeOf(tp1) + " : " + typeOf(tp2))
res
}
@@ -139,6 +139,8 @@ abstract class Changes {
implicit val defaultReason = "types"
// println("changeSet " + from + "(" + from.info + ")"
// + " vs " + to + "(" + to.info + ")")
+
+ def omitSymbols(s: Symbol): Boolean = !s.hasFlag(Flags.LOCAL | Flags.LIFTED | Flags.PRIVATE)
val cs = new mutable.ListBuffer[Change]
if ((from.info.parents zip to.info.parents) exists { case (t1, t2) => !sameType(t1, t2) })
@@ -148,28 +150,26 @@ abstract class Changes {
// new members not yet visited
val newMembers = mutable.HashSet[Symbol]()
- newMembers ++= to.info.decls.iterator
+ newMembers ++= to.info.decls.iterator filter omitSymbols
- for (o <- from.info.decls.iterator;
- val n = to.info.decl(o.name)) {
+ for (o <- from.info.decls.iterator filter omitSymbols) {
+ val n = to.info.decl(o.name)
newMembers -= n
- if (!o.hasFlag(Flags.PRIVATE | Flags.LOCAL | Flags.LIFTED)) {
- if (o.isClass)
- cs ++= changeSet(o, n)
- else if (n == NoSymbol)
- cs += Removed(toEntity(o))
- else {
- val newSym = n.suchThat(ov => sameType(ov.tpe, o.tpe))
- if (newSym == NoSymbol || moreRestrictive(o.flags, newSym.flags)) {
- cs += Changed(toEntity(o))(n + " changed from " + o.tpe + " to " + n.tpe + " flags: " + Flags.flagsToString(o.flags))
- } else
- newMembers -= newSym
- }
+ if (o.isClass)
+ cs ++= changeSet(o, n)
+ else if (n == NoSymbol)
+ cs += Removed(toEntity(o))
+ else {
+ val newSym = n.suchThat(ov => sameType(ov.tpe, o.tpe))
+ if (newSym == NoSymbol || moreRestrictive(o.flags, newSym.flags))
+ cs += Changed(toEntity(o))(n + " changed from " + o.tpe + " to " + n.tpe + " flags: " + Flags.flagsToString(o.flags))
+ else
+ newMembers -= newSym
}
- }
- cs ++= (newMembers map (Added compose toEntity))
+ }: Unit // Give the type explicitly until #2281 is fixed
+ cs ++= (newMembers map (Added compose toEntity))
cs.toList
}
def removeChangeSet(sym: Symbol): Change = Removed(toEntity(sym))
diff --git a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
index b46a13f447..32d94d9ee9 100644
--- a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
@@ -116,11 +116,18 @@ trait DependencyAnalysis extends SubComponent with Files {
val source: AbstractFile = unit.source.file;
for (d <- unit.icode){
val name = d.toString
- dependencies.emits(source, nameToFile(unit.source.file, name))
d.symbol match {
- case _ : ModuleClassSymbol =>
+ case s : ModuleClassSymbol =>
+ val isTopLevelModule =
+ atPhase (currentRun.picklerPhase.next) {
+ !s.isImplClass && !s.isNestedClass
+ }
+ if (isTopLevelModule && (s.linkedModuleOfClass != NoSymbol)) {
+ dependencies.emits(source, nameToFile(unit.source.file, name))
+ }
dependencies.emits(source, nameToFile(unit.source.file, name + "$"))
case _ =>
+ dependencies.emits(source, nameToFile(unit.source.file, name))
}
}
diff --git a/src/compiler/scala/tools/nsc/interactive/BuildManager.scala b/src/compiler/scala/tools/nsc/interactive/BuildManager.scala
index e56bfec433..57a91bf332 100644
--- a/src/compiler/scala/tools/nsc/interactive/BuildManager.scala
+++ b/src/compiler/scala/tools/nsc/interactive/BuildManager.scala
@@ -63,7 +63,7 @@ object BuildManagerTest extends EvalLoop {
}
val result = fs.foldRight((List[AbstractFile](), List[String]()))(partition)
if (!result._2.isEmpty)
- println("No such file(s): " + result._2.mkString(","))
+ Console.err.println("No such file(s): " + result._2.mkString(","))
Set.empty ++ result._1
}
diff --git a/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala b/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
index 893ed7b0e9..ef8aa1e452 100644
--- a/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
+++ b/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
@@ -10,6 +10,7 @@ package interactive
import scala.collection._
import scala.tools.nsc.reporters.{Reporter, ConsoleReporter}
import scala.util.control.Breaks._
+import scala.tools.nsc.symtab.Flags
import dependencies._
import util.FakePos
@@ -90,6 +91,12 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
val coll: mutable.Map[AbstractFile, immutable.Set[AbstractFile]] =
mutable.HashMap[AbstractFile, immutable.Set[AbstractFile]]()
+ // See if we really have coresponding symbols, not just those
+ // which share the name
+ def isCorrespondingSym(from: Symbol, to: Symbol): Boolean =
+ (from.hasFlag(Flags.TRAIT) == to.hasFlag(Flags.TRAIT)) &&
+ (from.hasFlag(Flags.MODULE) == to.hasFlag(Flags.MODULE))
+
def update0(files: Set[AbstractFile]): Unit = if (!files.isEmpty) {
deleteClassfiles(files)
val run = compiler.newRun()
@@ -113,7 +120,9 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
else {
val syms = defs(src)
for (sym <- syms) {
- definitions(src).find(_.fullNameString == sym.fullNameString) match {
+ definitions(src).find(
+ s => (s.fullNameString == sym.fullNameString) &&
+ isCorrespondingSym(s, sym)) match {
case Some(oldSym) =>
changesOf(oldSym) = changeSet(oldSym, sym)
case _ =>
@@ -122,10 +131,7 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
}
// Create a change for the top level classes that were removed
val removed = definitions(src) filterNot ((s: Symbol) =>
- syms.find(_.fullNameString == s.fullNameString) match {
- case None => false
- case _ => true
- })
+ syms.find(_.fullNameString == s.fullNameString) != None)
for (sym <- removed) {
changesOf(sym) = List(removeChangeSet(sym))
}