diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 7 | ||||
-rw-r--r-- | test/files/jvm/protectedacc.check | 1 | ||||
-rw-r--r-- | test/files/jvm/protectedacc.scala | 3 |
3 files changed, 7 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index 776425e2b7..36f9cb7657 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -172,9 +172,8 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT log("Decided for host class: " + clazz) val accName = nme.protName(sym.originalName) var protAcc = clazz.info.decl(accName) + val hasArgs = sym.tpe.paramTypes != Nil if (protAcc == NoSymbol) { - val hasArgs = sym.tpe.paramTypes != Nil - protAcc = clazz.newMethod(tree.pos, nme.protName(sym.originalName)) .setInfo(MethodType(List(clazz.typeOfThis), if (hasArgs) @@ -192,7 +191,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT var res: Tree = atPos(tree.pos) { Apply(Select(This(clazz), protAcc), List(qual)) } if (settings.debug.value) log("Replaced " + tree + " with " + res) - typer.typedOperator(res) + if (hasArgs) typer.typedOperator(res) else typer.typed(res) } /** Add an accessor for field, if needed, and return a selection tree for it . @@ -239,7 +238,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT private def needsProtectedAccessor(sym: Symbol, pos: PositionType): Boolean = { val res = /* settings.debug.value && */ ((sym hasFlag PROTECTED) - && (!(currentOwner.enclClass.thisSym isSubClass sym.owner)) + && (!validCurrentOwner || !(currentOwner.enclClass.thisSym isSubClass sym.owner)) && (enclPackage(sym.owner) != enclPackage(currentOwner))) if (res) { diff --git a/test/files/jvm/protectedacc.check b/test/files/jvm/protectedacc.check index 632c9dabe7..9fce0faf7c 100644 --- a/test/files/jvm/protectedacc.check +++ b/test/files/jvm/protectedacc.check @@ -1,6 +1,7 @@ 10 meth1(1) = 2 meth2(1)(1) = 2 +meth3 = class [I 10++ = 11 count before: 3 count after: 4 diff --git a/test/files/jvm/protectedacc.scala b/test/files/jvm/protectedacc.scala index f54bb33d58..7914da0d72 100644 --- a/test/files/jvm/protectedacc.scala +++ b/test/files/jvm/protectedacc.scala @@ -30,6 +30,7 @@ package p { protected def meth1(x: Int) = x + 1; protected def meth2(x: Int)(y: Int) = x + y; + protected def meth3 = Array(1, 2) def getA: this.type = this; } @@ -46,6 +47,8 @@ package p { Console.println("meth1(1) = " + meth1(1)); Console.println("meth2(1)(1) = " + meth2(1)(1)); + Console.println("meth3 = " + meth3.getClass); + val inc = &meth2(1); Console.println("10++ = " + inc(10)); |