1.1 --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java Mon Feb 04 23:06:43 2013 +0100
1.2 +++ b/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java Mon Feb 04 23:18:51 2013 +0100
1.3 @@ -38,25 +38,32 @@
1.4 }
1.5
1.6 @JavaScriptBody(args = { "a", "n", "arr", "values" }, body = ""
1.7 - + "function f(v, p) {\n"
1.8 + + "function f(v, p, c) {\n"
1.9 + " var val = v;\n"
1.10 + " var prop = p;\n"
1.11 + + " var clazz = c;\n"
1.12 + " return function() {\n"
1.13 - + " return val[prop];\n"
1.14 + + " if (clazz == null) return val[prop];\n"
1.15 + + " return CLS.prototype.c__Ljava_lang_Object_2Ljava_lang_Class_2Ljava_lang_Object_2(clazz, val[prop]);\n"
1.16 + " };\n"
1.17 + "}\n"
1.18 - + "for (var i = 0; i < arr.length; i += 2) {\n"
1.19 + + "for (var i = 0; i < arr.length; i += 3) {\n"
1.20 + " var m = arr[i];\n"
1.21 + " var p = arr[i + 1];\n"
1.22 - + " a[m] = new f(values, p);\n"
1.23 + + " var c = arr[i + 2];\n"
1.24 + + " a[m] = new f(values, p, c);\n"
1.25 + "}\n"
1.26 + "a['$instOf_' + n] = true;\n"
1.27 + "return a;"
1.28 )
1.29 private static native <T extends Annotation> T create(
1.30 - AnnotationImpl a, String n, String[] methodsAndProps, Object values
1.31 + AnnotationImpl a, String n, Object[] methodsAndProps, Object values
1.32 );
1.33
1.34 + private static Object c(Class<? extends Annotation> a, Object v) {
1.35 + return create(a, v);
1.36 + }
1.37 +
1.38 public static <T extends Annotation> T create(Class<T> annoClass, Object values) {
1.39 return create(new AnnotationImpl(annoClass),
1.40 annoClass.getName().replace('.', '_'),
1.41 @@ -98,13 +105,14 @@
1.42 @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];")
1.43 private static native Object findData(Object anno, String p);
1.44
1.45 - private static String[] findProps(Class<?> annoClass) {
1.46 + private static Object[] findProps(Class<?> annoClass) {
1.47 final Method[] marr = MethodImpl.findMethods(annoClass, Modifier.PUBLIC);
1.48 - String[] arr = new String[marr.length * 2];
1.49 + Object[] arr = new Object[marr.length * 3];
1.50 int pos = 0;
1.51 for (Method m : marr) {
1.52 arr[pos++] = MethodImpl.toSignature(m);
1.53 arr[pos++] = m.getName();
1.54 + arr[pos++] = m.getReturnType().isAnnotation() ? m.getReturnType() : null;
1.55 }
1.56 return arr;
1.57 }
2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Mon Feb 04 23:06:43 2013 +0100
2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Mon Feb 04 23:18:51 2013 +0100
2.3 @@ -102,6 +102,9 @@
2.4 @Test public void jsStringAnnotationFromArray() throws Exception {
2.5 assertExec("Check class annotation", Classes.class, "getNamer__Ljava_lang_String_2Z", "my text", false);
2.6 }
2.7 + @Test public void jsInnerAnnotation() throws Exception {
2.8 + assertExec("Check inner annotation", Classes.class, "getInnerNamer__I", Double.valueOf(Classes.getInnerNamer()));
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:06:43 2013 +0100
3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Mon Feb 04 23:18:51 2013 +0100
3.3 @@ -33,7 +33,7 @@
3.4 @ClassesMarker.Anno(Integer.SIZE),
3.5 @ClassesMarker.Anno(Integer.MIN_VALUE)
3.6 })
3.7 -@ClassesNamer(name = "my text", anno = @ClassesMarker.Anno(Integer.MAX_VALUE))
3.8 +@ClassesNamer(name = "my text", anno = @ClassesMarker.Anno(333))
3.9 public class Classes {
3.10 public static String nameOfIO() {
3.11 return nameFor(IOException.class);
3.12 @@ -145,6 +145,11 @@
3.13 }
3.14 return null;
3.15 }
3.16 + public static int getInnerNamer() {
3.17 + ClassesNamer cm = Classes.class.getAnnotation(ClassesNamer.class);
3.18 + assert cm != null : "ClassesNamer is present";
3.19 + return cm.anno().value();
3.20 + }
3.21
3.22 public static String intType() {
3.23 return Integer.TYPE.getName();