FIR2IR: Fix incorrect conversion of adapted callable references with receiver
This commit is contained in:
+6
-4
@@ -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(
|
||||
|
||||
+6
@@ -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
@@ -1,6 +1,5 @@
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// WASM_MUTE_REASON: BINDING_RECEIVERS
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
|
||||
import Host.foo
|
||||
|
||||
|
||||
+10
@@ -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
|
||||
+6
@@ -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")
|
||||
|
||||
+6
@@ -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")
|
||||
|
||||
+5
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user