# HG changeset patch # User Jaroslav Tulach # Date 1354457136 -3600 # Node ID 5ab1f0890a42d7b5d73adde545d5cadd9b99e2d1 # Parent 84ffc347412d5e4e3061b56a422c19b532c17588 Class.getAnnotations somehow implemented diff -r 84ffc347412d -r 5ab1f0890a42 emul/src/main/java/java/lang/AnnotationImpl.java --- a/emul/src/main/java/java/lang/AnnotationImpl.java Sun Dec 02 14:01:17 2012 +0100 +++ b/emul/src/main/java/java/lang/AnnotationImpl.java Sun Dec 02 15:05:36 2012 +0100 @@ -30,4 +30,29 @@ static T create(Class annoClass, Object values) { return create(new AnnotationImpl(), annoClass.getName().replace('.', '_'), values); } + + static Annotation[] create(Object anno) { + String[] names = findNames(anno); + Annotation[] ret = new Annotation[names.length]; + for (int i = 0; i < names.length; i++) { + String n = names[i].substring(1, names[i].length() - 1).replace('/', '_'); + ret[i] = create(new AnnotationImpl(), n, findData(anno, names[i])); + } + return ret; + } + @JavaScriptBody(args = "anno", body = + "var arr = new Array();" + + "for (p in anno) {" + + " arr.push(p);" + + "}" + + "return arr;" + ) + private static String[] findNames(Object anno) { + throw new UnsupportedOperationException(); + } + + @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];") + private static Object findData(Object anno, String p) { + throw new UnsupportedOperationException(); + } } diff -r 84ffc347412d -r 5ab1f0890a42 emul/src/main/java/java/lang/Class.java --- a/emul/src/main/java/java/lang/Class.java Sun Dec 02 14:01:17 2012 +0100 +++ b/emul/src/main/java/java/lang/Class.java Sun Dec 02 15:05:36 2012 +0100 @@ -804,12 +804,17 @@ return getAnnotation(annotationClass) != null; } + @JavaScriptBody(args = "self", body = "return self.anno;") + private Object getAnnotationData() { + throw new UnsupportedOperationException(); + } /** * @since 1.5 */ public Annotation[] getAnnotations() { - throw new UnsupportedOperationException(); + Object data = getAnnotationData(); + return data == null ? new Annotation[0] : AnnotationImpl.create(data); } /** diff -r 84ffc347412d -r 5ab1f0890a42 vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Sun Dec 02 14:01:17 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java Sun Dec 02 15:05:36 2012 +0100 @@ -80,6 +80,9 @@ @Test public void jsStringAnnotation() throws Exception { assertExec("Check class annotation", Classes.class, "getNamerLjava_lang_StringZ", "my text", true); } + @Test public void jsStringAnnotationFromArray() throws Exception { + assertExec("Check class annotation", Classes.class, "getNamerLjava_lang_StringZ", "my text", false); + } private static CharSequence codeSeq; private static Invocable code;