summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/Mixin.scala
diff options
context:
space:
mode:
authorSean McDirmid <sean.mcdirmid@gmail.com>2008-07-05 04:58:43 +0000
committerSean McDirmid <sean.mcdirmid@gmail.com>2008-07-05 04:58:43 +0000
commit957bd55c65ec352334ff78f2b0285b2dee0961e1 (patch)
tree516e0e74167cdcc0bfa90dac8e3819a7b74d942c /src/compiler/scala/tools/nsc/transform/Mixin.scala
parent1f9606f7471894c29ac0e433c74dd599fef1bff3 (diff)
downloadscala-957bd55c65ec352334ff78f2b0285b2dee0961e1.tar.gz
scala-957bd55c65ec352334ff78f2b0285b2dee0961e1.tar.bz2
scala-957bd55c65ec352334ff78f2b0285b2dee0961e1.zip
Adding dependency tracking from classes to the ...
Adding dependency tracking from classes to the traits they implement, as the classes must be recompiled when the layout of any extended trait changes.
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/Mixin.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index f78228888a..fd557911cf 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -185,7 +185,7 @@ abstract class Mixin extends InfoTransform {
* - for every super accessor in T, add an implementation of that accessor
* - for every module in T, add a module
*/
- def addMixedinMembers(clazz: Symbol) {
+ def addMixedinMembers(clazz: Symbol, unit : CompilationUnit) {
if (!(clazz hasFlag JAVA) && (treatedClassInfos get clazz) != Some(clazz.info)) {
treatedClassInfos(clazz) = clazz.info
@@ -193,7 +193,7 @@ abstract class Mixin extends InfoTransform {
assert(!clazz.info.parents.isEmpty, clazz)
// first complete the superclass with mixed in members
- addMixedinMembers(clazz.superClass)
+ addMixedinMembers(clazz.superClass,unit)
//Console.println("adding members of " + clazz.info.baseClasses.tail.takeWhile(superclazz !=) + " to " + clazz);//DEBUG
@@ -278,6 +278,8 @@ abstract class Mixin extends InfoTransform {
for (val mc <- clazz.mixinClasses)
if (mc hasFlag lateINTERFACE) {
+ // @SEAN: adding trait tracking so we don't have to recompile transitive closures
+ unit.depends += mc
addLateInterfaceMembers(mc)
mixinTraitMembers(mc)
mixinImplClassMembers(implClass(mc), mc)
@@ -337,9 +339,9 @@ abstract class Mixin extends InfoTransform {
// --------- term transformation -----------------------------------------------
protected def newTransformer(unit: CompilationUnit): Transformer =
- new MixinTransformer
+ new MixinTransformer(unit)
- class MixinTransformer extends Transformer {
+ class MixinTransformer(unit : CompilationUnit) extends Transformer {
/** Within a static implementation method: the parameter referring to the
* current object undefined evrywhere else.
@@ -378,7 +380,7 @@ abstract class Mixin extends InfoTransform {
case Template(parents, self, body) =>
localTyper = erasure.newTyper(rootContext.make(tree, currentOwner))
atPhase(phase.next)(currentOwner.owner.info)//todo: needed?
- if (!currentOwner.isTrait) addMixedinMembers(currentOwner)
+ if (!currentOwner.isTrait) addMixedinMembers(currentOwner,unit)
else if (currentOwner hasFlag lateINTERFACE) addLateInterfaceMembers(currentOwner)
tree
case DefDef(mods, name, tparams, List(vparams), tpt, rhs) if currentOwner.isImplClass =>