FIR visibility check: support companion private members correctly

This commit is contained in:
Mikhail Glukhikh
2019-11-12 11:22:11 +03:00
parent e96aeb77a6
commit c66b6b6a3a
3 changed files with 52 additions and 2 deletions
@@ -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
}
@@ -8,15 +8,32 @@ private class Private {
fun baz() {
bar()
Nested()
fromCompanion()
NotCompanion.<!INAPPLICABLE_CANDIDATE!>foo<!>() // hidden
}
inner class Inner {
fun foo() {
bar()
fromCompanion()
NotCompanion.<!INAPPLICABLE_CANDIDATE!>foo<!>() // hidden
}
}
private class Nested
private class Nested {
fun foo() {
fromCompanion()
NotCompanion.<!INAPPLICABLE_CANDIDATE!>foo<!>() // hidden
}
}
companion object {
private fun fromCompanion() {}
}
object NotCompanion {
private fun foo() {}
}
}
fun withLocals() {
@@ -47,6 +64,7 @@ fun test() {
Private().<!INAPPLICABLE_CANDIDATE!>bar<!>() // hidden
Private.<!INAPPLICABLE_CANDIDATE!>Nested<!>() // hidden
Private.<!INAPPLICABLE_CANDIDATE!>fromCompanion<!>() // hidden
}
// FILE: second.kt
@@ -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|.<Inapplicable(HIDDEN): [/Private.NotCompanion.foo]>#()
}
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|.<Inapplicable(HIDDEN): [/Private.NotCompanion.foo]>#()
}
}
@@ -30,6 +34,31 @@ FILE: first.kt
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/Unit| {
this@R|/Private.Companion|.R|/Private.Companion.fromCompanion|()
Q|Private.NotCompanion|.<Inapplicable(HIDDEN): [/Private.NotCompanion.foo]>#()
}
}
public final companion object Companion : R|kotlin/Any| {
private constructor(): R|Private.Companion| {
super<R|kotlin/Any|>()
}
private final fun fromCompanion(): R|kotlin/Unit| {
}
}
public final object NotCompanion : R|kotlin/Any| {
private constructor(): R|Private.NotCompanion| {
super<R|kotlin/Any|>()
}
private final fun foo(): R|kotlin/Unit| {
}
}
}
@@ -68,6 +97,7 @@ FILE: first.kt
R|/Private.Private|().R|/Private.Inner.Inner|()
R|/Private.Private|().<Inapplicable(HIDDEN): [/Private.bar]>#()
Q|Private|.<Inapplicable(HIDDEN): [/Private.Nested.Nested]>#()
Q|Private|.<Inapplicable(HIDDEN): [/Private.Companion.fromCompanion]>#()
}
FILE: second.kt
public final fun secondTest(): R|kotlin/Unit| {