JVM: Add suspend conversion bit for function references equals/hashCode
This commit is contained in:
@@ -12,6 +12,7 @@ import kotlin.Unit;
|
||||
import kotlin.collections.CollectionsKt;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.builtins.FunctionTypesKt;
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||
import org.jetbrains.kotlin.codegen.binding.CalculatedClosure;
|
||||
import org.jetbrains.kotlin.codegen.binding.CodegenBinding;
|
||||
@@ -527,7 +528,7 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
|
||||
PropertyReferenceCodegen.generateCallableReferenceSignature(iv, functionReferenceTarget, state);
|
||||
int flags =
|
||||
(isTopLevelCallableReference(functionReferenceTarget) ? 1 : 0) +
|
||||
(calculateFunctionReferenceFlags(functionReferenceCall, funDescriptor) << 1);
|
||||
(calculateFunctionReferenceFlags(functionReferenceCall, funDescriptor, classDescriptor) << 1);
|
||||
iv.aconst(flags);
|
||||
superCtorArgTypes.add(JAVA_CLASS_TYPE);
|
||||
superCtorArgTypes.add(JAVA_STRING_TYPE);
|
||||
@@ -551,10 +552,12 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
|
||||
}
|
||||
|
||||
private static int calculateFunctionReferenceFlags(
|
||||
@NotNull ResolvedCall<?> call, @NotNull FunctionDescriptor anonymousAdaptedFunction
|
||||
@NotNull ResolvedCall<?> call,
|
||||
@NotNull FunctionDescriptor anonymousAdaptedFunction,
|
||||
@NotNull ClassDescriptor classDescriptor
|
||||
) {
|
||||
boolean hasVarargMappedToElement = false;
|
||||
CallableDescriptor target = call.getResultingDescriptor();
|
||||
FunctionDescriptor target = (FunctionDescriptor) call.getResultingDescriptor();
|
||||
int shift =
|
||||
(call.getDispatchReceiver() instanceof TransientReceiver ? 1 : 0) +
|
||||
(call.getExtensionReceiver() instanceof TransientReceiver ? 1 : 0);
|
||||
@@ -577,8 +580,13 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
|
||||
boolean hasCoercionToUnit = KotlinBuiltIns.isUnit(anonymousAdaptedFunction.getReturnType()) &&
|
||||
!KotlinBuiltIns.isUnit(target.getReturnType());
|
||||
|
||||
boolean hasSuspendConversion =
|
||||
!target.isSuspend() &&
|
||||
classDescriptor.getTypeConstructor().getSupertypes().stream().anyMatch(FunctionTypesKt::isSuspendFunctionType);
|
||||
|
||||
return (hasVarargMappedToElement ? 1 : 0) +
|
||||
((hasCoercionToUnit ? 1 : 0) << 1);
|
||||
(hasSuspendConversion ? 2 : 0) +
|
||||
((hasCoercionToUnit ? 1 : 0) << 2);
|
||||
}
|
||||
|
||||
protected int calculateArity() {
|
||||
|
||||
Generated
+5
@@ -2432,6 +2432,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendConversion.kt")
|
||||
public void testSuspendConversion() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("varargAsArrayMemberOrExtension.kt")
|
||||
public void testVarargAsArrayMemberOrExtension() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
|
||||
|
||||
+5
@@ -2452,6 +2452,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendConversion.kt")
|
||||
public void testSuspendConversion() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("varargAsArrayMemberOrExtension.kt")
|
||||
public void testVarargAsArrayMemberOrExtension() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
|
||||
|
||||
+5
@@ -2452,6 +2452,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendConversion.kt")
|
||||
public void testSuspendConversion() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("varargAsArrayMemberOrExtension.kt")
|
||||
public void testVarargAsArrayMemberOrExtension() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
|
||||
|
||||
+5
@@ -2432,6 +2432,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendConversion.kt")
|
||||
public void testSuspendConversion() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("varargAsArrayMemberOrExtension.kt")
|
||||
public void testVarargAsArrayMemberOrExtension() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
|
||||
|
||||
Generated
+5
@@ -1827,6 +1827,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendConversion.kt")
|
||||
public void testSuspendConversion() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("varargAsArrayMemberOrExtension.kt")
|
||||
public void testVarargAsArrayMemberOrExtension() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
|
||||
|
||||
+5
@@ -1827,6 +1827,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("suspendConversion.kt")
|
||||
public void testSuspendConversion() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/suspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("varargAsArrayMemberOrExtension.kt")
|
||||
public void testVarargAsArrayMemberOrExtension() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
|
||||
|
||||
Reference in New Issue
Block a user