emul/src/main/java/java/lang/AnnotationImpl.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 04 Dec 2012 12:57:05 +0100
branchreflection
changeset 254 d0013f44e9b1
parent 253 962a24ecd8f8
permissions -rw-r--r--
Only enumerate through own properties of annotation value
     1 /*
     2  * To change this template, choose Tools | Templates
     3  * and open the template in the editor.
     4  */
     5 package java.lang;
     6 
     7 import java.lang.annotation.Annotation;
     8 import org.apidesign.bck2brwsr.core.JavaScriptBody;
     9 
    10 /**
    11  *
    12  * @author Jaroslav Tulach <jtulach@netbeans.org>
    13  */
    14 final class AnnotationImpl implements Annotation {
    15     public Class<? extends Annotation> annotationType() {
    16         return getClass();
    17     }
    18 
    19     @JavaScriptBody(args = { "a", "n", "values" }, body = ""
    20         + "function f(v, p) {\n"
    21         + "  var val = v;\n"
    22         + "  var prop = p;\n"
    23         + "  return function() {\n"
    24         + "    return val[prop];\n"
    25         + "  };\n"
    26         + "}\n"
    27         + "var props = Object.getOwnPropertyNames(values);\n"
    28         + "for (var i = 0; i < props.length; i++) {\n"
    29         + "  var p = props[i];\n"
    30         + "  a[p] = new f(values, p);\n"
    31         + "}\n"
    32         + "a['$instOf_' + n] = true;\n"
    33         + "return a;"
    34     )
    35     private static <T extends Annotation> T create(AnnotationImpl a, String n, Object values) {
    36         return null;
    37     }
    38     static <T extends Annotation> T create(Class<T> annoClass, Object values) {
    39         return create(new AnnotationImpl(), annoClass.getName().replace('.', '_'), values);
    40     }
    41 
    42     static Annotation[] create(Object anno) {
    43         String[] names = findNames(anno);
    44         Annotation[] ret = new Annotation[names.length];
    45         for (int i = 0; i < names.length; i++) {
    46             String n = names[i].substring(1, names[i].length() - 1).replace('/', '_');
    47             ret[i] = create(new AnnotationImpl(), n, findData(anno, names[i]));
    48         }
    49         return ret;
    50     }
    51     @JavaScriptBody(args = "anno", body =
    52           "var arr = new Array();"
    53         + "var props = Object.getOwnPropertyNames(anno);\n"
    54         + "for (var i = 0; i < props.length; i++) {\n"
    55         + "  var p = props[i];\n"
    56         + "  arr.push(p);"
    57         + "}"
    58         + "return arr;"
    59     )
    60     private static String[] findNames(Object anno) {
    61         throw new UnsupportedOperationException();
    62     }
    63 
    64     @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];")
    65     private static Object findData(Object anno, String p) {
    66         throw new UnsupportedOperationException();
    67     }
    68 }