Skip to content

Commit 8f6bb82

Browse files
committed
Prioritize non-varargs methods in Java calls
1 parent af11d02 commit 8f6bb82

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

src/main/java/com/btk5h/skriptmirror/skript/reflect/ExprJavaCall.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -564,8 +564,8 @@ private static Object[] createInstanceArgumentsCopy(Object target, Object[] argu
564564
*/
565565
private Optional<MethodHandle> findCompatibleMethod(Descriptor descriptor, Object[] args) {
566566
return getCallSite(descriptor).stream()
567-
.filter(mh -> matchesArgs(args, mh))
568-
.findFirst();
567+
.filter(mh -> matchesArgs(args, mh))
568+
.min(ExprJavaCall::prioritizeMethodHandles);
569569
}
570570

571571
/**
@@ -609,6 +609,21 @@ private static boolean matchesArgs(Object[] args, MethodHandle mh) {
609609
return true;
610610
}
611611

612+
/**
613+
* Method for prioritizing certain {@link MethodHandle}s over others.
614+
* The lesser method handle has priority.
615+
*/
616+
private static int prioritizeMethodHandles(MethodHandle mh1, MethodHandle mh2) {
617+
boolean isMh1Varargs = mh1.isVarargsCollector();
618+
boolean isMh2Varargs = mh2.isVarargsCollector();
619+
620+
if (isMh1Varargs ^ isMh2Varargs) {
621+
return isMh1Varargs ? 1 : -1;
622+
}
623+
624+
return 0;
625+
}
626+
612627
private static Object[] convertTypes(MethodHandle mh, Object[] args) {
613628
Class<?>[] params = mh.type().parameterArray();
614629
int varargsIndex = params.length - 1;

0 commit comments

Comments
 (0)