private void generateMethod()

in boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java [596:702]


    private void generateMethod(boolean selfObj, boolean promise, final ExecutableElement m, StringBuilder source, final String mangled) {
        final boolean isStatic = m.getModifiers().contains(Modifier.STATIC);
        final TypeElement selfType = (TypeElement)m.getEnclosingElement();
        Types tu = processingEnv.getTypeUtils();

        source.append("\n  public java.lang.Object ")
                .append(mangled)
                .append("(");

        {
            String sep = "";
            if (!isStatic) {
                source.append("final ");
                if (selfObj) {
                    source.append("java.lang.Object self");
                } else {
                    source.append(selfType.getQualifiedName());
                    source.append(" self");
                }
                sep = ", ";
            }

            int cnt = 0;
            for (VariableElement ve : m.getParameters()) {
                source.append(sep).append("final ");
                ++cnt;
                TypeMirror t = ve.asType();
                if (!t.getKind().isPrimitive() && !"java.lang.String".equals(t.toString())) { // NOI18N
                    source.append("java.lang.Object");
                } else {
                    source.append(t);
                }
                source.append(" arg").append(cnt);
                sep = ", ";
            }
        }
        source.append(") throws Throwable {\n");
        source.append("    final org.netbeans.html.boot.spi.Fn.Presenter p = ref.presenter(); \n");
        String newLine = "";
        if (promise) {
            source.append("    return new org.netbeans.html.boot.spi.Fn.Promise(p) {\n");
            source.append("      @Override\n");
            source.append("      protected java.lang.Object compute() throws java.lang.Throwable {\n");
            newLine = "    ";
        } else {
            if (useTryResources()) {
                newLine += "      ";
                source.append("    try (java.io.Closeable a = org.netbeans.html.boot.spi.Fn.activate(p)) {");
            } else {
                newLine += "    ";
                source.append("    java.io.Closeable a = org.netbeans.html.boot.spi.Fn.activate(p); try {");
            }
        }
        newLine = "\n" + newLine;
        source.append(newLine);
        if (m.getReturnType().getKind() != TypeKind.VOID) {
            source.append("java.lang.Object $ret = ");
        }
        if (isStatic) {
            source.append(((TypeElement)m.getEnclosingElement()).getQualifiedName());
            source.append('.');
        } else {
            if (selfObj) {
                source.append("cast(p, ");
                source.append(selfType.getQualifiedName());
                source.append(".class, self).");
            } else {
                source.append("self.");
            }
        }
        source.append(m.getSimpleName());
        source.append("(");
        {
            int cnt = 0;
            String sep = newLine + "  ";
            for (VariableElement ve : m.getParameters()) {
                source.append(sep);
                TypeMirror targetType = tu.erasure(ve.asType());
                if (targetType.getKind().isPrimitive()) {
                    targetType = tu.boxedClass((PrimitiveType) targetType).asType();
                }
                source.append("cast(p, ").append(targetType);
                source.append(".class, arg").append(++cnt).append(")");
                sep = "," + newLine + "  ";
            }
        }
        source.append(");").append(newLine);
        if (m.getReturnType().getKind() == TypeKind.VOID) {
            source.append("return null;");
        } else {
            source.append("return toJs(p, $ret);");
        }
        source.append("\n");
        if (promise) {
            source.append("    }}.schedule();\n");
        } else {
            if (useTryResources()) {
                source.append("    }\n");
            } else {

                source.append("    } finally {\n");
                source.append("      a.close();\n");
                source.append("    }\n");
            }
        }
        source.append("  }\n");
    }