# HG changeset patch # User Jaroslav Tulach # Date 1360011829 -3600 # Node ID 7c0eb1a5d0b8ae21704bffe18e2736176cc09c25 # Parent 578cea5b4359bb8c9f17b8e9f5644678b15a403d Generates reasonable JSON objects for inner annotations and inner annotation arrays diff -r 578cea5b4359 -r 7c0eb1a5d0b8 javap/src/main/java/org/apidesign/javap/AnnotationParser.java --- a/javap/src/main/java/org/apidesign/javap/AnnotationParser.java Mon Feb 04 22:02:33 2013 +0100 +++ b/javap/src/main/java/org/apidesign/javap/AnnotationParser.java Mon Feb 04 22:03:49 2013 +0100 @@ -42,10 +42,10 @@ this.iterateArray = iterateArray; } - protected void visitAnnotationStart(String type) throws IOException { + protected void visitAnnotationStart(String type, boolean top) throws IOException { } - protected void visitAnnotationEnd(String type) throws IOException { + protected void visitAnnotationEnd(String type, boolean top) throws IOException { } protected void visitValueStart(String attrName, char type) throws IOException { @@ -85,20 +85,20 @@ private void read(DataInputStream dis, ClassData cd) throws IOException { int cnt = dis.readUnsignedShort(); for (int i = 0; i < cnt; i++) { - readAnno(dis, cd); + readAnno(dis, cd, true); } } - private void readAnno(DataInputStream dis, ClassData cd) throws IOException { + private void readAnno(DataInputStream dis, ClassData cd, boolean top) throws IOException { int type = dis.readUnsignedShort(); String typeName = cd.StringValue(type); - visitAnnotationStart(typeName); + visitAnnotationStart(typeName, top); int cnt = dis.readUnsignedShort(); for (int i = 0; i < cnt; i++) { String attrName = cd.StringValue(dis.readUnsignedShort()); readValue(dis, cd, typeName, attrName); } - visitAnnotationEnd(typeName); + visitAnnotationEnd(typeName, top); if (cnt == 0) { visitAttr(typeName, null, null, null); } @@ -110,7 +110,7 @@ char type = (char)dis.readByte(); visitValueStart(attrName, type); if (type == '@') { - readAnno(dis, cd); + readAnno(dis, cd, false); } else if ("CFJZsSIDB".indexOf(type) >= 0) { // NOI18N int primitive = dis.readUnsignedShort(); String val = cd.stringValue(primitive, textual); diff -r 578cea5b4359 -r 7c0eb1a5d0b8 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Feb 04 22:02:33 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Feb 04 22:03:49 2013 +0100 @@ -1705,16 +1705,22 @@ int depth; @Override - protected void visitAnnotationStart(String type) throws IOException { + protected void visitAnnotationStart(String attrType, boolean top) throws IOException { + final String slashType = attrType.substring(1, attrType.length() - 1); + requireReference(slashType); + if (cnt[depth]++ > 0) { out.append(","); } - out.append('"').append(type).append("\" : {\n"); + if (top) { + out.append('"').append(attrType).append("\" : "); + } + out.append("{\n"); cnt[++depth] = 0; } @Override - protected void visitAnnotationEnd(String type) throws IOException { + protected void visitAnnotationEnd(String type, boolean top) throws IOException { out.append("\n}\n"); depth--; } diff -r 578cea5b4359 -r 7c0eb1a5d0b8 vm/src/test/java/org/apidesign/vm4brwsr/Classes.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Mon Feb 04 22:02:33 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java Mon Feb 04 22:03:49 2013 +0100 @@ -29,8 +29,11 @@ * * @author Jaroslav Tulach */ -@ClassesMarker(number = 10, nicknames = { "Ten", "Deset" }, count = ClassesMarker.E.TWO) -@ClassesNamer(name = "my text") +@ClassesMarker(number = 10, nicknames = { "Ten", "Deset" }, count = ClassesMarker.E.TWO, subs = { + @ClassesMarker.Anno(Integer.SIZE), + @ClassesMarker.Anno(Integer.MIN_VALUE) +}) +@ClassesNamer(name = "my text", anno = @ClassesMarker.Anno(Integer.MAX_VALUE)) public class Classes { public static String nameOfIO() { return nameFor(IOException.class); diff -r 578cea5b4359 -r 7c0eb1a5d0b8 vm/src/test/java/org/apidesign/vm4brwsr/ClassesMarker.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassesMarker.java Mon Feb 04 22:02:33 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassesMarker.java Mon Feb 04 22:03:49 2013 +0100 @@ -33,4 +33,10 @@ enum E { ONE, TWO; } + + Anno[] subs() default {}; + + public @interface Anno { + int value(); + } } diff -r 578cea5b4359 -r 7c0eb1a5d0b8 vm/src/test/java/org/apidesign/vm4brwsr/ClassesNamer.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassesNamer.java Mon Feb 04 22:02:33 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassesNamer.java Mon Feb 04 22:03:49 2013 +0100 @@ -27,4 +27,5 @@ @Retention(RetentionPolicy.RUNTIME) public @interface ClassesNamer { String name(); + ClassesMarker.Anno anno(); }