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,
|
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(
|
||||||
|
|||||||
+6
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
+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");
|
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")
|
||||||
|
|||||||
+6
@@ -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")
|
||||||
|
|||||||
+5
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user