Returning proper runtime representation for inner annotation arrays reflection
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 05 Feb 2013 00:00:22 +0100
branchreflection
changeset 665799a8cfefe35
parent 664 cad4ac1d51fb
child 666 8338ab1991e6
Returning proper runtime representation for inner annotation arrays
emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java
vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java
vm/src/test/java/org/apidesign/vm4brwsr/Classes.java
     1.1 --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java	Mon Feb 04 23:25:32 2013 +0100
     1.2 +++ b/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java	Tue Feb 05 00:00:22 2013 +0100
     1.3 @@ -41,6 +41,15 @@
     1.4          + "function f(val, prop, clazz) {\n"
     1.5          + "  return function() {\n"
     1.6          + "    if (clazz == null) return val[prop];\n"
     1.7 +        + "    if (clazz.isArray__Z()) {\n"
     1.8 +        + "      var valarr = val[prop];\n"
     1.9 +        + "      var cmp = clazz.getComponentType__Ljava_lang_Class_2();\n"
    1.10 +        + "      var retarr = vm.java_lang_reflect_Array(false).newInstance__Ljava_lang_Object_2Ljava_lang_Class_2I(cmp, valarr.length);\n"
    1.11 +        + "      for (var i = 0; i < valarr.length; i++) {\n"
    1.12 +        + "        retarr[i] = CLS.prototype.c__Ljava_lang_Object_2Ljava_lang_Class_2Ljava_lang_Object_2(cmp, valarr[i]);\n"
    1.13 +        + "      }\n"
    1.14 +        + "      return retarr;\n"
    1.15 +        + "    }\n"
    1.16          + "    return CLS.prototype.c__Ljava_lang_Object_2Ljava_lang_Class_2Ljava_lang_Object_2(clazz, val[prop]);\n"
    1.17          + "  };\n"
    1.18          + "}\n"
    1.19 @@ -109,7 +118,12 @@
    1.20          for (Method m : marr) {
    1.21              arr[pos++] = MethodImpl.toSignature(m);
    1.22              arr[pos++] = m.getName();
    1.23 -            arr[pos++] = m.getReturnType().isAnnotation() ? m.getReturnType() : null;
    1.24 +            final Class<?> rt = m.getReturnType();
    1.25 +            if (rt.isArray()) {
    1.26 +                arr[pos++] = rt.getComponentType().isAnnotation() ? rt : null;
    1.27 +            } else {
    1.28 +                arr[pos++] = rt.isAnnotation() ? rt : null;
    1.29 +            }
    1.30          }
    1.31          return arr;
    1.32      }
     2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Mon Feb 04 23:25:32 2013 +0100
     2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Tue Feb 05 00:00:22 2013 +0100
     2.3 @@ -105,6 +105,9 @@
     2.4      @Test public void jsInnerAnnotation() throws Exception {
     2.5          assertExec("Check inner annotation", Classes.class, "getInnerNamer__I", Double.valueOf(Classes.getInnerNamer()));
     2.6      }
     2.7 +    @Test public void jsInnerAnnotationFromArray() throws Exception {
     2.8 +        assertExec("Check inner annotation", Classes.class, "getInnerNamers__I", Double.valueOf(Classes.getInnerNamers()));
     2.9 +    }
    2.10      @Test public void javaInvokeMethod() throws Exception {
    2.11          assertEquals(Classes.reflectiveMethodCall(true, "name"), "java.io.IOException", "Calls the name() method via reflection");
    2.12      }
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Mon Feb 04 23:25:32 2013 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Tue Feb 05 00:00:22 2013 +0100
     3.3 @@ -153,6 +153,15 @@
     3.4          assert cm != null : "ClassesNamer is present";
     3.5          return cm.anno().value();
     3.6      }
     3.7 +    public static int getInnerNamers() {
     3.8 +        ClassesMarker cm = Classes.class.getAnnotation(ClassesMarker.class);
     3.9 +        assert cm != null : "ClassesNamer is present";
    3.10 +        int sum = 0;
    3.11 +        for (ClassesMarker.Anno anno : cm.subs()) {
    3.12 +            sum += anno.value();
    3.13 +        }
    3.14 +        return sum;
    3.15 +    }
    3.16      
    3.17      public static String intType() {
    3.18          return Integer.TYPE.getName();