FIR2IR: Fix incorrect conversion of adapted callable references with receiver

This commit is contained in:
Denis.Zharkov
2021-03-26 18:43:27 +03:00
parent 1f074326bf
commit a130b110f1
7 changed files with 39 additions and 5 deletions
@@ -92,7 +92,7 @@ class CallAndReferenceGenerator(
getter = referencedPropertyGetter?.symbol,
setter = referencedPropertySetterSymbol,
origin = origin
)
).applyTypeArguments(callableReferenceAccess).applyReceivers(callableReferenceAccess, explicitReceiverExpression)
}
is IrLocalDelegatedPropertySymbol -> {
IrLocalDelegatedPropertyReferenceImpl(
@@ -122,7 +122,7 @@ class CallAndReferenceGenerator(
getter = if (referencedField.isStatic) null else propertySymbol.owner.getter?.symbol,
setter = if (referencedField.isStatic) null else propertySymbol.owner.setter?.symbol,
origin
)
).applyReceivers(callableReferenceAccess, explicitReceiverExpression)
}
is IrFunctionSymbol -> {
assert(type.isFunctionTypeOrSubtype()) {
@@ -131,6 +131,7 @@ class CallAndReferenceGenerator(
type as IrSimpleType
val function = symbol.owner
if (adapterGenerator.needToGenerateAdaptedCallableReference(callableReferenceAccess, type, function)) {
// Receivers are being applied inside
with(adapterGenerator) {
val adaptedType = callableReferenceAccess.typeRef.coneType.kFunctionTypeToFunctionType()
generateAdaptedCallableReference(callableReferenceAccess, explicitReceiverExpression, symbol, adaptedType)
@@ -144,7 +145,8 @@ class CallAndReferenceGenerator(
typeArgumentsCount = typeArgumentCount,
valueArgumentsCount = function.valueParameters.size,
reflectionTarget = symbol
)
).applyTypeArguments(callableReferenceAccess)
.applyReceivers(callableReferenceAccess, explicitReceiverExpression)
}
}
else -> {
@@ -153,7 +155,7 @@ class CallAndReferenceGenerator(
)
}
}
}.applyTypeArguments(callableReferenceAccess).applyReceivers(callableReferenceAccess, explicitReceiverExpression)
}
}
private fun computeFieldSymbolForCallableReference(
@@ -2695,6 +2695,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt");
}
@Test
@TestMetadata("withReceiver.kt")
public void testWithReceiver() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt");
}
@Nested
@TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion")
@TestDataPath("$PROJECT_ROOT")
@@ -1,6 +1,5 @@
// DONT_TARGET_EXACT_BACKEND: WASM
// WASM_MUTE_REASON: BINDING_RECEIVERS
// IGNORE_BACKEND_FIR: JVM_IR
import Host.foo
@@ -0,0 +1,10 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_RUNTIME
fun MutableSet<CharSequence>.foo(s: CharSequence): Set<CharSequence> {
s.also(::add)
return this
}
fun box(): String = mutableSetOf<CharSequence>().foo("OK").single() as String
@@ -2695,6 +2695,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt");
}
@Test
@TestMetadata("withReceiver.kt")
public void testWithReceiver() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt");
}
@Nested
@TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion")
@TestDataPath("$PROJECT_ROOT")
@@ -2695,6 +2695,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt");
}
@Test
@TestMetadata("withReceiver.kt")
public void testWithReceiver() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt");
}
@Nested
@TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion")
@TestDataPath("$PROJECT_ROOT")
@@ -2362,6 +2362,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt");
}
@TestMetadata("withReceiver.kt")
public void testWithReceiver() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/withReceiver.kt");
}
@TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)