summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-06-06 01:00:48 +0000
committerPaul Phillips <paulp@improving.org>2011-06-06 01:00:48 +0000
commit1ebbe029dd7ba00444962c9b1493794032a17d6c (patch)
treeafa99ef296bc74ad2afe6eea557125de5932e259
parent6ebd6c4c072209f84ed1e71dd5ca2cccadeea9c6 (diff)
downloadscala-1ebbe029dd7ba00444962c9b1493794032a17d6c.tar.gz
scala-1ebbe029dd7ba00444962c9b1493794032a17d6c.tar.bz2
scala-1ebbe029dd7ba00444962c9b1493794032a17d6c.zip
Carved out access exception for java protected ...
Carved out access exception for java protected statics, which otherwise cannot be accessed from scala. Changes close status of #1806, no review.
-rw-r--r--src/compiler/scala/reflect/internal/Symbols.scala5
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Contexts.scala1
-rw-r--r--test/files/neg/protected-static-fail.check16
-rw-r--r--test/files/neg/protected-static-fail/J.java7
-rw-r--r--test/files/neg/protected-static-fail/S.scala10
-rw-r--r--test/files/neg/protected-static-fail/S0.scala9
-rw-r--r--test/files/pos/protected-static/J.java7
-rw-r--r--test/files/pos/protected-static/JavaClass.java6
-rw-r--r--test/files/pos/protected-static/S.scala7
-rw-r--r--test/files/pos/protected-static/ScalaClass.scala6
10 files changed, 73 insertions, 1 deletions
diff --git a/src/compiler/scala/reflect/internal/Symbols.scala b/src/compiler/scala/reflect/internal/Symbols.scala
index a37fc16ba5..fb135a49d6 100644
--- a/src/compiler/scala/reflect/internal/Symbols.scala
+++ b/src/compiler/scala/reflect/internal/Symbols.scala
@@ -695,10 +695,13 @@ trait Symbols /* extends reflect.generic.Symbols*/ { self: SymbolTable =>
final def hasAllFlags(mask: Long): Boolean = (flags & mask) == mask
/** The class or term up to which this symbol is accessible,
- * or RootClass if it is public.
+ * or RootClass if it is public. As java protected statics are
+ * otherwise completely inaccessible in scala, they are treated
+ * as public.
*/
def accessBoundary(base: Symbol): Symbol = {
if (hasFlag(PRIVATE) || isLocal) owner
+ else if (hasAllFlags(PROTECTED | STATIC | JAVA)) RootClass
else if (hasAccessBoundary && !phase.erasedTypes) privateWithin
else if (hasFlag(PROTECTED)) base
else RootClass
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
index 7550fc3739..ba534d322c 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
@@ -453,6 +453,7 @@ trait Contexts { self: Analyzer =>
(pre == NoPrefix) || {
val ab = sym.accessBoundary(sym.owner)
+
( (ab.isTerm || ab == definitions.RootClass)
|| (accessWithin(ab) || accessWithinLinked(ab)) &&
( !sym.hasLocalFlag
diff --git a/test/files/neg/protected-static-fail.check b/test/files/neg/protected-static-fail.check
new file mode 100644
index 0000000000..2f8a0caeab
--- /dev/null
+++ b/test/files/neg/protected-static-fail.check
@@ -0,0 +1,16 @@
+S.scala:5: error: method f in object J cannot be accessed in object bippy.J
+ J.f()
+ ^
+S.scala:6: error: method f1 in object S1 cannot be accessed in object bippy.S1
+ Access to protected method f1 not permitted because
+ enclosing class object Test in package bippy is not a subclass of
+ object S1 in package bippy where target is defined
+ S1.f1()
+ ^
+S.scala:8: error: method f2 in class S2 cannot be accessed in bippy.S2
+ Access to protected method f2 not permitted because
+ enclosing class object Test in package bippy is not a subclass of
+ class S2 in package bippy where target is defined
+ x.f2()
+ ^
+three errors found
diff --git a/test/files/neg/protected-static-fail/J.java b/test/files/neg/protected-static-fail/J.java
new file mode 100644
index 0000000000..c340800d7f
--- /dev/null
+++ b/test/files/neg/protected-static-fail/J.java
@@ -0,0 +1,7 @@
+package bippy;
+
+public class J {
+ private static String f() {
+ return "hi mom";
+ }
+} \ No newline at end of file
diff --git a/test/files/neg/protected-static-fail/S.scala b/test/files/neg/protected-static-fail/S.scala
new file mode 100644
index 0000000000..f9dd89d9d0
--- /dev/null
+++ b/test/files/neg/protected-static-fail/S.scala
@@ -0,0 +1,10 @@
+package bippy
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ J.f()
+ S1.f1()
+ val x = new S2
+ x.f2()
+ }
+}
diff --git a/test/files/neg/protected-static-fail/S0.scala b/test/files/neg/protected-static-fail/S0.scala
new file mode 100644
index 0000000000..1a3d192e5e
--- /dev/null
+++ b/test/files/neg/protected-static-fail/S0.scala
@@ -0,0 +1,9 @@
+package bippy
+
+object S1 {
+ protected def f1() = "hi mom"
+}
+
+class S2 {
+ protected def f2() = "hi mom"
+} \ No newline at end of file
diff --git a/test/files/pos/protected-static/J.java b/test/files/pos/protected-static/J.java
new file mode 100644
index 0000000000..502dc2c172
--- /dev/null
+++ b/test/files/pos/protected-static/J.java
@@ -0,0 +1,7 @@
+package bippy;
+
+public class J {
+ protected static String f() {
+ return "hi mom";
+ }
+} \ No newline at end of file
diff --git a/test/files/pos/protected-static/JavaClass.java b/test/files/pos/protected-static/JavaClass.java
new file mode 100644
index 0000000000..cd45a279c2
--- /dev/null
+++ b/test/files/pos/protected-static/JavaClass.java
@@ -0,0 +1,6 @@
+package bippy;
+
+public abstract class JavaClass {
+ protected static class Inner {}
+ protected abstract Inner getInner();
+}
diff --git a/test/files/pos/protected-static/S.scala b/test/files/pos/protected-static/S.scala
new file mode 100644
index 0000000000..644633546d
--- /dev/null
+++ b/test/files/pos/protected-static/S.scala
@@ -0,0 +1,7 @@
+package bippy
+
+object Test extends J {
+ def main(args: Array[String]): Unit = {
+ bippy.J.f()
+ }
+}
diff --git a/test/files/pos/protected-static/ScalaClass.scala b/test/files/pos/protected-static/ScalaClass.scala
new file mode 100644
index 0000000000..11108b890d
--- /dev/null
+++ b/test/files/pos/protected-static/ScalaClass.scala
@@ -0,0 +1,6 @@
+import bippy.JavaClass
+
+class Implementor extends JavaClass {
+ import JavaClass.Inner
+ def getInner: Inner = null
+}