diff options
author | Paul Phillips <paulp@improving.org> | 2011-06-29 20:49:12 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-06-29 20:49:12 +0000 |
commit | b86135b7c63d2789640b4c9cc7bfb3a0baba0034 (patch) | |
tree | 90b31b3ce6908bb0307f50b90d3e727f3f2af4be | |
parent | ad2f2524116f329f7f031905c6173d95cb983b0c (diff) | |
download | scala-b86135b7c63d2789640b4c9cc7bfb3a0baba0034.tar.gz scala-b86135b7c63d2789640b4c9cc7bfb3a0baba0034.tar.bz2 scala-b86135b7c63d2789640b4c9cc7bfb3a0baba0034.zip |
close #3946.
-rw-r--r-- | src/compiler/scala/tools/ant/Scaladoc.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 62 | ||||
-rw-r--r-- | src/swing/scala/swing/RichWindow.scala | 2 | ||||
-rw-r--r-- | test/files/neg/t3946.check | 5 | ||||
-rw-r--r-- | test/files/neg/t3946/J.java | 4 | ||||
-rw-r--r-- | test/files/neg/t3946/S_1.scala | 4 |
7 files changed, 53 insertions, 31 deletions
diff --git a/src/compiler/scala/tools/ant/Scaladoc.scala b/src/compiler/scala/tools/ant/Scaladoc.scala index 3d96b959f5..427846fa33 100644 --- a/src/compiler/scala/tools/ant/Scaladoc.scala +++ b/src/compiler/scala/tools/ant/Scaladoc.scala @@ -385,7 +385,7 @@ class Scaladoc extends MatchingTask { /** This is forwarding method to circumvent bug #281 in Scala 2. Remove when * bug has been corrected. */ - override protected def getDirectoryScanner(baseDir: java.io.File) = + override def getDirectoryScanner(baseDir: java.io.File) = super.getDirectoryScanner(baseDir) /** Transforms a string name into a file relative to the provided base diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index 6d846eec10..b006b2a30e 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -1302,6 +1302,11 @@ abstract class ClassfileParser { // apparently occurs when processing v45.3 bytecode. if (sym.toplevelClass != NoSymbol) sym.privateWithin = sym.toplevelClass.owner + + // protected in java means package protected. #3946 + if ((jflags & JAVA_ACC_PROTECTED) != 0) + if (sym.toplevelClass != NoSymbol) + sym.privateWithin = sym.toplevelClass.owner } @inline final private def isPrivate(flags: Int) = diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index 5711117fea..dfe07ed33b 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -408,37 +408,41 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT * classes, this has to be signaled as error. */ private def needsProtectedAccessor(sym: Symbol, pos: Position): Boolean = { - def errorRestriction(msg: String) { - unit.error(pos, "Implementation restriction: " + msg) + val clazz = currentOwner.enclClass + def accessibleThroughSubclassing = + validCurrentOwner && clazz.thisSym.isSubClass(sym.owner) && !clazz.isTrait + + def packageAccessBoundry(sym: Symbol) = { + val b = sym.accessBoundary(sym.owner) + if (b.isPackageClass) b + else b.enclosingPackageClass } - def accessibleThroughSubclassing: Boolean = - (validCurrentOwner - && currentOwner.enclClass.thisSym.isSubClass(sym.owner) - && !currentOwner.enclClass.isTrait) - - val res = /* settings.debug.value && */ - ((sym hasFlag PROTECTED) - && sym.hasFlag(JAVA) - && !sym.owner.isPackageClass - && !accessibleThroughSubclassing - && (sym.owner.enclosingPackageClass != currentOwner.enclosingPackageClass) - && (sym.owner.enclosingPackageClass == sym.accessBoundary(sym.owner).enclosingPackageClass)) - - if (res) { - val host = hostForAccessorOf(sym, currentOwner.enclClass) - // bug #1393 - as things stand now the "host" could be a package. - if (host.isPackageClass) false - else if (host.thisSym != host) { - if (host.thisSym.tpe.typeSymbol.hasFlag(JAVA)) - errorRestriction("%s accesses protected %s from self type %s.".format(currentOwner.enclClass, sym, host.thisSym.tpe)) - false - } else if (host.isTrait && sym.hasFlag(JAVA)) { - errorRestriction(("%s accesses protected %s inside a concrete trait method. " + - "Add an accessor in a class extending %s to work around this bug.").format(currentOwner.enclClass, sym, sym.enclClass)) - false - } else res - } else res + val isCandidate = ( + sym.isProtected + && sym.isJavaDefined + && !sym.definedInPackage + && !accessibleThroughSubclassing + && (sym.owner.enclosingPackageClass != currentOwner.enclosingPackageClass) + && (sym.owner.enclosingPackageClass == packageAccessBoundry(sym)) + ) + val host = hostForAccessorOf(sym, clazz) + def isSelfType = !(host.tpe <:< host.typeOfThis) && { + if (host.typeOfThis.typeSymbol.isJavaDefined) + unit.error(pos, "Implementation restriction: " + + "%s accesses protected %s from self type %s.".format(clazz, sym, host.typeOfThis) + ) + true + } + def isJavaProtected = host.isTrait && sym.isJavaDefined && { + unit.error(pos, "Implementation restriction: " + + """|%s accesses protected %s inside a concrete trait method. + |Add an accessor in a class extending %s as a workaround.""".stripMargin.format( + clazz, sym, sym.enclClass) + ) + true + } + isCandidate && !host.isPackageClass && !isSelfType && !isJavaProtected } /** Return the innermost enclosing class C of referencingClass for which either diff --git a/src/swing/scala/swing/RichWindow.scala b/src/swing/scala/swing/RichWindow.scala index 10e396247e..dcad382a33 100644 --- a/src/swing/scala/swing/RichWindow.scala +++ b/src/swing/scala/swing/RichWindow.scala @@ -78,7 +78,7 @@ class Frame extends RichWindow { override lazy val peer: JFrame with InterfaceMixin = new JFrame with InterfaceMixin with SuperMixin protected trait SuperMixin extends JFrame { - override protected def processWindowEvent(e: java.awt.event.WindowEvent) { + override def processWindowEvent(e: java.awt.event.WindowEvent) { super.processWindowEvent(e) if (e.getID() == java.awt.event.WindowEvent.WINDOW_CLOSING) closeOperation() diff --git a/test/files/neg/t3946.check b/test/files/neg/t3946.check new file mode 100644 index 0000000000..6379b50dba --- /dev/null +++ b/test/files/neg/t3946.check @@ -0,0 +1,5 @@ +S_1.scala:3: error: overriding method m in class J of type ()Unit; + method m has weaker access privileges; it should be at least protected[p] + override protected def m { } + ^ +one error found diff --git a/test/files/neg/t3946/J.java b/test/files/neg/t3946/J.java new file mode 100644 index 0000000000..189b8e1d23 --- /dev/null +++ b/test/files/neg/t3946/J.java @@ -0,0 +1,4 @@ +package p; +public class J { + protected void m() { return; } +} diff --git a/test/files/neg/t3946/S_1.scala b/test/files/neg/t3946/S_1.scala new file mode 100644 index 0000000000..2c52094701 --- /dev/null +++ b/test/files/neg/t3946/S_1.scala @@ -0,0 +1,4 @@ +package p +class S extends J { + override protected def m { } +} |