# HG changeset patch # User Jaroslav Tulach # Date 1458461143 -3600 # Node ID d729cfa77fa77e7885626b43ffa4318f4d3bd26e # Parent cf6d5d3576962478f8fd39dd708e230244ba980e Make sure getAnnotations on Class and Method returns some values diff -r cf6d5d357696 -r d729cfa77fa7 rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionAnnotationTest.java --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionAnnotationTest.java Sun Mar 20 08:12:55 2016 +0100 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionAnnotationTest.java Sun Mar 20 09:05:43 2016 +0100 @@ -17,6 +17,7 @@ */ package org.apidesign.bck2brwsr.tck; +import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import org.apidesign.bck2brwsr.vmtest.Compare; @@ -49,6 +50,10 @@ @Ann @AnnAnn class D { + @Ann + @AnnAnn + public void method() { + } } @Ann(type = String.class) @@ -109,6 +114,58 @@ // return ann.string(); // } + private static String toClassNames(Object[] arr) { + StringBuilder sb = new StringBuilder(); + sb.append("\n"); + for (Object o : arr) { + if (o == null) { + sb.append("null"); + } else if (o instanceof Ann) { + sb.append("Ann"); + } else if (o instanceof AnnAnn) { + sb.append("AnnAnn"); + } + sb.append("\n"); + } + return sb.toString(); + } + + @Compare + public String twoAnnotations() { + Annotation[] arr = D.class.getAnnotations(); + if (arr == null) { + return "Null array"; + } + return toClassNames(arr); + } + + @Compare + public String twoDeclaredAnnotations() { + Annotation[] arr = D.class.getDeclaredAnnotations(); + if (arr == null) { + return "Null array"; + } + return toClassNames(arr); + } + + @Compare + public String twoAnnotationsOnMethod() throws Exception { + Annotation[] arr = D.class.getMethod("method").getAnnotations(); + if (arr == null) { + return "Null array"; + } + return toClassNames(arr); + } + + @Compare + public String twoDeclaredAnnotationsOnMethod() throws Exception { + Annotation[] arr = D.class.getMethod("method").getAnnotations(); + if (arr == null) { + return "Null array"; + } + return toClassNames(arr); + } + @Factory public static Object[] create() { return VMTest.create(ReflectionAnnotationTest.class); diff -r cf6d5d357696 -r d729cfa77fa7 rt/emul/mini/src/main/java/java/lang/Class.java --- a/rt/emul/mini/src/main/java/java/lang/Class.java Sun Mar 20 08:12:55 2016 +0100 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java Sun Mar 20 09:05:43 2016 +0100 @@ -1788,7 +1788,7 @@ * @since 1.5 */ public Annotation[] getDeclaredAnnotations() { - throw new UnsupportedOperationException(); + return getAnnotations(); } @JavaScriptBody(args = "type", body = "" diff -r cf6d5d357696 -r d729cfa77fa7 rt/emul/mini/src/main/java/java/lang/reflect/Method.java --- a/rt/emul/mini/src/main/java/java/lang/reflect/Method.java Sun Mar 20 08:12:55 2016 +0100 +++ b/rt/emul/mini/src/main/java/java/lang/reflect/Method.java Sun Mar 20 09:05:43 2016 +0100 @@ -672,9 +672,20 @@ + " return a['L' + ac.jvmName + ';'];" + "} else return null;" ) - private Object getAnnotationData(Class annotationClass) { - throw new UnsupportedOperationException(); - } + private native Object getAnnotationData(Class annotationClass); + + @JavaScriptBody(args = {}, + body = + "var a = this._data().anno;\n" + + "if (a) {\n" + + " var arr = [];\n" + + " for (p in a) {\n" + + " arr.push(p);\n" + + " }\n" + + " return arr;\n" + + "} else return [];\n" + ) + private native String[] getAnnotationNames(); /** * @throws NullPointerException {@inheritDoc} @@ -689,7 +700,19 @@ * @since 1.5 */ public Annotation[] getDeclaredAnnotations() { - throw new UnsupportedOperationException(); + String[] arr = getAnnotationNames(); + Annotation[] res = new Annotation[arr.length]; + for (int i = 0; i < arr.length; i++) { + String forName = arr[i].substring(1, arr[i].length() - 1).replace('/', '.'); + final Class annoType; + try { + annoType = Class.forName(forName).asSubclass(Annotation.class); + } catch (ClassNotFoundException ex) { + throw new IllegalStateException(forName); + } + res[i] = getAnnotation(annoType); + } + return res; } /**