summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-11-26 23:12:56 -0800
committerJason Zaugg <jzaugg@gmail.com>2013-11-26 23:12:56 -0800
commita6f758202ada377888563d51915119a386dd6b3e (patch)
tree20102999a04107415382bd85b92ca3026b0741b5
parent33de562b3a224b2b9d7108ba0565c2f9ba57c526 (diff)
parent28bf4ada31119712b415b2b2f6aeb87f0431eb48 (diff)
downloadscala-a6f758202ada377888563d51915119a386dd6b3e.tar.gz
scala-a6f758202ada377888563d51915119a386dd6b3e.tar.bz2
scala-a6f758202ada377888563d51915119a386dd6b3e.zip
Merge pull request #3189 from retronym/ticket/8002
private access for local companions
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Contexts.scala5
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala7
-rw-r--r--test/files/pos/t8002-nested-scope.scala20
-rw-r--r--test/files/run/t8002.scala19
4 files changed, 50 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
index 5e5619d034..2be6d92ed0 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
@@ -657,7 +657,10 @@ trait Contexts { self: Analyzer =>
// Console.println("isAccessible(%s, %s, %s)".format(sym, pre, superAccess))
// don't have access if there is no linked class (so exclude linkedClass=NoSymbol)
- def accessWithinLinked(ab: Symbol) = ab.linkedClassOfClass.fold(false)(accessWithin)
+ def accessWithinLinked(ab: Symbol) = {
+ val linked = linkedClassOfClassOf(ab, this)
+ linked.fold(false)(accessWithin)
+ }
/* Are we inside definition of `ab`? */
def accessWithin(ab: Symbol) = {
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index e3d7bfd4f8..39e259fdfd 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -1695,4 +1695,11 @@ trait Namers extends MethodSynthesis {
)
}
}
+
+ /** A version of `Symbol#linkedClassOfClass` that works with local companions, ala `companionSymbolOf`. */
+ final def linkedClassOfClassOf(original: Symbol, ctx: Context): Symbol =
+ if (original.isModuleClass)
+ companionSymbolOf(original.sourceModule, ctx)
+ else
+ companionSymbolOf(original, ctx).moduleClass
}
diff --git a/test/files/pos/t8002-nested-scope.scala b/test/files/pos/t8002-nested-scope.scala
new file mode 100644
index 0000000000..a2088bce7a
--- /dev/null
+++ b/test/files/pos/t8002-nested-scope.scala
@@ -0,0 +1,20 @@
+// This test serves to capture the status quo, but should really
+// emit an accessibiltiy error.
+
+// `Namers#companionSymbolOf` seems too lenient, and currently doesn't
+// implement the same-scope checks mentioned:
+//
+// https://github.com/scala/scala/pull/2816#issuecomment-22555206
+//
+class C {
+ def foo = {
+ class C { private def x = 0 }
+
+ {
+ val a = 0
+ object C {
+ new C().x
+ }
+ }
+ }
+}
diff --git a/test/files/run/t8002.scala b/test/files/run/t8002.scala
new file mode 100644
index 0000000000..f24a213dea
--- /dev/null
+++ b/test/files/run/t8002.scala
@@ -0,0 +1,19 @@
+object Test extends App {
+ val a: Any = {
+ class A private () { private def x = 0; A.y };
+ object A {
+ def a = new A().x
+ private def y = 0
+ }
+ A.a
+ }
+ def b: Any = {
+ object A {
+ def a = new A().x
+ private def y = 0
+ }
+ class A private () { private def x = 0; A.y };
+ A.a
+ }
+ b
+}