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/05/08 19:39:14 UTC

[netbeans-html4j] branch master updated: Enforce binary name for inner classes in the @JavaScriptBody callbacks

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 333650b3 Enforce binary name for inner classes in the @JavaScriptBody callbacks
333650b3 is described below

commit 333650b3fbaa3cdbec083f974816e8ae06852ffb
Author: Jaroslav Tulach <ja...@apidesign.org>
AuthorDate: Sun May 8 21:39:02 2022 +0200

    Enforce binary name for inner classes in the @JavaScriptBody callbacks
---
 .../html/boot/impl/JavaScriptProcesor.java         | 41 ++++++++++++++++++++--
 .../java/net/java/html/js/tests/AsyncJava.java     |  2 +-
 2 files changed, 40 insertions(+), 3 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 08157278..f8a7cdbb 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
@@ -302,7 +302,7 @@ public final class JavaScriptProcesor extends AbstractProcessor {
             } else if (preId == ':') {
                 int lastAt = userText.lastIndexOf('@', preIdentifierAt + 1);
                 String maybeClassName = userText.substring(lastAt + 1, preIdentifierAt - 1);
-                TypeElement maybeClass = processingEnv.getElementUtils().getTypeElement(maybeClassName);
+                TypeElement maybeClass = findClass(maybeClassName);
                 String instanceName = null;
                 if (lastAt > 0 && userText.charAt(lastAt - 1) == '.') {
                     instanceName = endsWithIdentifier(userText, lastAt - 1);
@@ -358,6 +358,37 @@ public final class JavaScriptProcesor extends AbstractProcessor {
         return Collections.emptyList();
     }
 
+    final TypeElement findClass(String classname) {
+        if (classname == null) {
+            return null;
+        }
+        TypeElement clazz = processingEnv.getElementUtils().getTypeElement(classname);
+        if (clazz != null) {
+            return clazz;
+        }
+        int dolar = classname.indexOf('$');
+        if (dolar == -1) {
+            return null;
+        }
+        final String parentName = classname.substring(0, dolar);
+        TypeElement parent = processingEnv.getElementUtils().getTypeElement(parentName);
+        if (parent != null) {
+            String rest = classname.substring(dolar + 1);
+            for (Element e : parent.getEnclosedElements()) {
+                if (!e.getKind().isClass() && !e.getKind().isInterface()) {
+                    continue;
+                }
+                if (rest.equals(e.getSimpleName().toString())) {
+                    clazz = (TypeElement) e;
+                    break;
+                }
+            }
+        }
+        String binaryClassName = classname.replace('$', '.');
+        clazz = processingEnv.getElementUtils().getTypeElement(binaryClassName);
+        return clazz;
+    }
+
     final void wrongArrayError(TypeMirror paramType, Element method) {
         processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Don't use " + paramType + " array. Use Object[].", method);
     }
@@ -385,13 +416,19 @@ public final class JavaScriptProcesor extends AbstractProcessor {
 
         @Override
         protected CharSequence callMethod(String ident, boolean promise, String fqn, String method, String params) {
-            final TypeElement type = processingEnv.getElementUtils().getTypeElement(fqn);
+            final TypeElement type = findClass(fqn);
             if (type == null) {
                 processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
                     "Callback to non-existing class " + fqn, e
                 );
                 return "";
             }
+            String binName = processingEnv.getElementUtils().getBinaryName(type).toString();
+            if (!fqn.equals(binName)) {
+                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
+                    "Use binary classname " + binName + " in the callback", e);
+            }
+
             ExecutableElement found = null;
             String paramTypes = null;
             StringBuilder foundParams = new StringBuilder();
diff --git a/json-tck/src/main/java/net/java/html/js/tests/AsyncJava.java b/json-tck/src/main/java/net/java/html/js/tests/AsyncJava.java
index 76e9cad7..42792318 100644
--- a/json-tck/src/main/java/net/java/html/js/tests/AsyncJava.java
+++ b/json-tck/src/main/java/net/java/html/js/tests/AsyncJava.java
@@ -28,7 +28,7 @@ public class AsyncJava {
     var result = {
         x : -1
     };
-    var facN = fac.@net.java.html.js.tests.AsyncJava.Fac::fac(I)(n);
+    var facN = fac.@net.java.html.js.tests.AsyncJava$Fac::fac(I)(n);
     facN.then(function (res) {
         result.x = res;
         done.@java.lang.Runnable::run()();


---------------------------------------------------------------------
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