emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java
branchreflection
changeset 662 7832188e26b8
parent 654 26a86cc00224
child 663 09225928b9fb
     1.1 --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java	Sun Feb 03 22:58:42 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      }