From 7dea06d2a75be3a63aeaf953241f8ec1c567a244 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 18 Nov 2019 13:53:36 +0300 Subject: [PATCH] FIR tower resolve: make companion members accessible from derived classes --- .../kotlin/fir/resolve/calls/FirReceivers.kt | 10 ++++++++-- .../fir/resolve/calls/FirTowerResolver.kt | 8 ++++---- .../resolve/expresssions/protectedVisibility.kt | 11 ++++++++++- .../expresssions/protectedVisibility.txt | 17 ++++++++++++++++- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt index 65c59300a03..7a541c6dcf6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt @@ -89,8 +89,14 @@ class ImplicitDispatchReceiverValue( useSiteSession: FirSession, scopeSession: ScopeSession ) : ImplicitReceiverValue>(boundSymbol, type, useSiteSession, scopeSession) { - val implicitCompanionScope: FirScope? = - (boundSymbol.fir as? FirRegularClass)?.companionObject?.buildUseSiteMemberScope(useSiteSession, scopeSession) + val implicitCompanionScopes: List = run { + val klass = boundSymbol.fir as? FirRegularClass ?: return@run emptyList() + listOfNotNull(klass.companionObject?.buildUseSiteMemberScope(useSiteSession, scopeSession)) + + lookupSuperTypes(klass, lookupInterfaces = false, deep = true, useSiteSession = useSiteSession).mapNotNull { + val superClass = (it as? ConeClassType)?.lookupTag?.toSymbol(useSiteSession)?.fir as? FirRegularClass + superClass?.companionObject?.buildUseSiteMemberScope(useSiteSession, scopeSession) + } + } } class ImplicitExtensionReceiverValue( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt index 0485175adf0..ac7db163a2a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirTowerResolver.kt @@ -95,8 +95,8 @@ class FirTowerResolver( ) } if (implicitDispatchReceiverValue is ImplicitDispatchReceiverValue) { - val implicitCompanionScope = implicitDispatchReceiverValue.implicitCompanionScope - if (implicitCompanionScope != null) { + val implicitCompanionScopes = implicitDispatchReceiverValue.implicitCompanionScopes + for (implicitCompanionScope in implicitCompanionScopes) { // Extension in companion // class My { // companion object { fun My.foo() {} } @@ -184,8 +184,8 @@ class FirTowerResolver( towerDataConsumer.consume(TOWER_LEVEL, ScopeTowerLevel(session, components, implicitScope), group++) } if (implicitReceiverValue is ImplicitDispatchReceiverValue) { - val implicitCompanionScope = implicitReceiverValue.implicitCompanionScope - if (implicitCompanionScope != null) { + val implicitCompanionScopes = implicitReceiverValue.implicitCompanionScopes + for (implicitCompanionScope in implicitCompanionScopes) { // Companion scope bound to implicit receiver scope // class Outer { // companion object { val x = 0 } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/protectedVisibility.kt b/compiler/fir/resolve/testData/resolve/expresssions/protectedVisibility.kt index b405cbbeb99..a705f24d682 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/protectedVisibility.kt +++ b/compiler/fir/resolve/testData/resolve/expresssions/protectedVisibility.kt @@ -19,6 +19,12 @@ open class Protected { protected fun bar() {} } + + protected companion object { + fun fromCompanion() {} + + protected fun protectedFromCompanion() {} + } } class Derived : Protected() { @@ -26,9 +32,12 @@ class Derived : Protected() { bar() Nested().foo() Nested().bar() // hidden + + fromCompanion() + protectedFromCompanion() } - class NestedDerived : Nested() { + private class NestedDerived : Nested() { fun use() { bar() } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/protectedVisibility.txt b/compiler/fir/resolve/testData/resolve/expresssions/protectedVisibility.txt index 705ff6774ce..cd0ae840709 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/protectedVisibility.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/protectedVisibility.txt @@ -37,6 +37,19 @@ FILE: protectedVisibility.kt } + protected final companion object Companion : R|kotlin/Any| { + private constructor(): R|Protected.Companion| { + super() + } + + public final fun fromCompanion(): R|kotlin/Unit| { + } + + protected final fun protectedFromCompanion(): R|kotlin/Unit| { + } + + } + } public final class Derived : R|Protected| { public constructor(): R|Derived| { @@ -47,9 +60,11 @@ FILE: protectedVisibility.kt this@R|/Protected|.R|/Protected.bar|() R|/Protected.Nested.Nested|().R|/Protected.Nested.foo|() R|/Protected.Nested.Nested|().#() + this@R|/Protected.Companion|.R|/Protected.Companion.fromCompanion|() + #() } - public final class NestedDerived : R|Protected.Nested| { + private final class NestedDerived : R|Protected.Nested| { public constructor(): R|Derived.NestedDerived| { super() }