summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-09-12 10:18:33 +0000
committerMartin Odersky <odersky@gmail.com>2006-09-12 10:18:33 +0000
commitdc97215ec989aa4739c18aa74fa8f2ead78402f4 (patch)
tree3239a9bc794542f9a9770a95c884e1e8b65b68aa /src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
parent7165e8d40d3abede0e83acb1bd8419708b44ded6 (diff)
downloadscala-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.scala44
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)