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()
);
}
}
}