public static Signature bindSignature(Signature signature, Map<String, Type> boundParameters, int arity)
{
checkArgument((signature.isVariableArity() && arity >= signature.getArgumentTypes().size() - 1) || arity == signature.getArgumentTypes().size(),
"Illegal arity %d for function %s", arity, signature);
List<TypeSignature> argumentTypes = signature.getArgumentTypes();
ImmutableList.Builder<TypeSignature> boundArguments = ImmutableList.builder();
for (int i = 0; i < argumentTypes.size() - 1; i++) {
boundArguments.add(argumentTypes.get(i).bindParameters(boundParameters));
}
if (!argumentTypes.isEmpty()) {
TypeSignature lastArgument = argumentTypes.get(argumentTypes.size() - 1).bindParameters(boundParameters);
if (signature.isVariableArity()) {
for (int i = 0; i < arity - (argumentTypes.size() - 1); i++) {
boundArguments.add(lastArgument);
}
}
else {
boundArguments.add(lastArgument);
}
}
return new Signature(signature.getName(), signature.getKind(), signature.getReturnType().bindParameters(boundParameters), boundArguments.build());
}