# HG changeset patch # User Jaroslav Tulach # Date 1360016331 -3600 # Node ID 7832188e26b86de1db543b6b70839c035f9f36d1 # Parent 66e080030577813488ff94576ce67e7e74d3b2e6 Can obtain values of inner annotation types diff -r 66e080030577 -r 7832188e26b8 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:06:43 2013 +0100 +++ b/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java Mon Feb 04 23:18:51 2013 +0100 @@ -38,25 +38,32 @@ } @JavaScriptBody(args = { "a", "n", "arr", "values" }, body = "" - + "function f(v, p) {\n" + + "function f(v, p, c) {\n" + " var val = v;\n" + " var prop = p;\n" + + " var clazz = c;\n" + " return function() {\n" - + " return val[prop];\n" + + " if (clazz == null) return val[prop];\n" + + " return CLS.prototype.c__Ljava_lang_Object_2Ljava_lang_Class_2Ljava_lang_Object_2(clazz, val[prop]);\n" + " };\n" + "}\n" - + "for (var i = 0; i < arr.length; i += 2) {\n" + + "for (var i = 0; i < arr.length; i += 3) {\n" + " var m = arr[i];\n" + " var p = arr[i + 1];\n" - + " a[m] = new f(values, p);\n" + + " var c = arr[i + 2];\n" + + " a[m] = new f(values, p, c);\n" + "}\n" + "a['$instOf_' + n] = true;\n" + "return a;" ) private static native T create( - AnnotationImpl a, String n, String[] methodsAndProps, Object values + AnnotationImpl a, String n, Object[] methodsAndProps, Object values ); + private static Object c(Class a, Object v) { + return create(a, v); + } + public static T create(Class annoClass, Object values) { return create(new AnnotationImpl(annoClass), annoClass.getName().replace('.', '_'), @@ -98,13 +105,14 @@ @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];") private static native Object findData(Object anno, String p); - private static String[] findProps(Class annoClass) { + private static Object[] findProps(Class annoClass) { final Method[] marr = MethodImpl.findMethods(annoClass, Modifier.PUBLIC); - String[] arr = new String[marr.length * 2]; + Object[] arr = new Object[marr.length * 3]; int pos = 0; for (Method m : marr) { arr[pos++] = MethodImpl.toSignature(m); arr[pos++] = m.getName(); + arr[pos++] = m.getReturnType().isAnnotation() ? m.getReturnType() : null; } return arr; } diff -r 66e080030577 -r 7832188e26b8 vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Mon Feb 04 23:06:43 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Mon Feb 04 23:18:51 2013 +0100 @@ -102,6 +102,9 @@ @Test public void jsStringAnnotationFromArray() throws Exception { assertExec("Check class annotation", Classes.class, "getNamer__Ljava_lang_String_2Z", "my text", false); } + @Test public void jsInnerAnnotation() throws Exception { + assertExec("Check inner annotation", Classes.class, "getInnerNamer__I", Double.valueOf(Classes.getInnerNamer())); + } @Test public void javaInvokeMethod() throws Exception { assertEquals(Classes.reflectiveMethodCall(true, "name"), "java.io.IOException", "Calls the name() method via reflection"); } diff -r 66e080030577 -r 7832188e26b8 vm/src/test/java/org/apidesign/vm4brwsr/Classes.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Mon Feb 04 23:06:43 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Mon Feb 04 23:18:51 2013 +0100 @@ -33,7 +33,7 @@ @ClassesMarker.Anno(Integer.SIZE), @ClassesMarker.Anno(Integer.MIN_VALUE) }) -@ClassesNamer(name = "my text", anno = @ClassesMarker.Anno(Integer.MAX_VALUE)) +@ClassesNamer(name = "my text", anno = @ClassesMarker.Anno(333)) public class Classes { public static String nameOfIO() { return nameFor(IOException.class); @@ -145,6 +145,11 @@ } return null; } + public static int getInnerNamer() { + ClassesNamer cm = Classes.class.getAnnotation(ClassesNamer.class); + assert cm != null : "ClassesNamer is present"; + return cm.anno().value(); + } public static String intType() { return Integer.TYPE.getName();