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