1.1 --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java Wed Jan 23 20:52:11 2013 +0100
1.2 +++ b/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java Sun Feb 03 18:58:09 2013 +0100
1.3 @@ -18,6 +18,8 @@
1.4 package org.apidesign.bck2brwsr.emul.reflect;
1.5
1.6 import java.lang.annotation.Annotation;
1.7 +import java.lang.reflect.Method;
1.8 +import java.lang.reflect.Modifier;
1.9 import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.10
1.11 /**
1.12 @@ -29,7 +31,7 @@
1.13 return getClass();
1.14 }
1.15
1.16 - @JavaScriptBody(args = { "a", "n", "values" }, body = ""
1.17 + @JavaScriptBody(args = { "a", "n", "arr", "values" }, body = ""
1.18 + "function f(v, p) {\n"
1.19 + " var val = v;\n"
1.20 + " var prop = p;\n"
1.21 @@ -37,27 +39,42 @@
1.22 + " return val[prop];\n"
1.23 + " };\n"
1.24 + "}\n"
1.25 - + "var props = Object.getOwnPropertyNames(values);\n"
1.26 - + "for (var i = 0; i < props.length; i++) {\n"
1.27 - + " var p = props[i];\n"
1.28 - + " a[p] = new f(values, p);\n"
1.29 + + "for (var i = 0; i < arr.length; i += 2) {\n"
1.30 + + " var m = arr[i];\n"
1.31 + + " var p = arr[i + 1];\n"
1.32 + + " a[m] = new f(values, p);\n"
1.33 + "}\n"
1.34 + "a['$instOf_' + n] = true;\n"
1.35 + "return a;"
1.36 )
1.37 - private static <T extends Annotation> T create(AnnotationImpl a, String n, Object values) {
1.38 - return null;
1.39 - }
1.40 + private static native <T extends Annotation> T create(
1.41 + AnnotationImpl a, String n, String[] methodsAndProps, Object values
1.42 + );
1.43 +
1.44 public static <T extends Annotation> T create(Class<T> annoClass, Object values) {
1.45 - return create(new AnnotationImpl(), annoClass.getName().replace('.', '_'), values);
1.46 + return create(new AnnotationImpl(),
1.47 + annoClass.getName().replace('.', '_'),
1.48 + findProps(annoClass), values
1.49 + );
1.50 }
1.51
1.52 public static Annotation[] create(Object anno) {
1.53 String[] names = findNames(anno);
1.54 Annotation[] ret = new Annotation[names.length];
1.55 for (int i = 0; i < names.length; i++) {
1.56 - String n = names[i].substring(1, names[i].length() - 1).replace('/', '_');
1.57 - ret[i] = create(new AnnotationImpl(), n, findData(anno, names[i]));
1.58 + String annoNameSlash = names[i].substring(1, names[i].length() - 1);
1.59 + Class<?> annoClass;
1.60 + try {
1.61 + annoClass = Class.forName(annoNameSlash.replace('/', '.'));
1.62 + } catch (ClassNotFoundException ex) {
1.63 + throw new IllegalStateException("Can't find annotation class " + annoNameSlash);
1.64 + }
1.65 + ret[i] = create(
1.66 + new AnnotationImpl(),
1.67 + annoNameSlash.replace('/', '_'),
1.68 + findProps(annoClass),
1.69 + findData(anno, names[i])
1.70 + );
1.71 }
1.72 return ret;
1.73 }
1.74 @@ -70,12 +87,19 @@
1.75 + "}"
1.76 + "return arr;"
1.77 )
1.78 - private static String[] findNames(Object anno) {
1.79 - throw new UnsupportedOperationException();
1.80 - }
1.81 + private static native String[] findNames(Object anno);
1.82
1.83 @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];")
1.84 - private static Object findData(Object anno, String p) {
1.85 - throw new UnsupportedOperationException();
1.86 + private static native Object findData(Object anno, String p);
1.87 +
1.88 + private static String[] findProps(Class<?> annoClass) {
1.89 + final Method[] marr = MethodImpl.findMethods(annoClass, Modifier.PUBLIC);
1.90 + String[] arr = new String[marr.length * 2];
1.91 + int pos = 0;
1.92 + for (Method m : marr) {
1.93 + arr[pos++] = MethodImpl.toSignature(m);
1.94 + arr[pos++] = m.getName();
1.95 + }
1.96 + return arr;
1.97 }
1.98 }