diff options
author | Sean McDirmid <sean.mcdirmid@gmail.com> | 2008-07-05 04:58:43 +0000 |
---|---|---|
committer | Sean McDirmid <sean.mcdirmid@gmail.com> | 2008-07-05 04:58:43 +0000 |
commit | 957bd55c65ec352334ff78f2b0285b2dee0961e1 (patch) | |
tree | 516e0e74167cdcc0bfa90dac8e3819a7b74d942c /src | |
parent | 1f9606f7471894c29ac0e433c74dd599fef1bff3 (diff) | |
download | scala-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')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Mixin.scala | 12 |
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 => |