# HG changeset patch # User Jaroslav Tulach # Date 1359929927 -3600 # Node ID 044c727324242046a3f3e1b8561c6c29c9394a0c # Parent 26a86cc002242a21de1ad66a7067c580d8bcb553 Requiring reference to enums as soon as they are used in annotations diff -r 26a86cc00224 -r 044c72732424 javap/src/main/java/org/apidesign/javap/AnnotationParser.java --- a/javap/src/main/java/org/apidesign/javap/AnnotationParser.java Sun Feb 03 22:58:42 2013 +0100 +++ b/javap/src/main/java/org/apidesign/javap/AnnotationParser.java Sun Feb 03 23:18:47 2013 +0100 @@ -60,6 +60,12 @@ ) throws IOException { } + protected void visitEnumAttr( + String annoType, String attr, String attrType, String value + ) throws IOException { + visitAttr(annoType, attr, attrType, value); + } + /** Initialize the parsing with constant pool from cd. * * @param attr the attribute defining annotations @@ -130,10 +136,7 @@ String attrType = cd.stringValue(enumT, textual); int enumN = dis.readUnsignedShort(); String val = cd.stringValue(enumN, textual); - if (textual) { - val = "vm." + attrType.substring(1, attrType.length() - 1).replace('/', '_') + "(false).constructor." + val; - } - visitAttr(typeName, attrName, attrType, val); + visitEnumAttr(typeName, attrName, attrType, val); } else { throw new IOException("Unknown type " + type); } diff -r 26a86cc00224 -r 044c72732424 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Feb 03 22:58:42 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Feb 03 23:18:47 2013 +0100 @@ -1699,7 +1699,7 @@ return " = null;"; } - private static void generateAnno(ClassData cd, final Appendable out, byte[] data) throws IOException { + private void generateAnno(ClassData cd, final Appendable out, byte[] data) throws IOException { AnnotationParser ap = new AnnotationParser(true, false) { int[] cnt = new int[32]; int depth; @@ -1749,6 +1749,16 @@ } out.append(value); } + + @Override + protected void visitEnumAttr(String type, String attr, String attrType, String value) + throws IOException { + final String slashType = attrType.substring(1, attrType.length() - 1); + requireReference(slashType); + + out.append(accessClass(slashType.replace('/', '_'))) + .append("(false).constructor.").append(value); + } }; ap.parse(data, cd); } diff -r 26a86cc00224 -r 044c72732424 vm/src/test/java/org/apidesign/vm4brwsr/Classes.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Sun Feb 03 22:58:42 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Sun Feb 03 23:18:47 2013 +0100 @@ -19,7 +19,6 @@ import java.io.IOException; import java.lang.annotation.Annotation; -import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; @@ -42,9 +41,6 @@ } private static final Class PRELOAD = Runnable.class; - private static final Class PRELOAD2 = ClassesMarker.E.class; - private static final Class PRELOAD3 = RetentionPolicy.class; - private static final Class PRELOAD4 = ElementType.class; public static boolean isInterface(String s) throws ClassNotFoundException { return Class.forName(s).isInterface(); diff -r 26a86cc00224 -r 044c72732424 vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java --- a/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Sun Feb 03 22:58:42 2013 +0100 +++ b/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Sun Feb 03 23:18:47 2013 +0100 @@ -17,6 +17,8 @@ */ package org.apidesign.bck2brwsr.tck; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collections; @@ -67,6 +69,19 @@ } return sb.toString(); } + + @Compare public String namesOfDeclaringClassesOfMethods() { + StringBuilder sb = new StringBuilder(); + String[] arr = new String[20]; + int i = 0; + for (Method m : StaticUse.class.getMethods()) { + arr[i++] = m.getName() + "@" + m.getDeclaringClass().getName(); + } + for (String s : sort(arr, i)) { + sb.append(s).append("\n"); + } + return sb.toString(); + } @Compare public String cannotCallNonStaticMethodWithNull() throws Exception { StaticUse.class.getMethod("instanceMethod").invoke(null); @@ -77,6 +92,17 @@ return StaticUse.class.getMethod("instanceMethod").getReturnType(); } + @Retention(RetentionPolicy.RUNTIME) + @interface Ann { + } + + @Compare public String annoClass() throws Exception { + Retention r = Ann.class.getAnnotation(Retention.class); + assert r != null : "Annotation is present"; + assert r.value() == RetentionPolicy.RUNTIME : "Policy value is OK: " + r.value(); + return r.annotationType().getName(); + } + enum E { A, B }; @Compare public boolean isEnum() { return E.A.getClass().isEnum();