summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-05-25 18:08:50 +0000
committerMartin Odersky <odersky@gmail.com>2006-05-25 18:08:50 +0000
commite3b1cc9130d7046905cc86f0f25e25c1010c5900 (patch)
tree0abeb2581b9d492db0cfb26b16753306a1ee3227 /src/compiler
parent5da7b0a3958c3c66803ba375c7d43f2a471f5322 (diff)
downloadscala-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.scala5
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala4
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala50
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);
}
}