summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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))
}