jaroslav@235: /* jaroslav@235: * To change this template, choose Tools | Templates jaroslav@235: * and open the template in the editor. jaroslav@235: */ jaroslav@266: package org.apidesign.bck2brwsr.emul; jaroslav@235: jaroslav@235: import java.lang.annotation.Annotation; jaroslav@235: import org.apidesign.bck2brwsr.core.JavaScriptBody; jaroslav@235: jaroslav@235: /** jaroslav@235: * jaroslav@235: * @author Jaroslav Tulach jaroslav@235: */ jaroslav@266: public final class AnnotationImpl implements Annotation { jaroslav@235: public Class annotationType() { jaroslav@235: return getClass(); jaroslav@235: } jaroslav@235: jaroslav@253: @JavaScriptBody(args = { "a", "n", "values" }, body = "" jaroslav@253: + "function f(v, p) {\n" jaroslav@253: + " var val = v;\n" jaroslav@253: + " var prop = p;\n" jaroslav@253: + " return function() {\n" jaroslav@253: + " return val[prop];\n" jaroslav@253: + " };\n" jaroslav@253: + "}\n" jaroslav@253: + "var props = Object.getOwnPropertyNames(values);\n" jaroslav@253: + "for (var i = 0; i < props.length; i++) {\n" jaroslav@253: + " var p = props[i];\n" jaroslav@253: + " a[p] = new f(values, p);\n" jaroslav@253: + "}\n" jaroslav@253: + "a['$instOf_' + n] = true;\n" jaroslav@235: + "return a;" jaroslav@235: ) jaroslav@235: private static T create(AnnotationImpl a, String n, Object values) { jaroslav@235: return null; jaroslav@235: } jaroslav@266: public static T create(Class annoClass, Object values) { jaroslav@235: return create(new AnnotationImpl(), annoClass.getName().replace('.', '_'), values); jaroslav@235: } jaroslav@238: jaroslav@266: public static Annotation[] create(Object anno) { jaroslav@238: String[] names = findNames(anno); jaroslav@238: Annotation[] ret = new Annotation[names.length]; jaroslav@238: for (int i = 0; i < names.length; i++) { jaroslav@238: String n = names[i].substring(1, names[i].length() - 1).replace('/', '_'); jaroslav@238: ret[i] = create(new AnnotationImpl(), n, findData(anno, names[i])); jaroslav@238: } jaroslav@238: return ret; jaroslav@238: } jaroslav@238: @JavaScriptBody(args = "anno", body = jaroslav@238: "var arr = new Array();" jaroslav@254: + "var props = Object.getOwnPropertyNames(anno);\n" jaroslav@254: + "for (var i = 0; i < props.length; i++) {\n" jaroslav@254: + " var p = props[i];\n" jaroslav@238: + " arr.push(p);" jaroslav@238: + "}" jaroslav@238: + "return arr;" jaroslav@238: ) jaroslav@238: private static String[] findNames(Object anno) { jaroslav@238: throw new UnsupportedOperationException(); jaroslav@238: } jaroslav@238: jaroslav@238: @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];") jaroslav@238: private static Object findData(Object anno, String p) { jaroslav@238: throw new UnsupportedOperationException(); jaroslav@238: } jaroslav@235: }