From c66b6b6a3a9b37d26c1a35cf7629768923ccad51 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 12 Nov 2019 11:22:11 +0300 Subject: [PATCH] FIR visibility check: support companion private members correctly --- .../kotlin/fir/resolve/calls/ResolverParts.kt | 4 ++- .../resolve/expresssions/privateVisibility.kt | 20 ++++++++++++- .../expresssions/privateVisibility.txt | 30 +++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt index 7a88ebee266..75d1d6e73c0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt @@ -277,7 +277,9 @@ internal object CheckVisibility : CheckerStage() { private fun ImplicitReceiverStack.canSeePrivateMemberOf(ownerId: ClassId): Boolean { for (implicitReceiverValue in receiversAsReversed()) { if (implicitReceiverValue !is ImplicitDispatchReceiverValue) continue - if (implicitReceiverValue.boundSymbol.classId == ownerId) return true + val boundSymbol = implicitReceiverValue.boundSymbol + if (boundSymbol.classId == ownerId) return true + if (boundSymbol is FirRegularClassSymbol && boundSymbol.fir.companionObject?.symbol?.classId == ownerId) return true } return false } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/privateVisibility.kt b/compiler/fir/resolve/testData/resolve/expresssions/privateVisibility.kt index 77fb0bdb68f..bf2d0883ee5 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/privateVisibility.kt +++ b/compiler/fir/resolve/testData/resolve/expresssions/privateVisibility.kt @@ -8,15 +8,32 @@ private class Private { fun baz() { bar() Nested() + fromCompanion() + NotCompanion.foo() // hidden } inner class Inner { fun foo() { bar() + fromCompanion() + NotCompanion.foo() // hidden } } - private class Nested + private class Nested { + fun foo() { + fromCompanion() + NotCompanion.foo() // hidden + } + } + + companion object { + private fun fromCompanion() {} + } + + object NotCompanion { + private fun foo() {} + } } fun withLocals() { @@ -47,6 +64,7 @@ fun test() { Private().bar() // hidden Private.Nested() // hidden + Private.fromCompanion() // hidden } // FILE: second.kt diff --git a/compiler/fir/resolve/testData/resolve/expresssions/privateVisibility.txt b/compiler/fir/resolve/testData/resolve/expresssions/privateVisibility.txt index 35613058477..3069b0e65cf 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/privateVisibility.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/privateVisibility.txt @@ -12,6 +12,8 @@ FILE: first.kt public final fun baz(): R|kotlin/Unit| { this@R|/Private|.R|/Private.bar|() R|/Private.Nested.Nested|() + this@R|/Private.Companion|.R|/Private.Companion.fromCompanion|() + Q|Private.NotCompanion|.#() } public final inner class Inner : R|kotlin/Any| { @@ -21,6 +23,8 @@ FILE: first.kt public final fun foo(): R|kotlin/Unit| { this@R|/Private|.R|/Private.bar|() + this@R|/Private.Companion|.R|/Private.Companion.fromCompanion|() + Q|Private.NotCompanion|.#() } } @@ -30,6 +34,31 @@ FILE: first.kt super() } + public final fun foo(): R|kotlin/Unit| { + this@R|/Private.Companion|.R|/Private.Companion.fromCompanion|() + Q|Private.NotCompanion|.#() + } + + } + + public final companion object Companion : R|kotlin/Any| { + private constructor(): R|Private.Companion| { + super() + } + + private final fun fromCompanion(): R|kotlin/Unit| { + } + + } + + public final object NotCompanion : R|kotlin/Any| { + private constructor(): R|Private.NotCompanion| { + super() + } + + private final fun foo(): R|kotlin/Unit| { + } + } } @@ -68,6 +97,7 @@ FILE: first.kt R|/Private.Private|().R|/Private.Inner.Inner|() R|/Private.Private|().#() Q|Private|.#() + Q|Private|.#() } FILE: second.kt public final fun secondTest(): R|kotlin/Unit| {