K2: expand qualifier type aliases in visibility checker & in FIR2IR
#KT-55408 Fixed
This commit is contained in:
committed by
Space Team
parent
ead319f832
commit
9cfcf057ef
@@ -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
|
||||
|
||||
+6
@@ -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,
|
||||
|
||||
+5
-11
@@ -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
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// FILE: javapackage/PackagePrivateGrandparentAbstractClass.java
|
||||
|
||||
package javapackage;
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user