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, getter = referencedPropertyGetter?.symbol,
setter = referencedPropertySetterSymbol, setter = referencedPropertySetterSymbol,
origin = origin origin = origin
) ).applyTypeArguments(callableReferenceAccess).applyReceivers(callableReferenceAccess, explicitReceiverExpression)
} }
is IrLocalDelegatedPropertySymbol -> { is IrLocalDelegatedPropertySymbol -> {
IrLocalDelegatedPropertyReferenceImpl( IrLocalDelegatedPropertyReferenceImpl(
@@ -122,7 +122,7 @@ class CallAndReferenceGenerator(
getter = if (referencedField.isStatic) null else propertySymbol.owner.getter?.symbol, getter = if (referencedField.isStatic) null else propertySymbol.owner.getter?.symbol,
setter = if (referencedField.isStatic) null else propertySymbol.owner.setter?.symbol, setter = if (referencedField.isStatic) null else propertySymbol.owner.setter?.symbol,
origin origin
) ).applyReceivers(callableReferenceAccess, explicitReceiverExpression)
} }
is IrFunctionSymbol -> { is IrFunctionSymbol -> {
assert(type.isFunctionTypeOrSubtype()) { assert(type.isFunctionTypeOrSubtype()) {
@@ -131,6 +131,7 @@ class CallAndReferenceGenerator(
type as IrSimpleType type as IrSimpleType
val function = symbol.owner val function = symbol.owner
if (adapterGenerator.needToGenerateAdaptedCallableReference(callableReferenceAccess, type, function)) { if (adapterGenerator.needToGenerateAdaptedCallableReference(callableReferenceAccess, type, function)) {
// Receivers are being applied inside
with(adapterGenerator) { with(adapterGenerator) {
val adaptedType = callableReferenceAccess.typeRef.coneType.kFunctionTypeToFunctionType() val adaptedType = callableReferenceAccess.typeRef.coneType.kFunctionTypeToFunctionType()
generateAdaptedCallableReference(callableReferenceAccess, explicitReceiverExpression, symbol, adaptedType) generateAdaptedCallableReference(callableReferenceAccess, explicitReceiverExpression, symbol, adaptedType)
@@ -144,7 +145,8 @@ class CallAndReferenceGenerator(
typeArgumentsCount = typeArgumentCount, typeArgumentsCount = typeArgumentCount,
valueArgumentsCount = function.valueParameters.size, valueArgumentsCount = function.valueParameters.size,
reflectionTarget = symbol reflectionTarget = symbol
) ).applyTypeArguments(callableReferenceAccess)
.applyReceivers(callableReferenceAccess, explicitReceiverExpression)
} }
} }
else -> { else -> {
@@ -153,7 +155,7 @@ class CallAndReferenceGenerator(
) )
} }
} }
}.applyTypeArguments(callableReferenceAccess).applyReceivers(callableReferenceAccess, explicitReceiverExpression) }
} }
private fun computeFieldSymbolForCallableReference( private fun computeFieldSymbolForCallableReference(
@@ -2695,6 +2695,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt"); 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 @Nested
@TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion") @TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
@@ -1,6 +1,5 @@
// DONT_TARGET_EXACT_BACKEND: WASM // DONT_TARGET_EXACT_BACKEND: WASM
// WASM_MUTE_REASON: BINDING_RECEIVERS // WASM_MUTE_REASON: BINDING_RECEIVERS
// IGNORE_BACKEND_FIR: JVM_IR
import Host.foo 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"); 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 @Nested
@TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion") @TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
@@ -2695,6 +2695,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt"); 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 @Nested
@TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion") @TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
@@ -2362,6 +2362,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/varargWithDefaultValue.kt"); 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") @TestMetadata("compiler/testData/codegen/box/callableReference/adaptedReferences/suspendConversion")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class) @RunWith(JUnit3RunnerWithInners.class)