[FIR2IR] Fix adapted callable reference to nested class constructor

^KT-56829 Fixed
This commit is contained in:
Kirill Rakhman
2023-03-06 17:12:40 +01:00
committed by Space Team
parent e0baeb53db
commit c4255cdb0f
14 changed files with 92 additions and 5 deletions
@@ -8,10 +8,8 @@ package org.jetbrains.kotlin.fir.backend.generators
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
@@ -24,6 +22,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.getExpectedType
import org.jetbrains.kotlin.fir.resolve.calls.isFunctional
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
@@ -324,7 +323,12 @@ internal class AdapterGenerator(
)
if (boundDispatchReceiver != null) irCall.dispatchReceiver = receiverValue
else irCall.extensionReceiver = receiverValue
} else if (callableReferenceAccess.explicitReceiver is FirResolvedQualifier && ((firAdaptee as? FirMemberDeclaration)?.isStatic != true)) {
} else if (
callableReferenceAccess.explicitReceiver is FirResolvedQualifier &&
(firAdaptee !is FirConstructor ||
firAdaptee.containingClassLookupTag()?.toFirRegularClassSymbol(session)?.isInner == true) &&
((firAdaptee as? FirMemberDeclaration)?.isStatic != true)
) {
// Unbound callable reference 'A::foo'
val adaptedReceiverParameter = adapterFunction.valueParameters[0]
val adaptedReceiverValue = IrGetValueImpl(
@@ -3402,6 +3402,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt")
public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception {
@@ -3402,6 +3402,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt")
public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception {
@@ -0,0 +1,13 @@
class Command {
class Add(val arg: String? = "OK")
inner class InnerAdd(val arg: String? = "OK")
}
fun execute(func: () -> Command.Add) = func()
fun execute(c: Command, func: (Command) -> Command.InnerAdd) = func(c)
fun box(): String {
if (execute(Command::Add).arg != "OK") return "FAIL 1"
if (execute(Command(), Command::InnerAdd).arg != "OK") return "FAIL 2"
return "OK"
}
@@ -3258,6 +3258,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt")
public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception {
@@ -3402,6 +3402,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt")
public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception {
@@ -2850,6 +2850,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt")
public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt");
@@ -2124,6 +2124,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noNameClashForReferencesToSameFunction.kt")
public void testNoNameClashForReferencesToSameFunction() throws Exception {
@@ -2178,6 +2178,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noNameClashForReferencesToSameFunction.kt")
public void testNoNameClashForReferencesToSameFunction() throws Exception {
@@ -2178,6 +2178,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noNameClashForReferencesToSameFunction.kt")
public void testNoNameClashForReferencesToSameFunction() throws Exception {
@@ -2178,6 +2178,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noNameClashForReferencesToSameFunction.kt")
public void testNoNameClashForReferencesToSameFunction() throws Exception {
@@ -2261,6 +2261,12 @@ public class K2NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTes
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noNameClashForReferencesToSameFunction.kt")
public void testNoNameClashForReferencesToSameFunction() throws Exception {
@@ -2232,6 +2232,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@Test
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@Test
@TestMetadata("noNameClashForReferencesToSameFunction.kt")
public void testNoNameClashForReferencesToSameFunction() throws Exception {
@@ -1940,6 +1940,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt");
}
@TestMetadata("nestedClassConstructorWithDefault.kt")
public void testNestedClassConstructorWithDefault() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt");
}
@TestMetadata("noNameClashForReferencesToSameFunction.kt")
public void testNoNameClashForReferencesToSameFunction() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/noNameClashForReferencesToSameFunction.kt");