diff options
author | Martin Odersky <odersky@gmail.com> | 2006-09-12 10:18:33 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-09-12 10:18:33 +0000 |
commit | dc97215ec989aa4739c18aa74fa8f2ead78402f4 (patch) | |
tree | 3239a9bc794542f9a9770a95c884e1e8b65b68aa /src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala | |
parent | 7165e8d40d3abede0e83acb1bd8419708b44ded6 (diff) | |
download | scala-dc97215ec989aa4739c18aa74fa8f2ead78402f4.tar.gz scala-dc97215ec989aa4739c18aa74fa8f2ead78402f4.tar.bz2 scala-dc97215ec989aa4739c18aa74fa8f2ead78402f4.zip |
fixes to ExplicitOuter to pass test suite
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala index 128ac3275b..cc47db0773 100644 --- a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala +++ b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala @@ -64,34 +64,42 @@ abstract class ExplicitOuter extends InfoTransform with TransMatcher with Patter */ def transformInfo(sym: Symbol, tp: Type): Type = tp match { case MethodType(formals, restpe) => - if (sym.owner.isTrait && ((sym hasFlag SUPERACCESSOR) || sym.isModule)) // 5 + if (sym.owner.isTrait && ((sym hasFlag SUPERACCESSOR) || sym.isModule)) { // 5 + Console.println("make not private: "+sym+" "+sym.owner) sym.makeNotPrivate(sym.owner) + Console.println("made not private: "+sym) + } if (sym.owner.isTrait && (sym hasFlag PROTECTED)) sym setFlag notPROTECTED // 6 if (sym.isClassConstructor && isInner(sym.owner)) // 1 MethodType(sym.owner.outerClass.thisType :: formals, restpe) else tp - case ClassInfoType(parents, decls, clazz) if (isInner(clazz) && !(clazz hasFlag INTERFACE)) => - val decls1 = newScope(decls.toList) - val outerAcc = clazz.newMethod(clazz.pos, nme.OUTER) // 3 - outerAcc.expandName(clazz) - val restpe = if (clazz.isTrait) clazz.outerClass.tpe else clazz.outerClass.thisType - decls1 enter ( - clazz.newOuterAccessor(clazz.pos) - setInfo MethodType(List(), restpe)) + case ClassInfoType(parents, decls, clazz) => + var decls1 = decls + if (isInner(clazz) && !(clazz hasFlag INTERFACE)) { + decls1 = newScope(decls.toList) + val outerAcc = clazz.newMethod(clazz.pos, nme.OUTER) // 3 + outerAcc.expandName(clazz) + val restpe = if (clazz.isTrait) clazz.outerClass.tpe else clazz.outerClass.thisType + decls1 enter ( + clazz.newOuterAccessor(clazz.pos) + setInfo MethodType(List(), restpe)) + if (!clazz.isTrait) // 2 + //todo: avoid outer field if superclass has same outer value? + decls1 enter ( + clazz.newValue(clazz.pos, nme.getterToLocal(nme.OUTER)) + setFlag (PROTECTED | PARAMACCESSOR) + setInfo clazz.outerClass.thisType) + } if (!parents.isEmpty) { for (val mc <- clazz.mixinClasses) { val mixinOuterAcc: Symbol = atPhase(phase.next)(outerAccessor(mc)) - if (mixinOuterAcc != NoSymbol) + if (mixinOuterAcc != NoSymbol) { + if (decls1 eq decls) decls1 = newScope(decls.toList) decls1 enter (mixinOuterAcc.cloneSymbol(clazz) resetFlag DEFERRED) + } } } - if (!clazz.isTrait) // 2 - //todo: avoid outer field if superclass has same outer value? - decls1 enter ( - clazz.newValue(clazz.pos, nme.getterToLocal(nme.OUTER)) - setFlag (PROTECTED | PARAMACCESSOR) - setInfo clazz.outerClass.thisType) - ClassInfoType(parents, decls1, clazz) + if (decls1 eq decls) tp else ClassInfoType(parents, decls1, clazz) case PolyType(tparams, restp) => val restp1 = transformInfo(sym, restp) if (restp eq restp1) tp else PolyType(tparams, restp1) @@ -212,7 +220,7 @@ abstract class ExplicitOuter extends InfoTransform with TransMatcher with Patter */ def mixinOuterAccessorDef(mixinClass: Symbol): Tree = { val outerAcc = outerAccessor(mixinClass).overridingSymbol(currentClass) - if (outerAcc == NoSymbol) Console.println("cc "+currentClass+":"+currentClass.info.decls)//debug + if (outerAcc == NoSymbol) Console.println("cc "+currentClass+":"+currentClass.info.decls+" at "+phase)//debug assert(outerAcc != NoSymbol) val path = gen.mkAttributedQualifier(currentClass.thisType.baseType(mixinClass).prefix) val rhs = ExplicitOuterTransformer.this.transform(path) |