From 9cfcf057efdc707966198d0e4653162fe7423227 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 16 Jan 2023 16:31:09 +0100 Subject: [PATCH] K2: expand qualifier type aliases in visibility checker & in FIR2IR #KT-55408 Fixed --- .../kotlin/fir/backend/ConversionUtils.kt | 11 ++++++++--- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/fir/resolve/calls/VisibilityUtils.kt | 9 ++++++++- .../cannotAccessStaticMemberViaTypeAlias.kt} | 16 +++++----------- .../packagePrivateStaticViaTypeAlias.kt | 1 + .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 6 files changed, 34 insertions(+), 15 deletions(-) rename compiler/testData/{diagnostics/tests/visibility/packagePrivateStaticViaTypeAlias.fir.kt => codegen/box/javaVisibility/package/cannotAccessStaticMemberViaTypeAlias.kt} (62%) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 1ee102aa5ac..dc0fc4c6bdc 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -211,7 +211,12 @@ fun FirReference.toSymbolForCall( } } -private fun FirResolvedQualifier.toLookupTag(): ConeClassLikeLookupTag? = (symbol as? FirClassSymbol)?.toLookupTag() +private fun FirResolvedQualifier.toLookupTag(session: FirSession): ConeClassLikeLookupTag? = + when (val symbol = symbol) { + is FirClassSymbol -> symbol.toLookupTag() + is FirTypeAliasSymbol -> symbol.fullyExpandedClass(session)?.toLookupTag() + else -> null + } context(Fir2IrComponents) private fun FirCallableSymbol<*>.toSymbolForCall( @@ -225,7 +230,7 @@ private fun FirCallableSymbol<*>.toSymbolForCall( val fakeOverrideOwnerLookupTag = when { // Static fake overrides isStatic -> { - ((dispatchReceiver as? FirResolvedQualifier) ?: (explicitReceiver as? FirResolvedQualifier))?.toLookupTag() + ((dispatchReceiver as? FirResolvedQualifier) ?: (explicitReceiver as? FirResolvedQualifier))?.toLookupTag(session) } // Member fake override or bound callable reference dispatchReceiver !is FirNoReceiverExpression -> { @@ -235,7 +240,7 @@ private fun FirCallableSymbol<*>.toSymbolForCall( isReference && fir.receiverParameter == null -> { // TODO: remove runIf with StandardClassIds.Any comparison after fixing ValueClass::equals case (KT-54887) runIf(containingClassLookupTag()?.classId != StandardClassIds.Any) { - (explicitReceiver as? FirResolvedQualifier)?.toLookupTag() + (explicitReceiver as? FirResolvedQualifier)?.toLookupTag(session) } } else -> null diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 2898b51495e..64e89029677 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -28968,6 +28968,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/javaVisibility/package/cannotAccessStaticMemberViaReceiver.kt"); } + @Test + @TestMetadata("cannotAccessStaticMemberViaTypeAlias.kt") + public void testCannotAccessStaticMemberViaTypeAlias() throws Exception { + runTest("compiler/testData/codegen/box/javaVisibility/package/cannotAccessStaticMemberViaTypeAlias.kt"); + } + @Test @TestMetadata("inheritedPackageStaticField.kt") public void testInheritedPackageStaticField() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt index 7a547f8ee08..414613ad59b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/VisibilityUtils.kt @@ -17,6 +17,9 @@ import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirSmartCastExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.builder.buildSmartCastExpression +import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.isNullableNothing @@ -31,7 +34,11 @@ fun FirVisibilityChecker.isVisible( ): Boolean { val staticQualifierForCallable = runIf(declaration is FirCallableDeclaration && declaration.isStatic) { val explicitReceiver = callInfo.explicitReceiver ?: (dispatchReceiverValue as? ExpressionReceiverValue)?.explicitReceiver - (explicitReceiver as? FirResolvedQualifier)?.symbol?.fir as? FirRegularClass + when (val classLikeSymbol = (explicitReceiver as? FirResolvedQualifier)?.symbol) { + is FirRegularClassSymbol -> classLikeSymbol.fir + is FirTypeAliasSymbol -> classLikeSymbol.fullyExpandedClass(callInfo.session)?.fir + is FirAnonymousObjectSymbol, null -> null + } } return isVisible( declaration, diff --git a/compiler/testData/diagnostics/tests/visibility/packagePrivateStaticViaTypeAlias.fir.kt b/compiler/testData/codegen/box/javaVisibility/package/cannotAccessStaticMemberViaTypeAlias.kt similarity index 62% rename from compiler/testData/diagnostics/tests/visibility/packagePrivateStaticViaTypeAlias.fir.kt rename to compiler/testData/codegen/box/javaVisibility/package/cannotAccessStaticMemberViaTypeAlias.kt index ad300ced013..2f4c3f1bcc8 100644 --- a/compiler/testData/diagnostics/tests/visibility/packagePrivateStaticViaTypeAlias.fir.kt +++ b/compiler/testData/codegen/box/javaVisibility/package/cannotAccessStaticMemberViaTypeAlias.kt @@ -1,9 +1,12 @@ +// TARGET_BACKEND: JVM_IR // FILE: javapackage/PackagePrivateGrandparentAbstractClass.java package javapackage; /*package-private*/ abstract class PackagePrivateGrandparentAbstractClass { - public static void publicStaticMethod() {} + public static String publicStaticMethod() { + return "OK"; + } } // FILE: javapackage/PublicParentClass.java @@ -18,13 +21,4 @@ import javapackage.PublicParentClass typealias TypeAliasedParent = PublicParentClass -fun foo() { - TypeAliasedParent.publicStaticMethod() -} - -class Child : TypeAliasedParent() { - fun foo() { - TypeAliasedParent.publicStaticMethod() - publicStaticMethod() - } -} +fun box() = TypeAliasedParent.publicStaticMethod() diff --git a/compiler/testData/diagnostics/tests/visibility/packagePrivateStaticViaTypeAlias.kt b/compiler/testData/diagnostics/tests/visibility/packagePrivateStaticViaTypeAlias.kt index c6e0e9fae43..fff16afe30a 100644 --- a/compiler/testData/diagnostics/tests/visibility/packagePrivateStaticViaTypeAlias.kt +++ b/compiler/testData/diagnostics/tests/visibility/packagePrivateStaticViaTypeAlias.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: javapackage/PackagePrivateGrandparentAbstractClass.java package javapackage; diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 7522a0f9323..9a14052e00d 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -28968,6 +28968,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaVisibility/package/cannotAccessStaticMemberViaReceiver.kt"); } + @Test + @TestMetadata("cannotAccessStaticMemberViaTypeAlias.kt") + public void testCannotAccessStaticMemberViaTypeAlias() throws Exception { + runTest("compiler/testData/codegen/box/javaVisibility/package/cannotAccessStaticMemberViaTypeAlias.kt"); + } + @Test @TestMetadata("inheritedPackageStaticField.kt") public void testInheritedPackageStaticField() throws Exception {