summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2009-07-31 10:03:36 +0000
committerIulian Dragos <jaguarul@gmail.com>2009-07-31 10:03:36 +0000
commit47bb1e153b55067d0a117f8cb0a2910f5840821d (patch)
tree780d2951e96eb01dff0ee77de3108999b4801518
parent14c5910337e5c8d291ca021c1a87d771d8f69c9d (diff)
downloadscala-47bb1e153b55067d0a117f8cb0a2910f5840821d.tar.gz
scala-47bb1e153b55067d0a117f8cb0a2910f5840821d.tar.bz2
scala-47bb1e153b55067d0a117f8cb0a2910f5840821d.zip
Merged dependency and references analysis.
-rw-r--r--src/compiler/scala/tools/nsc/dependencies/Changes.scala14
-rw-r--r--src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala43
-rw-r--r--src/compiler/scala/tools/nsc/dependencies/References.scala60
-rw-r--r--src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala13
4 files changed, 51 insertions, 79 deletions
diff --git a/src/compiler/scala/tools/nsc/dependencies/Changes.scala b/src/compiler/scala/tools/nsc/dependencies/Changes.scala
index 69d2c7fd6a..302f1b2b8e 100644
--- a/src/compiler/scala/tools/nsc/dependencies/Changes.scala
+++ b/src/compiler/scala/tools/nsc/dependencies/Changes.scala
@@ -18,14 +18,10 @@ abstract class Changes {
abstract class Change
- /** Modifiers of target have changed */
- case class Mods(from: Long, to: Long)(target: Symbol) extends Change {
- def moreRestrictive: Boolean =
- ((((to & PRIVATE) != 0) && (from & PRIVATE) == 0)
- || (((to & PROTECTED) != 0) && (from & PROTECTED) == 0))
-
- def morePermissive: Boolean = !moreRestrictive
- }
+ /** Are the new modifiers more restrictive than the old ones? */
+ private def moreRestrictive(from: Long, to: Long): Boolean =
+ ((((to & PRIVATE) != 0) && (from & PRIVATE) == 0)
+ || (((to & PROTECTED) != 0) && (from & PROTECTED) == 0))
/** An entity in source code, either a class or a member definition.
@@ -170,7 +166,7 @@ abstract class Changes {
cs += Removed(toEntity(o))
else {
val newSym = n.suchThat(ov => sameType(ov.tpe, o.tpe))
- if (newSym == NoSymbol) {
+ 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
diff --git a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
index fa7a5f94ae..b6ad064f0f 100644
--- a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
@@ -2,6 +2,8 @@ package scala.tools.nsc
package dependencies;
import util.SourceFile;
import io.AbstractFile
+import collection._
+import symtab.Flags
trait DependencyAnalysis extends SubComponent with Files {
import global._
@@ -36,6 +38,18 @@ trait DependencyAnalysis extends SubComponent with Files {
var dependencies = newDeps
+ /** Top level definitions per source file. */
+ val definitions: mutable.Map[AbstractFile, List[Symbol]] =
+ new mutable.HashMap[AbstractFile, List[Symbol]] {
+ override def default(f : AbstractFile) = Nil
+ }
+
+ /** External references used by source file. */
+ var references: immutable.Map[AbstractFile, immutable.Set[String]] =
+ new immutable.HashMap[AbstractFile, immutable.Set[String]] {
+ override def default(f : AbstractFile) = immutable.Set()
+ }
+
/** Write dependencies to the current file. */
def saveDependencies() =
if(dependenciesFile.isDefined)
@@ -95,6 +109,35 @@ trait DependencyAnalysis extends SubComponent with Files {
dependencies.depends(source, d.sourceFile);
}
}
+
+ // find all external references in this compilation unit
+ val file = unit.source.file
+ references += file -> immutable.Set.empty[String]
+
+ val buf = new mutable.ListBuffer[Symbol]
+
+ (new Traverser {
+ override def traverse(tree: Tree) {
+ if ((tree.symbol ne null)
+ && (tree.symbol != NoSymbol)
+ && (!tree.symbol.isPackage)
+ && (!tree.symbol.hasFlag(Flags.JAVA))
+ && ((tree.symbol.sourceFile eq null)
+ || (tree.symbol.sourceFile.path != file.path))) {
+ references = references.updated(file, references(file) + tree.symbol.fullNameString)
+ }
+ tree match {
+ case cdef: ClassDef if !cdef.symbol.isModuleClass && !cdef.symbol.hasFlag(Flags.PACKAGE) =>
+ buf += cdef.symbol
+ super.traverse(tree)
+
+ case _ =>
+ super.traverse(tree)
+ }
+ }
+ }).apply(unit.body)
+
+ definitions(unit.source.file) = buf.toList
}
}
}
diff --git a/src/compiler/scala/tools/nsc/dependencies/References.scala b/src/compiler/scala/tools/nsc/dependencies/References.scala
deleted file mode 100644
index 716f42116a..0000000000
--- a/src/compiler/scala/tools/nsc/dependencies/References.scala
+++ /dev/null
@@ -1,60 +0,0 @@
-package scala.tools.nsc
-package dependencies;
-import util.SourceFile;
-import io.AbstractFile
-import symtab.Flags
-
-import collection._
-
-abstract class References extends SubComponent with Files {
- import global._
-
- val phaseName = "references analysis";
-
- def newPhase(prev: Phase) = new ReferenceAnalysisPhase(prev)
-
- /** Top level definitions per source file. */
- val definitions: mutable.Map[AbstractFile, List[Symbol]] =
- new mutable.HashMap[AbstractFile, List[Symbol]] {
- override def default(f : AbstractFile) = Nil
- }
-
- /** External references used by source file. */
- var references: immutable.Map[AbstractFile, immutable.Set[String]] =
- new immutable.HashMap[AbstractFile, immutable.Set[String]] {
- override def default(f : AbstractFile) = immutable.Set()
- }
-
- class ReferenceAnalysisPhase(prev: Phase) extends StdPhase(prev) {
- def apply(unit: global.CompilationUnit) {
- val file = unit.source.file
- references += file -> immutable.Set.empty[String]
-
- val buf = new mutable.ListBuffer[Symbol]
-
- (new Traverser {
- override def traverse(tree: Tree) {
- if ((tree.symbol ne null)
- && (tree.symbol != NoSymbol)
- && (!tree.symbol.isPackage)
- && (!tree.symbol.hasFlag(Flags.JAVA))
- && ((tree.symbol.sourceFile eq null)
- || (tree.symbol.sourceFile.path != file.path))) {
- references = references.updated(file, references(file) + tree.symbol.fullNameString)
- }
- tree match {
- case cdef: ClassDef if !cdef.symbol.isModuleClass && !cdef.symbol.hasFlag(Flags.PACKAGE) =>
- buf += cdef.symbol
- super.traverse(tree)
-
- case _ =>
- super.traverse(tree)
- }
- }
- }).apply(unit.body)
-
- definitions(unit.source.file) = buf.toList
- }
- }
-}
-
diff --git a/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala b/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
index 4211ce8119..6ae1ce9121 100644
--- a/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
+++ b/src/compiler/scala/tools/nsc/interactive/RefinedBuildManager.scala
@@ -19,16 +19,9 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
class BuilderGlobal(settings: Settings) extends scala.tools.nsc.Global(settings) {
- object referencesAnalysis extends {
- val global: BuilderGlobal.this.type = BuilderGlobal.this
- val runsAfter = List("icode")
- val runsRightAfter = None
- } with References
-
override def computeInternalPhases() {
super.computeInternalPhases
phasesSet += dependencyAnalysis
- phasesSet += referencesAnalysis
}
def newRun() = new Run()
@@ -93,7 +86,7 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
val changesOf = new mutable.HashMap[Symbol, List[Change]]
- val defs = compiler.referencesAnalysis.definitions
+ val defs = compiler.dependencyAnalysis.definitions
for (val src <- files; val syms = defs(src); val sym <- syms) {
definitions(src).find(_.fullNameString == sym.fullNameString) match {
case Some(oldSym) =>
@@ -180,10 +173,10 @@ class RefinedBuildManager(val settings: Settings) extends Changes with BuildMana
/** Update the map of definitions per source file */
private def updateDefinitions {
- for ((src, localDefs) <- compiler.referencesAnalysis.definitions) {
+ for ((src, localDefs) <- compiler.dependencyAnalysis.definitions) {
definitions(src) = (localDefs map (_.cloneSymbol))
}
- this.references = compiler.referencesAnalysis.references
+ this.references = compiler.dependencyAnalysis.references
}
/** Load saved dependency information. */