JVM: Add suspend conversion bit for function references equals/hashCode

This commit is contained in:
Dmitry Petrov
2020-04-24 18:39:29 +03:00
parent c7a96810bf
commit 000757c75b
7 changed files with 42 additions and 4 deletions
@@ -12,6 +12,7 @@ import kotlin.Unit;
import kotlin.collections.CollectionsKt; import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.FunctionTypesKt;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.codegen.binding.CalculatedClosure; import org.jetbrains.kotlin.codegen.binding.CalculatedClosure;
import org.jetbrains.kotlin.codegen.binding.CodegenBinding; import org.jetbrains.kotlin.codegen.binding.CodegenBinding;
@@ -527,7 +528,7 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
PropertyReferenceCodegen.generateCallableReferenceSignature(iv, functionReferenceTarget, state); PropertyReferenceCodegen.generateCallableReferenceSignature(iv, functionReferenceTarget, state);
int flags = int flags =
(isTopLevelCallableReference(functionReferenceTarget) ? 1 : 0) + (isTopLevelCallableReference(functionReferenceTarget) ? 1 : 0) +
(calculateFunctionReferenceFlags(functionReferenceCall, funDescriptor) << 1); (calculateFunctionReferenceFlags(functionReferenceCall, funDescriptor, classDescriptor) << 1);
iv.aconst(flags); iv.aconst(flags);
superCtorArgTypes.add(JAVA_CLASS_TYPE); superCtorArgTypes.add(JAVA_CLASS_TYPE);
superCtorArgTypes.add(JAVA_STRING_TYPE); superCtorArgTypes.add(JAVA_STRING_TYPE);
@@ -551,10 +552,12 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
} }
private static int calculateFunctionReferenceFlags( private static int calculateFunctionReferenceFlags(
@NotNull ResolvedCall<?> call, @NotNull FunctionDescriptor anonymousAdaptedFunction @NotNull ResolvedCall<?> call,
@NotNull FunctionDescriptor anonymousAdaptedFunction,
@NotNull ClassDescriptor classDescriptor
) { ) {
boolean hasVarargMappedToElement = false; boolean hasVarargMappedToElement = false;
CallableDescriptor target = call.getResultingDescriptor(); FunctionDescriptor target = (FunctionDescriptor) call.getResultingDescriptor();
int shift = int shift =
(call.getDispatchReceiver() instanceof TransientReceiver ? 1 : 0) + (call.getDispatchReceiver() instanceof TransientReceiver ? 1 : 0) +
(call.getExtensionReceiver() 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()) && boolean hasCoercionToUnit = KotlinBuiltIns.isUnit(anonymousAdaptedFunction.getReturnType()) &&
!KotlinBuiltIns.isUnit(target.getReturnType()); !KotlinBuiltIns.isUnit(target.getReturnType());
boolean hasSuspendConversion =
!target.isSuspend() &&
classDescriptor.getTypeConstructor().getSupertypes().stream().anyMatch(FunctionTypesKt::isSuspendFunctionType);
return (hasVarargMappedToElement ? 1 : 0) + return (hasVarargMappedToElement ? 1 : 0) +
((hasCoercionToUnit ? 1 : 0) << 1); (hasSuspendConversion ? 2 : 0) +
((hasCoercionToUnit ? 1 : 0) << 2);
} }
protected int calculateArity() { protected int calculateArity() {
@@ -2432,6 +2432,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); 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") @TestMetadata("varargAsArrayMemberOrExtension.kt")
public void testVarargAsArrayMemberOrExtension() throws Exception { public void testVarargAsArrayMemberOrExtension() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
@@ -2452,6 +2452,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); 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") @TestMetadata("varargAsArrayMemberOrExtension.kt")
public void testVarargAsArrayMemberOrExtension() throws Exception { public void testVarargAsArrayMemberOrExtension() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
@@ -2452,6 +2452,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); 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") @TestMetadata("varargAsArrayMemberOrExtension.kt")
public void testVarargAsArrayMemberOrExtension() throws Exception { public void testVarargAsArrayMemberOrExtension() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
@@ -2432,6 +2432,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); 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") @TestMetadata("varargAsArrayMemberOrExtension.kt")
public void testVarargAsArrayMemberOrExtension() throws Exception { public void testVarargAsArrayMemberOrExtension() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
@@ -1827,6 +1827,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); 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") @TestMetadata("varargAsArrayMemberOrExtension.kt")
public void testVarargAsArrayMemberOrExtension() throws Exception { public void testVarargAsArrayMemberOrExtension() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");
@@ -1827,6 +1827,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/callableReference/equality/simpleEquality.kt"); 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") @TestMetadata("varargAsArrayMemberOrExtension.kt")
public void testVarargAsArrayMemberOrExtension() throws Exception { public void testVarargAsArrayMemberOrExtension() throws Exception {
runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt"); runTest("compiler/testData/codegen/box/callableReference/equality/varargAsArrayMemberOrExtension.kt");