private void generateCallbackClass()

in boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java [525:594]


    private void generateCallbackClass(Map<String,Map<String, ExecutableElement>> process) {
        for (Map.Entry<String, Map<String, ExecutableElement>> pkgEn : process.entrySet()) {
            String pkgName = pkgEn.getKey();
            Map<String, ExecutableElement> map = pkgEn.getValue();
            StringBuilder source = new StringBuilder();
            source.append("package ").append(pkgName).append(";\n");
            source.append("@java.lang.SuppressWarnings(\"all\")\n");
            source.append("public final class $JsCallbacks$ {\n");
            source.append("  static final $JsCallbacks$ VM = new $JsCallbacks$(null);\n");
            source.append("  private final org.netbeans.html.boot.spi.Fn.Ref<?> ref;\n");
            source.append("  private $JsCallbacks$ next;\n");
            source.append("  private $JsCallbacks$(org.netbeans.html.boot.spi.Fn.Presenter p) {\n");
            source.append("    this.ref = org.netbeans.html.boot.spi.Fn.ref(p);\n");
            source.append("  }\n");
            source.append("  synchronized final $JsCallbacks$ current() {\n");
            source.append("    org.netbeans.html.boot.spi.Fn.Presenter now = org.netbeans.html.boot.spi.Fn.activePresenter();\n");
            source.append("    $JsCallbacks$ thiz = this;\n");
            source.append("    $JsCallbacks$ prev = null;\n");
            source.append("    for (;;) {\n");
            source.append("      if (thiz.ref != null) {\n");
            source.append("        org.netbeans.html.boot.spi.Fn.Presenter thizPresenter = thiz.ref.presenter();\n");
            source.append("        if (thizPresenter == null) {\n");
            source.append("          if (prev != null) {\n");
            source.append("            prev.next = thiz.next;\n");
            source.append("          }\n");
            source.append("        } else {\n");
            source.append("          if (thizPresenter == now) return thiz;\n");
            source.append("        }\n");
            source.append("      }\n");
            source.append("      if (thiz.next == null) {\n");
            source.append("        return thiz.next = new $JsCallbacks$(now);\n");
            source.append("      }\n");
            source.append("      prev = thiz;\n");
            source.append("      thiz = thiz.next;\n");
            source.append("    }\n");
            source.append("  }\n");
            source.append("  private static <T> T cast(org.netbeans.html.boot.spi.Fn.Presenter p, java.lang.Class<T> clazz, java.lang.Object obj) {\n");
            source.append("    if (p instanceof org.netbeans.html.boot.spi.Fn.FromJavaScript) {\n");
            source.append("      obj = ((org.netbeans.html.boot.spi.Fn.FromJavaScript)p).toJava(obj);\n");
            source.append("    }\n");
            source.append("    return clazz.cast(obj);\n");
            source.append("  }\n");
            source.append("  private static java.lang.Object toJs(org.netbeans.html.boot.spi.Fn.Presenter p, java.lang.Object obj) {\n");
            source.append("    if (p instanceof org.netbeans.html.boot.spi.Fn.ToJavaScript) {\n");
            source.append("      obj = ((org.netbeans.html.boot.spi.Fn.ToJavaScript)p).toJavaScript(obj);\n");
            source.append("    }\n");
            source.append("    return obj;\n");
            source.append("  }\n");
            for (Map.Entry<String, ExecutableElement> entry : map.entrySet()) {
                final String mangled = entry.getKey();
                final ExecutableElement m = entry.getValue();
                generateMethod(false, false, m, source, mangled);
                generateMethod(true, false, m, source, "raw$" + mangled);
                generateMethod(true, true, m, source, "promise$" + mangled);
            }
            source.append("}\n");
            final String srcName = pkgName + ".$JsCallbacks$";
            try {
                try (Writer w = processingEnv.getFiler().createSourceFile(srcName,
                    map.values().toArray(new Element[map.size()])
                ).openWriter()) {
                    w.write(source.toString());
                }
            } catch (IOException ex) {
                processingEnv.getMessager().printMessage(
                    Diagnostic.Kind.ERROR, "Can't write " + srcName + ": " + ex.getMessage()
                );
            }
        }
    }