K2: expand qualifier type aliases in visibility checker & in FIR2IR

#KT-55408 Fixed
This commit is contained in:
Mikhail Glukhikh
2023-01-16 16:31:09 +01:00
committed by Space Team
parent ead319f832
commit 9cfcf057ef
6 changed files with 34 additions and 15 deletions
@@ -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
@@ -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 {
@@ -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,
@@ -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.<!INVISIBLE_REFERENCE!>publicStaticMethod<!>()
}
class Child : TypeAliasedParent() {
fun foo() {
TypeAliasedParent.publicStaticMethod()
publicStaticMethod()
}
}
fun box() = TypeAliasedParent.publicStaticMethod()
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: javapackage/PackagePrivateGrandparentAbstractClass.java
package javapackage;
@@ -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 {