[FIR] Fix captured type arguments of local class as callable reference LHS
#KT-66267
This commit is contained in:
committed by
Space Team
parent
66212c0ec6
commit
4c93e9cff6
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+1
@@ -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) {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+24
-10
@@ -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
|
||||
|
||||
+13
@@ -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")
|
||||
}
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
Generated
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
+6
@@ -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() {
|
||||
|
||||
Generated
+6
@@ -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() {
|
||||
|
||||
Generated
+6
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user