diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-11-26 23:12:56 -0800 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-11-26 23:12:56 -0800 |
commit | a6f758202ada377888563d51915119a386dd6b3e (patch) | |
tree | 20102999a04107415382bd85b92ca3026b0741b5 | |
parent | 33de562b3a224b2b9d7108ba0565c2f9ba57c526 (diff) | |
parent | 28bf4ada31119712b415b2b2f6aeb87f0431eb48 (diff) | |
download | scala-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.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 7 | ||||
-rw-r--r-- | test/files/pos/t8002-nested-scope.scala | 20 | ||||
-rw-r--r-- | test/files/run/t8002.scala | 19 |
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 +} |