From 64e21af03b9a5d3229deedcf346b881e399fbde7 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 11 Oct 2022 11:51:38 +0300 Subject: [PATCH] [FIR] Consider containing class during visibility check of static function call ^KT-53441 --- .../kotlin/fir/FirVisibilityChecker.kt | 23 ++++++++++++++++--- .../visibility/packagePrivateStatic.fir.kt | 23 ------------------- .../tests/visibility/packagePrivateStatic.kt | 5 +++- .../tests/visibility/packagePrivateStatic.txt | 4 ++++ 4 files changed, 28 insertions(+), 27 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.fir.kt diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt index dff33b9e5b2..2c2bd3a0e1b 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt @@ -101,7 +101,12 @@ abstract class FirVisibilityChecker : FirSessionComponent { if (skipCheckForContainingClassVisibility) return true - val parentClass = declaration.containingNonLocalClass(session, dispatchReceiver) ?: return true + val parentClass = declaration.containingNonLocalClass( + session, + dispatchReceiver, + containingDeclarations, + supertypeSupplier + ) ?: return true return generateSequence(parentClass) { it.containingNonLocalClass(session) }.all { parent -> isSpecificDeclarationVisible( parent, @@ -137,7 +142,9 @@ abstract class FirVisibilityChecker : FirSessionComponent { private fun FirMemberDeclaration.containingNonLocalClass( session: FirSession, - dispatchReceiverValue: ReceiverValue? + dispatchReceiverValue: ReceiverValue?, + containingUseSiteDeclarations: List, + supertypeSupplier: SupertypeSupplier ): FirClassLikeDeclaration? { return when (this) { is FirCallableDeclaration -> { @@ -147,7 +154,17 @@ abstract class FirVisibilityChecker : FirSessionComponent { } } - this.containingClass()?.toSymbol(session)?.fir + val containingLookupTag = this.containingClass() + val containingClass = containingLookupTag?.toSymbol(session)?.fir + + if (isStatic && containingClass != null) { + containingUseSiteDeclarations.firstNotNullOfOrNull { + if (it !is FirClass) return@firstNotNullOfOrNull null + it.takeIf { it.isSubClass(containingLookupTag, session, supertypeSupplier) } + }?.let { return it } + } + + containingClass } is FirClassLikeDeclaration -> containingNonLocalClass(session) } diff --git a/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.fir.kt b/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.fir.kt deleted file mode 100644 index d3320679357..00000000000 --- a/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.fir.kt +++ /dev/null @@ -1,23 +0,0 @@ -// ISSUE: KT-54125 -// FILE: foo/Base.java -package foo; - -class Base { - protected static void foo() {} -} - -// FILE: foo/Derived.java -package foo; - -public class Derived extends Base {} - -// FILE: main.kt -package bar - -import foo.Derived - -class Impl : Derived() { - fun test() { - foo() - } -} diff --git a/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.kt b/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.kt index 4944a195f84..da7a242bb42 100644 --- a/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.kt +++ b/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.kt @@ -1,9 +1,11 @@ -// ISSUE: KT-54125 +// FIR_IDENTICAL +// ISSUE: KT-53441 // FILE: foo/Base.java package foo; class Base { protected static void foo() {} + protected void bar() {} } // FILE: foo/Derived.java @@ -19,5 +21,6 @@ import foo.Derived class Impl : Derived() { fun test() { foo() + bar() } } diff --git a/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.txt b/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.txt index 8d980f055de..d089608c939 100644 --- a/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.txt +++ b/compiler/testData/diagnostics/tests/visibility/packagePrivateStatic.txt @@ -4,6 +4,7 @@ package bar { public final class Impl : foo.Derived { public constructor Impl() + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun bar(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public final fun test(): kotlin.Unit @@ -15,6 +16,7 @@ package foo { public/*package*/ open class Base { public/*package*/ constructor Base() + protected/*protected and package*/ open fun bar(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String @@ -25,6 +27,7 @@ package foo { public open class Derived : foo.Base { public constructor Derived() + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun bar(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String @@ -33,3 +36,4 @@ package foo { protected/*protected static*/ open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit } } +