summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-06-29 20:49:12 +0000
committerPaul Phillips <paulp@improving.org>2011-06-29 20:49:12 +0000
commitb86135b7c63d2789640b4c9cc7bfb3a0baba0034 (patch)
tree90b31b3ce6908bb0307f50b90d3e727f3f2af4be
parentad2f2524116f329f7f031905c6173d95cb983b0c (diff)
downloadscala-b86135b7c63d2789640b4c9cc7bfb3a0baba0034.tar.gz
scala-b86135b7c63d2789640b4c9cc7bfb3a0baba0034.tar.bz2
scala-b86135b7c63d2789640b4c9cc7bfb3a0baba0034.zip
close #3946.
-rw-r--r--src/compiler/scala/tools/ant/Scaladoc.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala5
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala62
-rw-r--r--src/swing/scala/swing/RichWindow.scala2
-rw-r--r--test/files/neg/t3946.check5
-rw-r--r--test/files/neg/t3946/J.java4
-rw-r--r--test/files/neg/t3946/S_1.scala4
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 { }
+}