summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2009-11-09 16:42:15 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2009-11-09 16:42:15 +0000
commit2aeae987765bd5a63954b89ac8428db97b0a369f (patch)
treec26a774a6dccbaa92fda39178bcf163d6c19d459
parente981bccdb7874726af0896efdadb5e192d25c14a (diff)
downloadscala-2aeae987765bd5a63954b89ac8428db97b0a369f.tar.gz
scala-2aeae987765bd5a63954b89ac8428db97b0a369f.tar.bz2
scala-2aeae987765bd5a63954b89ac8428db97b0a369f.zip
Fixed #2557, #2562
-rw-r--r--src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala b/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
index 1c92ccade5..41bb2ecabf 100644
--- a/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
+++ b/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
@@ -119,12 +119,11 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
}
}
}
-
println("Changes: " + changesOf)
updateDefinitions(files)
val compiled = updated ++ files
- additionalDefs -- compiled
- update0(invalidated(files, changesOf) ++ additionalDefs, compiled)
+ val invalid = invalidated(files, changesOf, additionalDefs ++ compiled)
+ update0(invalid -- compiled, compiled)
}
update0(files, immutable.Set())
@@ -132,16 +131,20 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
/** Return the set of source files that are invalidated by the given changes. */
- def invalidated(files: Set[AbstractFile], changesOf: collection.Map[Symbol, List[Change]]): Set[AbstractFile] = {
+ def invalidated(files: Set[AbstractFile], changesOf: collection.Map[Symbol, List[Change]],
+ processed: Set[AbstractFile] = Set.empty): Set[AbstractFile] = {
val buf = new mutable.HashSet[AbstractFile]
+ val newChangesOf = new mutable.HashMap[Symbol, List[Change]]
var directDeps =
compiler.dependencyAnalysis.dependencies.dependentFiles(1, files)
+ directDeps --= processed
-// println("direct dependencies on " + files + " " + directDeps)
def invalidate(file: AbstractFile, reason: String, change: Change) = {
println("invalidate " + file + " because " + reason + " [" + change + "]")
buf += file
directDeps -= file
+ for (sym <- definitions(file))
+ newChangesOf(sym) = List(change)
break
}
@@ -190,6 +193,8 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
invalidate(file, "it references deleted definition", change)
case Removed(Class(name)) if (refs(name)) =>
invalidate(file, "it references deleted class", change)
+ case Changed(Class(name)) if (refs(name)) =>
+ invalidate(file, "it references changed class", change)
case Changed(Definition(name)) if (refs(name)) =>
invalidate(file, "it references changed definition", change)
case _ => ()
@@ -197,15 +202,18 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
}
}
- breakable {
for (file <- directDeps) {
- for (cls <- definitions(file)) checkParents(cls, file)
- for (cls <- definitions(file)) checkInterface(cls, file)
- checkReferences(file)
+ breakable {
+ for (cls <- definitions(file)) checkParents(cls, file)
+ for (cls <- definitions(file)) checkInterface(cls, file)
+ checkReferences(file)
+ }
}
- }
}
- buf
+ if (buf.isEmpty)
+ processed
+ else
+ invalidated(buf -- processed, newChangesOf, processed ++ buf)
}
/** Update the map of definitions per source file */