diff options
author | Paul Phillips <paulp@improving.org> | 2011-06-06 01:00:48 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-06-06 01:00:48 +0000 |
commit | 1ebbe029dd7ba00444962c9b1493794032a17d6c (patch) | |
tree | afa99ef296bc74ad2afe6eea557125de5932e259 | |
parent | 6ebd6c4c072209f84ed1e71dd5ca2cccadeea9c6 (diff) | |
download | scala-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.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Contexts.scala | 1 | ||||
-rw-r--r-- | test/files/neg/protected-static-fail.check | 16 | ||||
-rw-r--r-- | test/files/neg/protected-static-fail/J.java | 7 | ||||
-rw-r--r-- | test/files/neg/protected-static-fail/S.scala | 10 | ||||
-rw-r--r-- | test/files/neg/protected-static-fail/S0.scala | 9 | ||||
-rw-r--r-- | test/files/pos/protected-static/J.java | 7 | ||||
-rw-r--r-- | test/files/pos/protected-static/JavaClass.java | 6 | ||||
-rw-r--r-- | test/files/pos/protected-static/S.scala | 7 | ||||
-rw-r--r-- | test/files/pos/protected-static/ScalaClass.scala | 6 |
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 +} |