diff options
author | Martin Odersky <odersky@gmail.com> | 2006-05-25 18:08:50 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-05-25 18:08:50 +0000 |
commit | e3b1cc9130d7046905cc86f0f25e25c1010c5900 (patch) | |
tree | 0abeb2581b9d492db0cfb26b16753306a1ee3227 /src/compiler | |
parent | 5da7b0a3958c3c66803ba375c7d43f2a471f5322 (diff) | |
download | scala-e3b1cc9130d7046905cc86f0f25e25c1010c5900.tar.gz scala-e3b1cc9130d7046905cc86f0f25e25c1010c5900.tar.bz2 scala-e3b1cc9130d7046905cc86f0f25e25c1010c5900.zip |
Some more changes to fix 605
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Symbols.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 4 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Mixin.scala | 50 |
3 files changed, 43 insertions, 16 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index 81696a5612..fa7ddc1ce7 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -202,14 +202,15 @@ trait Symbols requires SymbolTable { /** Is this symbol an implementation class for a mixin? */ final def isImplClass: boolean = isClass && hasFlag(IMPLCLASS); + /** Is this symbol a trait which needs an implementation class? */ final def needsImplClass: boolean = isTrait && (!hasFlag(INTERFACE) || hasFlag(lateINTERFACE)) && !isImplClass; + /** Is this a symbol which exists only in the implementation class, not in its trait? */ final def isImplOnly: boolean = ( hasFlag(PRIVATE) || (owner.isImplClass || owner.isTrait) && - (hasFlag(notPRIVATE | LIFTED) && !hasFlag(ACCESSOR | SUPERACCESSOR) || - isConstructor) + (hasFlag(notPRIVATE | LIFTED) && !hasFlag(ACCESSOR | SUPERACCESSOR) || isConstructor) ); /** Is this symbol a module variable ? */ diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 5914c7cb53..6f10e487e4 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -360,7 +360,7 @@ trait Types requires SymbolTable { } //todo: use narrow only for modules? (correct? efficiency gain?) - def findMember(name: Name, excludedFlags: int, requiredFlags: int): Symbol = { + def findMember(name: Name, excludedFlags: int, requiredFlags: long): Symbol = { if (util.Statistics.enabled) findMemberCount = findMemberCount + 1; val startTime = if (util.Statistics.enabled) System.currentTimeMillis() else 0l; @@ -475,7 +475,7 @@ trait Types requires SymbolTable { // todo see whether we can do without override def isError: boolean = true; override def decls: Scope = new ErrorScope(NoSymbol); - override def findMember(name: Name, excludedFlags: int, requiredFlags: int): Symbol = { + override def findMember(name: Name, excludedFlags: int, requiredFlags: long): Symbol = { var sym = decls lookup name; if (sym == NoSymbol) { sym = NoSymbol.newErrorSymbol(name); diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala index 1baba07e32..f81bc4d0a1 100644 --- a/src/compiler/scala/tools/nsc/transform/Mixin.scala +++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala @@ -67,8 +67,6 @@ abstract class Mixin extends InfoTransform { def addLateInterfaceMembers(clazz: Symbol): unit = if (!(clazz hasFlag MIXEDIN)) { clazz setFlag MIXEDIN; - for (val bc <- clazz.info.baseClasses.reverse) - if (bc.hasFlag(lateINTERFACE)) addLateInterfaceMembers(bc) def newGetter(field: Symbol): Symbol = clazz.newMethod(field.pos, nme.getterName(field.name)) .setFlag(field.flags & ~(PRIVATE | LOCAL) | ACCESSOR | DEFERRED | SYNTHETIC) @@ -110,25 +108,53 @@ abstract class Mixin extends InfoTransform { addMixedinMembers(superclazz); //System.out.println("adding members of " + clazz.info.baseClasses.tail.takeWhile(superclazz !=) + " to " + clazz);//DEBUG val mixins = clazz.info.baseClasses.tail.takeWhile(superclazz !=); - def mixinMembers(mixinClass: Symbol, mmap: Symbol => Symbol): unit = { + def mixinMembers(mixinClass: Symbol): unit = { //Console.println("mixin members of "+mixinClass+" to "+clazz+" "+clazz.info.baseClasses)//DEBUG if (mixinClass.isImplClass) { addLateInterfaceMembers(mixinClass.toInterface); for (val member <- mixinClass.info.decls.toList) { + if (isForwarded(member) && !member.isImplOnly) { + val imember = member.overriddenSymbol(mixinClass.toInterface) + if (imember.overridingSymbol(clazz) == NoSymbol && + atPhase(phase.next)(clazz.info) + .findMember(member.name, 0, lateDEFERRED).alternatives.contains(imember)) { + val member1 = addMember( + clazz, + member.cloneSymbol(clazz) setPos clazz.pos resetFlag (DEFERRED | lateDEFERRED)) + member1.asInstanceOf[TermSymbol] setAlias member; + } + } +/* //System.out.println("adding forwarded method " + member + " " + mmap(member) + member.locationString + " to " + clazz + " " + (clazz.info.member(member.name).alternatives));//DEBUG - if (isForwarded(member) && !isStatic(member) && - (clazz.info.findMember(member.name, 0, 0).alternatives contains mmap(member))) { - val member1 = addMember( - clazz, - member.cloneSymbol(clazz) setPos clazz.pos resetFlag (DEFERRED | lateDEFERRED)); - member1.asInstanceOf[TermSymbol] setAlias member; - } + if (isForwarded(member) && !isStatic(member)) { + if (clazz.info.findMember(member.name, 0, 0).alternatives contains mmap(member)) { + val mmember = member.overriddenSymbol(mixinClass.toInterface) + if (!mmember.hasFlag(lateDEFERRED)) + Console.println("SURPRISE0: "+member+" "+mmember+mmember.locationString+" is not late deferred") + if (mmember.overridingSymbol(clazz) != NoSymbol) + Console.println("SURPRISE1: "+member+" "+mmember+mmember.locationString+" is overridden by class") + if (!atPhase(phase.next)(clazz.info).findMember(member.name, 0, lateDEFERRED).alternatives.contains(mmember)) + Console.println("SURPRISE2: "+member+" "+mmember+mmember.locationString+" is not among late deferred members") + val member1 = addMember( + clazz, + member.cloneSymbol(clazz) setPos clazz.pos resetFlag (DEFERRED | lateDEFERRED)); + member1.asInstanceOf[TermSymbol] setAlias member; + } else { + val mmember = member.overriddenSymbol(mixinClass.toInterface) + if (!mmember.hasFlag(lateDEFERRED)) + Console.println("SURPRISE3: "+member+" "+mmember+mmember.locationString+" is not late deferred") + if (mmember.overridingSymbol(clazz) == NoSymbol) + if (atPhase(phase.next)(clazz.info).findMember(member.name, 0, lateDEFERRED).alternatives.contains(mmember)) + Console.println("SURPRISE4: "+member+" "+mmember+mmember.locationString+" is mixed in but violates conditions") + } + } +*/ } } else if (mixinClass.hasFlag(lateINTERFACE)) { addLateInterfaceMembers(mixinClass); val impl = implClass(mixinClass); //System.out.println("late impl " + mixinClass + " " + impl);//DEBUG - if (!(mixins contains impl)) mixinMembers(impl, .overriddenSymbol(mixinClass)); + if (!(mixins contains impl)) mixinMembers(impl); for (val member <- mixinClass.info.decls.toList) { if (member hasFlag ACCESSOR) { val member1 = addMember( @@ -160,7 +186,7 @@ abstract class Mixin extends InfoTransform { } } // for (val mixinClass <- mixins) if (mixinClass.hasFlag(lateINTERFACE)) addLateInterfaceMembers(mixinClass); - for (val mixinClass <- mixins) mixinMembers(mixinClass, identity); + for (val mixinClass <- mixins) mixinMembers(mixinClass); if (settings.debug.value) log("new defs of " + clazz + " = " + clazz.info.decls); } } |