[FIR] Fix captured type arguments of local class as callable reference LHS

#KT-66267
This commit is contained in:
Kirill Rakhman
2024-03-05 16:14:27 +01:00
committed by Space Team
parent 66212c0ec6
commit 4c93e9cff6
24 changed files with 163 additions and 10 deletions
@@ -4810,6 +4810,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -4810,6 +4810,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -23,6 +23,7 @@ object FirTypeArgumentsOfQualifierOfCallableReferenceChecker : FirCallableRefere
val lhs = expression.explicitReceiver as? FirResolvedQualifier ?: return
val correspondingDeclaration = lhs.symbol ?: return
// TODO(KT-66344) Support inner classes
var typeArgumentsWithSourceInfo = lhs.typeArguments.toTypeArgumentsWithSourceInfo()
var typeParameterSymbols = correspondingDeclaration.typeParameterSymbols.filter { it.containingDeclarationSymbol is FirClassLikeSymbol }
if (typeParameterSymbols.size != typeArgumentsWithSourceInfo.size) {
@@ -4793,6 +4793,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -4793,6 +4793,12 @@ public class FirLightTreeBlackBoxCodegenWithFir2IrFakeOverrideGeneratorTestGener
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -4793,6 +4793,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -9,11 +9,14 @@ package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirOuterClassTypeParameterRef
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.types.Variance
@@ -145,17 +148,28 @@ class FirDoubleColonExpressionResolver(private val session: FirSession) {
firClassLikeDeclaration.symbol.toLookupTag(),
Array(firClassLikeDeclaration.typeParameters.size) { index ->
val typeArgument = expression.typeArguments.getOrNull(index)
if (typeArgument == null) ConeStarProjection
else when (typeArgument) {
is FirTypeProjectionWithVariance -> {
val coneType = typeArgument.typeRef.coneType
when (typeArgument.variance) {
Variance.INVARIANT -> coneType
Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(coneType)
Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(coneType)
}
if (typeArgument == null) {
// We currently only support local classes with captured type parameters from non-classes
// (i.e. local class in generic function).
// TODO(KT-66344) Support inner classes
val typeParameter = firClassLikeDeclaration.typeParameters[0]
if (firClassLikeDeclaration.isLocal && typeParameter is FirOuterClassTypeParameterRef && typeParameter.symbol.containingDeclarationSymbol !is FirClassSymbol) {
typeParameter.symbol.defaultType
} else {
ConeStarProjection
}
} else {
when (typeArgument) {
is FirTypeProjectionWithVariance -> {
val coneType = typeArgument.typeRef.coneType
when (typeArgument.variance) {
Variance.INVARIANT -> coneType
Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(coneType)
Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(coneType)
}
}
else -> ConeStarProjection
}
else -> ConeStarProjection
}
},
isNullable = resolvedExpression.isNullableLHSForCallableReference
@@ -0,0 +1,13 @@
import kotlin.reflect.KProperty1
fun <T> genericFun(value: T): T {
class Local(val item: T)
val unwrapItem: KProperty1<Local, T> = Local::item
return unwrapItem(Local(value))
}
fun box(): String {
return genericFun("OK")
}
@@ -4793,6 +4793,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -4595,6 +4595,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -4793,6 +4793,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -4793,6 +4793,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -4793,6 +4793,12 @@ public class FirBlackBoxCodegenTestWithInlineScopesGenerated extends AbstractFir
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -4195,6 +4195,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfStaticMethod.kt");
}
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
runTest("compiler/testData/codegen/box/callableReference/charArrayOf.kt");
@@ -3551,6 +3551,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3551,6 +3551,12 @@ public class FirJsES6CodegenBoxTestGenerated extends AbstractFirJsES6CodegenBoxT
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3551,6 +3551,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3551,6 +3551,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3637,6 +3637,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3721,6 +3721,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3553,6 +3553,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3638,6 +3638,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3539,6 +3539,12 @@ public class FirWasmJsCodegenBoxTestGenerated extends AbstractFirWasmJsCodegenBo
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {
@@ -3539,6 +3539,12 @@ public class K1WasmCodegenBoxTestGenerated extends AbstractK1WasmCodegenBoxTest
runTest("compiler/testData/codegen/box/callableReference/callableReferenceOfObjectMethod.kt");
}
@Test
@TestMetadata("callableReferencetoInnerAndLocal.kt")
public void testCallableReferencetoInnerAndLocal() {
runTest("compiler/testData/codegen/box/callableReference/callableReferencetoInnerAndLocal.kt");
}
@Test
@TestMetadata("charArrayOf.kt")
public void testCharArrayOf() {