# HG changeset patch # User Jaroslav Tulach # Date 1360018822 -3600 # Node ID 799a8cfefe35cef9617dbae745215964a083a6c9 # Parent cad4ac1d51fb0064e2a99eb6245c3cd2ee5d4460 Returning proper runtime representation for inner annotation arrays diff -r cad4ac1d51fb -r 799a8cfefe35 emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java Mon Feb 04 23:25:32 2013 +0100 +++ b/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java Tue Feb 05 00:00:22 2013 +0100 @@ -41,6 +41,15 @@ + "function f(val, prop, clazz) {\n" + " return function() {\n" + " if (clazz == null) return val[prop];\n" + + " if (clazz.isArray__Z()) {\n" + + " var valarr = val[prop];\n" + + " var cmp = clazz.getComponentType__Ljava_lang_Class_2();\n" + + " var retarr = vm.java_lang_reflect_Array(false).newInstance__Ljava_lang_Object_2Ljava_lang_Class_2I(cmp, valarr.length);\n" + + " for (var i = 0; i < valarr.length; i++) {\n" + + " retarr[i] = CLS.prototype.c__Ljava_lang_Object_2Ljava_lang_Class_2Ljava_lang_Object_2(cmp, valarr[i]);\n" + + " }\n" + + " return retarr;\n" + + " }\n" + " return CLS.prototype.c__Ljava_lang_Object_2Ljava_lang_Class_2Ljava_lang_Object_2(clazz, val[prop]);\n" + " };\n" + "}\n" @@ -109,7 +118,12 @@ for (Method m : marr) { arr[pos++] = MethodImpl.toSignature(m); arr[pos++] = m.getName(); - arr[pos++] = m.getReturnType().isAnnotation() ? m.getReturnType() : null; + final Class rt = m.getReturnType(); + if (rt.isArray()) { + arr[pos++] = rt.getComponentType().isAnnotation() ? rt : null; + } else { + arr[pos++] = rt.isAnnotation() ? rt : null; + } } return arr; } diff -r cad4ac1d51fb -r 799a8cfefe35 vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Mon Feb 04 23:25:32 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Tue Feb 05 00:00:22 2013 +0100 @@ -105,6 +105,9 @@ @Test public void jsInnerAnnotation() throws Exception { assertExec("Check inner annotation", Classes.class, "getInnerNamer__I", Double.valueOf(Classes.getInnerNamer())); } + @Test public void jsInnerAnnotationFromArray() throws Exception { + assertExec("Check inner annotation", Classes.class, "getInnerNamers__I", Double.valueOf(Classes.getInnerNamers())); + } @Test public void javaInvokeMethod() throws Exception { assertEquals(Classes.reflectiveMethodCall(true, "name"), "java.io.IOException", "Calls the name() method via reflection"); } diff -r cad4ac1d51fb -r 799a8cfefe35 vm/src/test/java/org/apidesign/vm4brwsr/Classes.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Mon Feb 04 23:25:32 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Tue Feb 05 00:00:22 2013 +0100 @@ -153,6 +153,15 @@ assert cm != null : "ClassesNamer is present"; return cm.anno().value(); } + public static int getInnerNamers() { + ClassesMarker cm = Classes.class.getAnnotation(ClassesMarker.class); + assert cm != null : "ClassesNamer is present"; + int sum = 0; + for (ClassesMarker.Anno anno : cm.subs()) { + sum += anno.value(); + } + return sum; + } public static String intType() { return Integer.TYPE.getName();