You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jt...@apache.org on 2022/03/07 03:41:57 UTC

[netbeans-html4j] branch master updated: Encapsulate cast and to JavaScript conversion into dedicated methods

This is an automated email from the ASF dual-hosted git repository.

jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans-html4j.git


The following commit(s) were added to refs/heads/master by this push:
     new 37c42af  Encapsulate cast and to JavaScript conversion into dedicated methods
37c42af is described below

commit 37c42af80992e56708808bf3016f228d718a68ef
Author: Jaroslav Tulach <ja...@apidesign.org>
AuthorDate: Mon Mar 7 04:41:40 2022 +0100

    Encapsulate cast and to JavaScript conversion into dedicated methods
---
 .../html/boot/impl/JavaScriptProcesor.java         | 184 +++++++++++----------
 1 file changed, 94 insertions(+), 90 deletions(-)

diff --git a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
index 01d8c22..1ecdc85 100644
--- a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
+++ b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
@@ -50,6 +50,7 @@ import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.ArrayType;
 import javax.lang.model.type.ExecutableType;
+import javax.lang.model.type.PrimitiveType;
 import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.Types;
@@ -66,14 +67,15 @@ import org.openide.util.lookup.ServiceProvider;
  */
 @ServiceProvider(service = Processor.class)
 public final class JavaScriptProcesor extends AbstractProcessor {
-    private final Map<String,Map<String,ExecutableElement>> javacalls =
-        new HashMap<String,Map<String,ExecutableElement>>();
-    private final Map<String,Set<TypeElement>> bodies =
-        new HashMap<String, Set<TypeElement>>();
+    private final Map<String,Map<String,ExecutableElement>> javacalls = new HashMap<>();
+    private final Map<String,Set<TypeElement>> bodies = new HashMap<>();
+
+    public JavaScriptProcesor() {
+    }
 
     @Override
     public Set<String> getSupportedAnnotationTypes() {
-        Set<String> set = new HashSet<String>();
+        Set<String> set = new HashSet<>();
         set.add(JavaScriptBody.class.getName());
         set.add(JavaScriptResource.class.getName());
         set.add(JavaScriptResource.Group.class.getName());
@@ -82,11 +84,7 @@ public final class JavaScriptProcesor extends AbstractProcessor {
 
     @Override
     public SourceVersion getSupportedSourceVersion() {
-        try {
-            return SourceVersion.valueOf("RELEASE_8"); // NOI18N
-        } catch (IllegalArgumentException ex) {
-            return SourceVersion.RELEASE_7;
-        }
+        return SourceVersion.latest();
     }
 
     @Override
@@ -105,7 +103,7 @@ public final class JavaScriptProcesor extends AbstractProcessor {
             } else {
                 Set<TypeElement> classes = this.bodies.get(findPkg(e));
                 if (classes == null) {
-                    classes = new HashSet<TypeElement>();
+                    classes = new HashSet<>();
                     bodies.put(findPkg(e), classes);
                 }
                 Element t = e.getEnclosingElement();
@@ -424,7 +422,7 @@ public final class JavaScriptProcesor extends AbstractProcessor {
             } else {
                 Map<String,ExecutableElement> mangledOnes = javacalls.get(findPkg(e));
                 if (mangledOnes == null) {
-                    mangledOnes = new TreeMap<String, ExecutableElement>();
+                    mangledOnes = new TreeMap<>();
                     javacalls.put(findPkg(e), mangledOnes);
                 }
                 String mangled = JsCallback.mangle(fqn, method, paramTypes);
@@ -457,34 +455,31 @@ public final class JavaScriptProcesor extends AbstractProcessor {
             FileObject all = processingEnv.getFiler().createResource(
                 StandardLocation.CLASS_OUTPUT, "", "META-INF/net.java.html.js.classes"
             );
-            PrintWriter wAll = new PrintWriter(new OutputStreamWriter(
+            try (PrintWriter wAll = new PrintWriter(new OutputStreamWriter(
                 all.openOutputStream(), "UTF-8"
-            ));
-            for (Map.Entry<String, Set<TypeElement>> entry : bodies.entrySet()) {
-                String pkg = entry.getKey();
-                Set<TypeElement> classes = entry.getValue();
-
-                FileObject out = processingEnv.getFiler().createResource(
-                    StandardLocation.CLASS_OUTPUT, pkg, "net.java.html.js.classes",
-                    classes.iterator().next()
-                );
-                OutputStream os = out.openOutputStream();
-                try {
-                    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
-                    for (TypeElement type : classes) {
-                        final Name bn = processingEnv.getElementUtils().getBinaryName(type);
-                        w.println(bn);
-                        wAll.println(bn);
+            ))) {
+                for (Map.Entry<String, Set<TypeElement>> entry : bodies.entrySet()) {
+                    String pkg = entry.getKey();
+                    Set<TypeElement> classes = entry.getValue();
+
+                    FileObject out = processingEnv.getFiler().createResource(
+                            StandardLocation.CLASS_OUTPUT, pkg, "net.java.html.js.classes",
+                            classes.iterator().next()
+                    );
+                    try (OutputStream os = out.openOutputStream()) {
+                        PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
+                        for (TypeElement type : classes) {
+                            final Name bn = processingEnv.getElementUtils().getBinaryName(type);
+                            w.println(bn);
+                            wAll.println(bn);
+                        }
+                        w.flush();
+                        w.close();
+                    } catch (IOException x) {
+                        processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write to " + entry.getKey() + ": " + x.toString());
                     }
-                    w.flush();
-                    w.close();
-                } catch (IOException x) {
-                    processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write to " + entry.getKey() + ": " + x.toString());
-                } finally {
-                    os.close();
                 }
             }
-            wAll.close();
         } catch (IOException x) {
             processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write to " + "META-INF/net.java.html.js.classes: " + x.toString());
         }
@@ -526,6 +521,18 @@ public final class JavaScriptProcesor extends AbstractProcessor {
             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();
@@ -535,11 +542,11 @@ public final class JavaScriptProcesor extends AbstractProcessor {
             source.append("}\n");
             final String srcName = pkgName + ".$JsCallbacks$";
             try {
-                Writer w = processingEnv.getFiler().createSourceFile(srcName,
+                try (Writer w = processingEnv.getFiler().createSourceFile(srcName,
                     map.values().toArray(new Element[map.size()])
-                ).openWriter();
-                w.write(source.toString());
-                w.close();
+                ).openWriter()) {
+                    w.write(source.toString());
+                }
             } catch (IOException ex) {
                 processingEnv.getMessager().printMessage(
                     Diagnostic.Kind.ERROR, "Can't write " + srcName + ": " + ex.getMessage()
@@ -560,50 +567,43 @@ public final class JavaScriptProcesor extends AbstractProcessor {
                 .append(mangled)
                 .append("(");
 
-        String sep = "";
-        StringBuilder convert = new StringBuilder();
-        if (!isStatic) {
-            if (selfObj) {
-                source.append("java.lang.Object self");
-                convert.append("    if (p instanceof org.netbeans.html.boot.spi.Fn.FromJavaScript) {\n");
-                convert.append("      self").
-                        append(" = ((org.netbeans.html.boot.spi.Fn.FromJavaScript)p).toJava(self").
-                        append(");\n");
-                convert.append("    }\n");
-            } else {
-                source.append(selfType.getQualifiedName());
-                source.append(" self");
+        {
+            String sep = "";
+            if (!isStatic) {
+                if (selfObj) {
+                    source.append("java.lang.Object self");
+                } else {
+                    source.append(selfType.getQualifiedName());
+                    source.append(" self");
+                }
+                sep = ", ";
             }
-            sep = ", ";
-        }
 
-        int cnt = 0;
-        for (VariableElement ve : m.getParameters()) {
-            source.append(sep);
-            ++cnt;
-            final TypeMirror t = ve.asType();
-            if (!t.getKind().isPrimitive() && !"java.lang.String".equals(t.toString())) { // NOI18N
-                source.append("java.lang.Object");
-                convert.append("    if (p instanceof org.netbeans.html.boot.spi.Fn.FromJavaScript) {\n");
-                convert.append("      arg").append(cnt).
-                        append(" = ((org.netbeans.html.boot.spi.Fn.FromJavaScript)p).toJava(arg").append(cnt).
-                        append(");\n");
-                convert.append("    }\n");
-            } else {
-                source.append(t);
+            int cnt = 0;
+            for (VariableElement ve : m.getParameters()) {
+                source.append(sep);
+                ++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(" arg").append(cnt);
-            sep = ", ";
         }
         source.append(") throws Throwable {\n");
         source.append("    org.netbeans.html.boot.spi.Fn.Presenter p = ref.presenter(); \n");
-        source.append(convert);
+        String newLine;
         if (useTryResources()) {
-            source.append("    try (java.io.Closeable a = org.netbeans.html.boot.spi.Fn.activate(p)) { \n");
+            newLine =   "\n      ";
+            source.append("    try (java.io.Closeable a = org.netbeans.html.boot.spi.Fn.activate(p)) {");
         } else {
-            source.append("    java.io.Closeable a = org.netbeans.html.boot.spi.Fn.activate(p); try {\n");
+            newLine =   "\n    ";
+            source.append("    java.io.Closeable a = org.netbeans.html.boot.spi.Fn.activate(p); try {");
         }
-        source.append("    ");
+        source.append(newLine);
         if (m.getReturnType().getKind() != TypeKind.VOID) {
             source.append("java.lang.Object $ret = ");
         }
@@ -612,32 +612,36 @@ public final class JavaScriptProcesor extends AbstractProcessor {
             source.append('.');
         } else {
             if (selfObj) {
-                source.append("((");
+                source.append("cast(p, ");
                 source.append(selfType.getQualifiedName());
-                source.append(")self).");
+                source.append(".class, self).");
             } else {
                 source.append("self.");
             }
         }
         source.append(m.getSimpleName());
         source.append("(");
-        cnt = 0;
-        sep = "";
-        for (VariableElement ve : m.getParameters()) {
-            source.append(sep);
-            source.append("(").append(tu.erasure(ve.asType()));
-            source.append(")arg").append(++cnt);
-            sep = ", ";
+        {
+            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(");\n");
+        source.append(");").append(newLine);
         if (m.getReturnType().getKind() == TypeKind.VOID) {
-            source.append("    return null;\n");
+            source.append("return null;");
         } else {
-            source.append("    if (p instanceof org.netbeans.html.boot.spi.Fn.ToJavaScript) {\n");
-            source.append("      $ret = ((org.netbeans.html.boot.spi.Fn.ToJavaScript)p).toJavaScript($ret);\n");
-            source.append("    }\n");
-            source.append("    return $ret;\n");
+            source.append("return toJs(p, $ret);");
         }
+        source.append("\n");
         if (useTryResources()) {
             source.append("    }\n");
         } else {

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists