Ensure callback can be made to Java method with innerclass type parameters
authorJaroslav Tulach <jtulach@netbeans.org>
Sat, 11 Apr 2015 07:41:04 +0200
changeset 9339d158eb4a797
parent 932 f2de2ae88589
child 934 bbbdf003a99b
Ensure callback can be made to Java method with innerclass type parameters
boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java
boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java
boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java
     1.1 --- a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java	Tue Mar 31 15:40:22 2015 +0200
     1.2 +++ b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java	Sat Apr 11 07:41:04 2015 +0200
     1.3 @@ -71,6 +71,7 @@
     1.4  import javax.lang.model.element.TypeElement;
     1.5  import javax.lang.model.element.VariableElement;
     1.6  import javax.lang.model.type.ArrayType;
     1.7 +import javax.lang.model.type.DeclaredType;
     1.8  import javax.lang.model.type.ExecutableType;
     1.9  import javax.lang.model.type.TypeKind;
    1.10  import javax.lang.model.type.TypeMirror;
    1.11 @@ -295,8 +296,8 @@
    1.12                          tm = ((ArrayType)tm).getComponentType();
    1.13                      }
    1.14                      sb.append('L');
    1.15 -                    sb.append(tm.toString().replace('.', '/'));
    1.16 -                    sb.append(';');
    1.17 +                    Element elm = processingEnv.getTypeUtils().asElement(tm);
    1.18 +                    dumpElems(sb, elm, ';');
    1.19                  }
    1.20              }
    1.21              sb.append(')');
    1.22 @@ -304,6 +305,21 @@
    1.23          }
    1.24      }
    1.25      
    1.26 +    private static void dumpElems(StringBuilder sb, Element e, char after) {
    1.27 +        if (e == null) {
    1.28 +            return;
    1.29 +        }
    1.30 +        if (e.getKind() == ElementKind.PACKAGE) {
    1.31 +            PackageElement pe = (PackageElement) e;
    1.32 +            sb.append(pe.getQualifiedName().toString().replace('.', '/')).append('/');
    1.33 +            return;
    1.34 +        }
    1.35 +        Element p = e.getEnclosingElement();
    1.36 +        dumpElems(sb, p, '$');
    1.37 +        sb.append(e.getSimpleName());
    1.38 +        sb.append(after);
    1.39 +    }
    1.40 +    
    1.41      private void generateJavaScriptBodyList(Map<String,Set<TypeElement>> bodies) {
    1.42          if (bodies.isEmpty()) {
    1.43              return;
     2.1 --- a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java	Tue Mar 31 15:40:22 2015 +0200
     2.2 +++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java	Sat Apr 11 07:41:04 2015 +0200
     2.3 @@ -183,6 +183,16 @@
     2.4          Method st = methodClass.getMethod("parseInt", String.class);
     2.5          assertEquals(st.invoke(null, "42"), 42, "Meaning of JavaScript?");
     2.6      }
     2.7 +
     2.8 +    @Test public void passEnum() throws Throwable {
     2.9 +        Class<?> enmClazz = methodClass.getDeclaredClasses()[0];
    2.10 +        assertTrue(Enum.class.isAssignableFrom(enmClazz), "It is an enum: " + enmClazz);
    2.11 +        Class<? extends Enum> enmClazz2 = enmClazz.asSubclass(Enum.class);
    2.12 +        Method st = methodClass.getMethod("fromEnum", enmClazz);
    2.13 +        
    2.14 +        Object valueB = Enum.valueOf(enmClazz2, "B");
    2.15 +        assertEquals(st.invoke(null, valueB), "B", "Converts to string");
    2.16 +    }
    2.17      
    2.18      @Test public void firstLong() throws Throwable {
    2.19          Method st = methodClass.getMethod("chooseLong", boolean.class, boolean.class, long.class, long.class);
     3.1 --- a/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java	Tue Mar 31 15:40:22 2015 +0200
     3.2 +++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsMethods.java	Sat Apr 11 07:41:04 2015 +0200
     3.3 @@ -106,6 +106,9 @@
     3.4      @JavaScriptBody(args = { "v" }, javacall = true, body = "return @java.lang.Integer::parseInt(Ljava/lang/String;)(v);")
     3.5      public static native int parseInt(String v);
     3.6      
     3.7 +    @JavaScriptBody(args = { "v" }, body = "return v.toString();")
     3.8 +    public static native String fromEnum(Enm v);
     3.9 +    
    3.10      @JavaScriptBody(args = "arr", body = "return arr;")
    3.11      public static native Object[] arr(Object[] arr);
    3.12      
    3.13 @@ -137,4 +140,8 @@
    3.14      
    3.15      @JavaScriptBody(args = { "x" }, keepAlive = false, body = "throw 'Do not call me!'")
    3.16      public static native int checkAllowGC(Object x);
    3.17 +    
    3.18 +    enum Enm {
    3.19 +        A, B;
    3.20 +    }
    3.21  }