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