@Override public String getName() { return getOverloads()[0].getName(); }
@Override public String toString() { StringJoiner sj = new StringJoiner(", ", "Method[", "]"); for (SingleMethodDesc overload : getOverloads()) { sj.add(overload.getReflectionMethod().toString()); } return sj.toString(); }
public boolean isConstructor() { return getOverloads()[0].isConstructor(); }
public boolean isMethod() { return getOverloads()[0].isMethod(); }
static JavaMethodDesc merge(JavaMethodDesc existing, JavaMethodDesc other) { assert other instanceof SingleMethodDesc; if (existing instanceof SingleMethodDesc) { return new OverloadedMethodDesc(new SingleMethodDesc[]{(SingleMethodDesc) existing, (SingleMethodDesc) other}); } else { SingleMethodDesc[] oldOverloads = ((OverloadedMethodDesc) existing).getOverloads(); SingleMethodDesc[] newOverloads = Arrays.copyOf(oldOverloads, oldOverloads.length + 1); newOverloads[oldOverloads.length] = (SingleMethodDesc) other; return new OverloadedMethodDesc(newOverloads); } }
@TruffleBoundary static SingleMethodDesc selectOverload(OverloadedMethodDesc method, Object[] args, Object languageContext, ToJavaNode toJavaNode, Type[] cachedArgTypes) { SingleMethodDesc[] overloads = method.getOverloads(); List<SingleMethodDesc> applicableByArity = new ArrayList<>(); int minOverallArity = Integer.MAX_VALUE;
@CompilerDirectives.TruffleBoundary static boolean isApplicableByArity(JavaMethodDesc method, int nArgs) { if (method instanceof SingleMethodDesc) { return nArgs == ((SingleMethodDesc) method).getParameterCount() || ((SingleMethodDesc) method).isVarArgs() && nArgs >= ((SingleMethodDesc) method).getParameterCount() - 1; } else { SingleMethodDesc[] overloads = ((OverloadedMethodDesc) method).getOverloads(); for (SingleMethodDesc overload : overloads) { if (isApplicableByArity(overload, nArgs)) { return true; } } return false; } }