private TooltipData generateTooltipData(FormulaFunction function, int currentArgIndex) {
   TooltipData td = new TooltipData();
   StringBuilder sb = new StringBuilder();
   sb.append(function.getName() + "(");
   int nbArgs = function.getArgumentNames().size();
   int from = 0, to = 0;
   for (int i = 0; i < nbArgs; i++) {
     if (i == currentArgIndex) {
       from = sb.length();
     }
     sb.append("<");
     sb.append(function.getArgumentTypes().get(i).getSimpleName());
     sb.append(">");
     sb.append(function.getArgumentNames().get(i));
     if (i == currentArgIndex) {
       to = sb.length();
     }
     if (i < nbArgs - 1) sb.append(", ");
   }
   if (function.isVarArgs()) {
     if (currentArgIndex >= nbArgs) {
       from = sb.length();
       to = from + 4;
     }
     sb.append(",...");
   }
   sb.append(")");
   td.styles = new ProposalStyle[1];
   td.styles[0] = ProposalStyle.getDefault(from, to);
   td.value = sb.toString();
   return td;
 }
 private String generateSignature(FormulaFunction function) {
   StringBuffer sb = new StringBuffer();
   if (function.getReturnType() != null) {
     sb.append("<");
     sb.append(function.getReturnType().getSimpleName());
     sb.append("> ");
   }
   sb.append(function.getName() + "(");
   int nbArgs = function.getArgumentNames().size();
   for (int i = 0; i < nbArgs; i++) {
     sb.append("<");
     sb.append(function.getArgumentTypes().get(i).getSimpleName());
     sb.append(">");
     sb.append(function.getArgumentNames().get(i));
     if (i < nbArgs - 1) sb.append(", ");
   }
   if (function.isVarArgs()) sb.append(",...");
   sb.append(")");
   return sb.toString();
 }