Generates reasonable JSON objects for inner annotations and inner annotation arrays reflection
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 04 Feb 2013 22:03:49 +0100
branchreflection
changeset 6597c0eb1a5d0b8
parent 658 578cea5b4359
child 660 66b5bd7d8174
Generates reasonable JSON objects for inner annotations and inner annotation arrays
javap/src/main/java/org/apidesign/javap/AnnotationParser.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/test/java/org/apidesign/vm4brwsr/Classes.java
vm/src/test/java/org/apidesign/vm4brwsr/ClassesMarker.java
vm/src/test/java/org/apidesign/vm4brwsr/ClassesNamer.java
     1.1 --- a/javap/src/main/java/org/apidesign/javap/AnnotationParser.java	Mon Feb 04 22:02:33 2013 +0100
     1.2 +++ b/javap/src/main/java/org/apidesign/javap/AnnotationParser.java	Mon Feb 04 22:03:49 2013 +0100
     1.3 @@ -42,10 +42,10 @@
     1.4          this.iterateArray = iterateArray;
     1.5      }
     1.6  
     1.7 -    protected void visitAnnotationStart(String type) throws IOException {
     1.8 +    protected void visitAnnotationStart(String type, boolean top) throws IOException {
     1.9      }
    1.10  
    1.11 -    protected void visitAnnotationEnd(String type) throws IOException {
    1.12 +    protected void visitAnnotationEnd(String type, boolean top) throws IOException {
    1.13      }
    1.14  
    1.15      protected void visitValueStart(String attrName, char type) throws IOException {
    1.16 @@ -85,20 +85,20 @@
    1.17      private void read(DataInputStream dis, ClassData cd) throws IOException {
    1.18      	int cnt = dis.readUnsignedShort();
    1.19          for (int i = 0; i < cnt; i++) {
    1.20 -            readAnno(dis, cd);
    1.21 +            readAnno(dis, cd, true);
    1.22          }
    1.23      }
    1.24  
    1.25 -    private void readAnno(DataInputStream dis, ClassData cd) throws IOException {
    1.26 +    private void readAnno(DataInputStream dis, ClassData cd, boolean top) throws IOException {
    1.27          int type = dis.readUnsignedShort();
    1.28          String typeName = cd.StringValue(type);
    1.29 -        visitAnnotationStart(typeName);
    1.30 +        visitAnnotationStart(typeName, top);
    1.31      	int cnt = dis.readUnsignedShort();
    1.32      	for (int i = 0; i < cnt; i++) {
    1.33              String attrName = cd.StringValue(dis.readUnsignedShort());
    1.34              readValue(dis, cd, typeName, attrName);
    1.35          }
    1.36 -        visitAnnotationEnd(typeName);
    1.37 +        visitAnnotationEnd(typeName, top);
    1.38          if (cnt == 0) {
    1.39              visitAttr(typeName, null, null, null);
    1.40          }
    1.41 @@ -110,7 +110,7 @@
    1.42          char type = (char)dis.readByte();
    1.43          visitValueStart(attrName, type);
    1.44          if (type == '@') {
    1.45 -            readAnno(dis, cd);
    1.46 +            readAnno(dis, cd, false);
    1.47          } else if ("CFJZsSIDB".indexOf(type) >= 0) { // NOI18N
    1.48              int primitive = dis.readUnsignedShort();
    1.49              String val = cd.stringValue(primitive, textual);
     2.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Feb 04 22:02:33 2013 +0100
     2.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Mon Feb 04 22:03:49 2013 +0100
     2.3 @@ -1705,16 +1705,22 @@
     2.4              int depth;
     2.5              
     2.6              @Override
     2.7 -            protected void visitAnnotationStart(String type) throws IOException {
     2.8 +            protected void visitAnnotationStart(String attrType, boolean top) throws IOException {
     2.9 +                final String slashType = attrType.substring(1, attrType.length() - 1);
    2.10 +                requireReference(slashType);
    2.11 +                
    2.12                  if (cnt[depth]++ > 0) {
    2.13                      out.append(",");
    2.14                  }
    2.15 -                out.append('"').append(type).append("\" : {\n");
    2.16 +                if (top) {
    2.17 +                    out.append('"').append(attrType).append("\" : ");
    2.18 +                }
    2.19 +                out.append("{\n");
    2.20                  cnt[++depth] = 0;
    2.21              }
    2.22  
    2.23              @Override
    2.24 -            protected void visitAnnotationEnd(String type) throws IOException {
    2.25 +            protected void visitAnnotationEnd(String type, boolean top) throws IOException {
    2.26                  out.append("\n}\n");
    2.27                  depth--;
    2.28              }
     3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Mon Feb 04 22:02:33 2013 +0100
     3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Mon Feb 04 22:03:49 2013 +0100
     3.3 @@ -29,8 +29,11 @@
     3.4   *
     3.5   * @author Jaroslav Tulach <jtulach@netbeans.org>
     3.6   */
     3.7 -@ClassesMarker(number = 10, nicknames = { "Ten", "Deset" }, count = ClassesMarker.E.TWO)
     3.8 -@ClassesNamer(name = "my text")
     3.9 +@ClassesMarker(number = 10, nicknames = { "Ten", "Deset" }, count = ClassesMarker.E.TWO, subs = {
    3.10 +    @ClassesMarker.Anno(Integer.SIZE),
    3.11 +    @ClassesMarker.Anno(Integer.MIN_VALUE)
    3.12 +})
    3.13 +@ClassesNamer(name = "my text", anno = @ClassesMarker.Anno(Integer.MAX_VALUE))
    3.14  public class Classes {
    3.15      public static String nameOfIO() {
    3.16          return nameFor(IOException.class);
     4.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassesMarker.java	Mon Feb 04 22:02:33 2013 +0100
     4.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassesMarker.java	Mon Feb 04 22:03:49 2013 +0100
     4.3 @@ -33,4 +33,10 @@
     4.4      enum E {
     4.5          ONE, TWO;
     4.6      }
     4.7 +    
     4.8 +    Anno[] subs() default {};
     4.9 +    
    4.10 +    public @interface Anno {
    4.11 +        int value();
    4.12 +    }
    4.13  }
     5.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassesNamer.java	Mon Feb 04 22:02:33 2013 +0100
     5.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassesNamer.java	Mon Feb 04 22:03:49 2013 +0100
     5.3 @@ -27,4 +27,5 @@
     5.4  @Retention(RetentionPolicy.RUNTIME)
     5.5  public @interface ClassesNamer {
     5.6      String name();
     5.7 +    ClassesMarker.Anno anno();
     5.8  }