You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by th...@apache.org on 2018/11/29 00:34:09 UTC

[22/46] tapestry-5 git commit: TAP5-2588: upgrading from ASM 6 to 7 for Java 9+ support

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java
old mode 100644
new mode 100755
index c25ab8c..3cc051f
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AnnotationNode.java
@@ -1,291 +1,230 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
 package org.apache.tapestry5.internal.plastic.asm.tree;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor;
 import org.apache.tapestry5.internal.plastic.asm.Opcodes;
 
 /**
  * A node that represents an annotation.
- * 
+ *
  * @author Eric Bruneton
  */
 public class AnnotationNode extends AnnotationVisitor {
 
-    /**
-     * The class descriptor of the annotation class.
-     */
-    public String desc;
-
-    /**
-     * The name value pairs of this annotation. Each name value pair is stored
-     * as two consecutive elements in the list. The name is a {@link String},
-     * and the value may be a {@link Byte}, {@link Boolean}, {@link Character},
-     * {@link Short}, {@link Integer}, {@link Long}, {@link Float},
-     * {@link Double}, {@link String} or {@link org.objectweb.asm.Type}, or a
-     * two elements String array (for enumeration values), an
-     * {@link AnnotationNode}, or a {@link List} of values of one of the
-     * preceding types. The list may be <tt>null</tt> if there is no name value
-     * pair.
-     */
-    public List<Object> values;
-
-    /**
-     * Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the
-     * {@link #AnnotationNode(int, String)} version.
-     * 
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public AnnotationNode(final String desc) {
-        this(Opcodes.ASM6, desc);
-        if (getClass() != AnnotationNode.class) {
-            throw new IllegalStateException();
-        }
+  /** The class descriptor of the annotation class. */
+  public String desc;
+
+  /**
+   * The name value pairs of this annotation. Each name value pair is stored as two consecutive
+   * elements in the list. The name is a {@link String}, and the value may be a {@link Byte}, {@link
+   * Boolean}, {@link Character}, {@link Short}, {@link Integer}, {@link Long}, {@link Float},
+   * {@link Double}, {@link String} or {@link org.apache.tapestry5.internal.plastic.asm.Type}, or a two elements String
+   * array (for enumeration values), an {@link AnnotationNode}, or a {@link List} of values of one
+   * of the preceding types. The list may be {@literal null} if there is no name value pair.
+   */
+  public List<Object> values;
+
+  /**
+   * Constructs a new {@link AnnotationNode}. <i>Subclasses must not use this constructor</i>.
+   * Instead, they must use the {@link #AnnotationNode(int, String)} version.
+   *
+   * @param descriptor the class descriptor of the annotation class.
+   * @throws IllegalStateException If a subclass calls this constructor.
+   */
+  public AnnotationNode(final String descriptor) {
+    this(Opcodes.ASM7, descriptor);
+    if (getClass() != AnnotationNode.class) {
+      throw new IllegalStateException();
     }
-
-    /**
-     * Constructs a new {@link AnnotationNode}.
-     * 
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     */
-    public AnnotationNode(final int api, final String desc) {
-        super(api);
-        this.desc = desc;
+  }
+
+  /**
+   * Constructs a new {@link AnnotationNode}.
+   *
+   * @param api the ASM API version implemented by this visitor. Must be one of {@link
+   *     Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+   * @param descriptor the class descriptor of the annotation class.
+   */
+  public AnnotationNode(final int api, final String descriptor) {
+    super(api);
+    this.desc = descriptor;
+  }
+
+  /**
+   * Constructs a new {@link AnnotationNode} to visit an array value.
+   *
+   * @param values where the visited values must be stored.
+   */
+  AnnotationNode(final List<Object> values) {
+    super(Opcodes.ASM7);
+    this.values = values;
+  }
+
+  // ------------------------------------------------------------------------
+  // Implementation of the AnnotationVisitor abstract class
+  // ------------------------------------------------------------------------
+
+  @Override
+  public void visit(final String name, final Object value) {
+    if (values == null) {
+      values = new ArrayList<Object>(this.desc != null ? 2 : 1);
     }
-
-    /**
-     * Constructs a new {@link AnnotationNode} to visit an array value.
-     * 
-     * @param values
-     *            where the visited values must be stored.
-     */
-    AnnotationNode(final List<Object> values) {
-        super(Opcodes.ASM6);
-        this.values = values;
+    if (this.desc != null) {
+      values.add(name);
     }
-
-    // ------------------------------------------------------------------------
-    // Implementation of the AnnotationVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final String name, final Object value) {
-        if (values == null) {
-            values = new ArrayList<Object>(this.desc != null ? 2 : 1);
-        }
-        if (this.desc != null) {
-            values.add(name);
-        }
-        if (value instanceof byte[]) {
-            byte[] v = (byte[]) value;
-            ArrayList<Byte> l = new ArrayList<Byte>(v.length);
-            for (byte b : v) {
-                l.add(b);
-            }
-            values.add(l);
-        } else if (value instanceof boolean[]) {
-            boolean[] v = (boolean[]) value;
-            ArrayList<Boolean> l = new ArrayList<Boolean>(v.length);
-            for (boolean b : v) {
-                l.add(b);
-            }
-            values.add(l);
-        } else if (value instanceof short[]) {
-            short[] v = (short[]) value;
-            ArrayList<Short> l = new ArrayList<Short>(v.length);
-            for (short s : v) {
-                l.add(s);
-            }
-            values.add(l);
-        } else if (value instanceof char[]) {
-            char[] v = (char[]) value;
-            ArrayList<Character> l = new ArrayList<Character>(v.length);
-            for (char c : v) {
-                l.add(c);
-            }
-            values.add(l);
-        } else if (value instanceof int[]) {
-            int[] v = (int[]) value;
-            ArrayList<Integer> l = new ArrayList<Integer>(v.length);
-            for (int i : v) {
-                l.add(i);
-            }
-            values.add(l);
-        } else if (value instanceof long[]) {
-            long[] v = (long[]) value;
-            ArrayList<Long> l = new ArrayList<Long>(v.length);
-            for (long lng : v) {
-                l.add(lng);
-            }
-            values.add(l);
-        } else if (value instanceof float[]) {
-            float[] v = (float[]) value;
-            ArrayList<Float> l = new ArrayList<Float>(v.length);
-            for (float f : v) {
-                l.add(f);
-            }
-            values.add(l);
-        } else if (value instanceof double[]) {
-            double[] v = (double[]) value;
-            ArrayList<Double> l = new ArrayList<Double>(v.length);
-            for (double d : v) {
-                l.add(d);
-            }
-            values.add(l);
-        } else {
-            values.add(value);
-        }
+    if (value instanceof byte[]) {
+      values.add(Util.asArrayList((byte[]) value));
+    } else if (value instanceof boolean[]) {
+      values.add(Util.asArrayList((boolean[]) value));
+    } else if (value instanceof short[]) {
+      values.add(Util.asArrayList((short[]) value));
+    } else if (value instanceof char[]) {
+      values.add(Util.asArrayList((char[]) value));
+    } else if (value instanceof int[]) {
+      values.add(Util.asArrayList((int[]) value));
+    } else if (value instanceof long[]) {
+      values.add(Util.asArrayList((long[]) value));
+    } else if (value instanceof float[]) {
+      values.add(Util.asArrayList((float[]) value));
+    } else if (value instanceof double[]) {
+      values.add(Util.asArrayList((double[]) value));
+    } else {
+      values.add(value);
     }
+  }
 
-    @Override
-    public void visitEnum(final String name, final String desc,
-            final String value) {
-        if (values == null) {
-            values = new ArrayList<Object>(this.desc != null ? 2 : 1);
-        }
-        if (this.desc != null) {
-            values.add(name);
-        }
-        values.add(new String[] { desc, value });
+  @Override
+  public void visitEnum(final String name, final String descriptor, final String value) {
+    if (values == null) {
+      values = new ArrayList<Object>(this.desc != null ? 2 : 1);
     }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String name,
-            final String desc) {
-        if (values == null) {
-            values = new ArrayList<Object>(this.desc != null ? 2 : 1);
-        }
-        if (this.desc != null) {
-            values.add(name);
-        }
-        AnnotationNode annotation = new AnnotationNode(desc);
-        values.add(annotation);
-        return annotation;
+    if (this.desc != null) {
+      values.add(name);
     }
+    values.add(new String[] {descriptor, value});
+  }
 
-    @Override
-    public AnnotationVisitor visitArray(final String name) {
-        if (values == null) {
-            values = new ArrayList<Object>(this.desc != null ? 2 : 1);
-        }
-        if (this.desc != null) {
-            values.add(name);
-        }
-        List<Object> array = new ArrayList<Object>();
-        values.add(array);
-        return new AnnotationNode(array);
+  @Override
+  public AnnotationVisitor visitAnnotation(final String name, final String descriptor) {
+    if (values == null) {
+      values = new ArrayList<Object>(this.desc != null ? 2 : 1);
     }
-
-    @Override
-    public void visitEnd() {
+    if (this.desc != null) {
+      values.add(name);
     }
-
-    // ------------------------------------------------------------------------
-    // Accept methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Checks that this annotation node is compatible with the given ASM API
-     * version. This methods checks that this node, and all its nodes
-     * recursively, do not contain elements that were introduced in more recent
-     * versions of the ASM API than the given version.
-     * 
-     * @param api
-     *            an ASM API version. Must be one of {@link Opcodes#ASM4},
-     *            {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
-     */
-    public void check(final int api) {
-        // nothing to do
+    AnnotationNode annotation = new AnnotationNode(descriptor);
+    values.add(annotation);
+    return annotation;
+  }
+
+  @Override
+  public AnnotationVisitor visitArray(final String name) {
+    if (values == null) {
+      values = new ArrayList<Object>(this.desc != null ? 2 : 1);
     }
-
-    /**
-     * Makes the given visitor visit this annotation.
-     * 
-     * @param av
-     *            an annotation visitor. Maybe <tt>null</tt>.
-     */
-    public void accept(final AnnotationVisitor av) {
-        if (av != null) {
-            if (values != null) {
-                for (int i = 0; i < values.size(); i += 2) {
-                    String name = (String) values.get(i);
-                    Object value = values.get(i + 1);
-                    accept(av, name, value);
-                }
-            }
-            av.visitEnd();
+    if (this.desc != null) {
+      values.add(name);
+    }
+    List<Object> array = new ArrayList<Object>();
+    values.add(array);
+    return new AnnotationNode(array);
+  }
+
+  @Override
+  public void visitEnd() {
+    // Nothing to do.
+  }
+
+  // ------------------------------------------------------------------------
+  // Accept methods
+  // ------------------------------------------------------------------------
+
+  /**
+   * Checks that this annotation node is compatible with the given ASM API version. This method
+   * checks that this node, and all its children recursively, do not contain elements that were
+   * introduced in more recent versions of the ASM API than the given version.
+   *
+   * @param api an ASM API version. Must be one of {@link Opcodes#ASM4}, {@link Opcodes#ASM5},
+   *     {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+   */
+  public void check(final int api) {
+    // nothing to do
+  }
+
+  /**
+   * Makes the given visitor visit this annotation.
+   *
+   * @param annotationVisitor an annotation visitor. Maybe {@literal null}.
+   */
+  public void accept(final AnnotationVisitor annotationVisitor) {
+    if (annotationVisitor != null) {
+      if (values != null) {
+        for (int i = 0, n = values.size(); i < n; i += 2) {
+          String name = (String) values.get(i);
+          Object value = values.get(i + 1);
+          accept(annotationVisitor, name, value);
         }
+      }
+      annotationVisitor.visitEnd();
     }
-
-    /**
-     * Makes the given visitor visit a given annotation value.
-     * 
-     * @param av
-     *            an annotation visitor. Maybe <tt>null</tt>.
-     * @param name
-     *            the value name.
-     * @param value
-     *            the actual value.
-     */
-    public static void accept(final AnnotationVisitor av, final String name,
-            final Object value) {
-        if (av != null) {
-            if (value instanceof String[]) {
-                String[] typeconst = (String[]) value;
-                av.visitEnum(name, typeconst[0], typeconst[1]);
-            } else if (value instanceof AnnotationNode) {
-                AnnotationNode an = (AnnotationNode) value;
-                an.accept(av.visitAnnotation(name, an.desc));
-            } else if (value instanceof List) {
-                AnnotationVisitor v = av.visitArray(name);
-                if (v != null) {
-                    List<?> array = (List<?>) value;
-                    for (int j = 0; j < array.size(); ++j) {
-                        accept(v, null, array.get(j));
-                    }
-                    v.visitEnd();
-                }
-            } else {
-                av.visit(name, value);
-            }
+  }
+
+  /**
+   * Makes the given visitor visit a given annotation value.
+   *
+   * @param annotationVisitor an annotation visitor. Maybe {@literal null}.
+   * @param name the value name.
+   * @param value the actual value.
+   */
+  public static void accept(
+      final AnnotationVisitor annotationVisitor, final String name, final Object value) {
+    if (annotationVisitor != null) {
+      if (value instanceof String[]) {
+        String[] typeValue = (String[]) value;
+        annotationVisitor.visitEnum(name, typeValue[0], typeValue[1]);
+      } else if (value instanceof AnnotationNode) {
+        AnnotationNode annotationValue = (AnnotationNode) value;
+        annotationValue.accept(annotationVisitor.visitAnnotation(name, annotationValue.desc));
+      } else if (value instanceof List) {
+        AnnotationVisitor arrayAnnotationVisitor = annotationVisitor.visitArray(name);
+        if (arrayAnnotationVisitor != null) {
+          List<?> arrayValue = (List<?>) value;
+          for (int i = 0, n = arrayValue.size(); i < n; ++i) {
+            accept(arrayAnnotationVisitor, null, arrayValue.get(i));
+          }
+          arrayAnnotationVisitor.visitEnd();
         }
+      } else {
+        annotationVisitor.visit(name, value);
+      }
     }
+  }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/ClassNode.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/ClassNode.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/ClassNode.java
old mode 100644
new mode 100755
index 386161c..83cf5d4
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/ClassNode.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/ClassNode.java
@@ -1,38 +1,34 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
 package org.apache.tapestry5.internal.plastic.asm.tree;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
-
 import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor;
 import org.apache.tapestry5.internal.plastic.asm.Attribute;
 import org.apache.tapestry5.internal.plastic.asm.ClassVisitor;
@@ -44,414 +40,391 @@ import org.apache.tapestry5.internal.plastic.asm.TypePath;
 
 /**
  * A node that represents a class.
- * 
+ *
  * @author Eric Bruneton
  */
 public class ClassNode extends ClassVisitor {
 
-    /**
-     * The class version.
-     */
-    public int version;
-
-    /**
-     * The class's access flags (see {@link org.objectweb.asm.Opcodes}). This
-     * field also indicates if the class is deprecated.
-     */
-    public int access;
-
-    /**
-     * The internal name of the class (see
-     * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
-     */
-    public String name;
-
-    /**
-     * The signature of the class. May be <tt>null</tt>.
-     */
-    public String signature;
-
-    /**
-     * The internal of name of the super class (see
-     * {@link org.objectweb.asm.Type#getInternalName() getInternalName}). For
-     * interfaces, the super class is {@link Object}. May be <tt>null</tt>, but
-     * only for the {@link Object} class.
-     */
-    public String superName;
-
-    /**
-     * The internal names of the class's interfaces (see
-     * {@link org.objectweb.asm.Type#getInternalName() getInternalName}). This
-     * list is a list of {@link String} objects.
-     */
-    public List<String> interfaces;
-
-    /**
-     * The name of the source file from which this class was compiled. May be
-     * <tt>null</tt>.
-     */
-    public String sourceFile;
-
-    /**
-     * Debug information to compute the correspondence between source and
-     * compiled elements of the class. May be <tt>null</tt>.
-     */
-    public String sourceDebug;
-
-    /**
-     * Module information. May be <tt>null</tt>.
-     */
-    public ModuleNode module;
-    
-    /**
-     * The internal name of the enclosing class of the class. May be
-     * <tt>null</tt>.
-     */
-    public String outerClass;
-
-    /**
-     * The name of the method that contains the class, or <tt>null</tt> if the
-     * class is not enclosed in a method.
-     */
-    public String outerMethod;
-
-    /**
-     * The descriptor of the method that contains the class, or <tt>null</tt> if
-     * the class is not enclosed in a method.
-     */
-    public String outerMethodDesc;
-
-    /**
-     * The runtime visible annotations of this class. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.tree.AnnotationNode
-     * @label visible
-     */
-    public List<AnnotationNode> visibleAnnotations;
-
-    /**
-     * The runtime invisible annotations of this class. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.tree.AnnotationNode
-     * @label invisible
-     */
-    public List<AnnotationNode> invisibleAnnotations;
-
-    /**
-     * The runtime visible type annotations of this class. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.tree.TypeAnnotationNode
-     * @label visible
-     */
-    public List<TypeAnnotationNode> visibleTypeAnnotations;
-
-    /**
-     * The runtime invisible type annotations of this class. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.tree.TypeAnnotationNode
-     * @label invisible
-     */
-    public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
-    /**
-     * The non standard attributes of this class. This list is a list of
-     * {@link Attribute} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.Attribute
-     */
-    public List<Attribute> attrs;
-
-    /**
-     * Informations about the inner classes of this class. This list is a list
-     * of {@link InnerClassNode} objects.
-     * 
-     * @associates org.objectweb.asm.tree.InnerClassNode
-     */
-    public List<InnerClassNode> innerClasses;
-
-    /**
-     * The fields of this class. This list is a list of {@link FieldNode}
-     * objects.
-     * 
-     * @associates org.objectweb.asm.tree.FieldNode
-     */
-    public List<FieldNode> fields;
-
-    /**
-     * The methods of this class. This list is a list of {@link MethodNode}
-     * objects.
-     * 
-     * @associates org.objectweb.asm.tree.MethodNode
-     */
-    public List<MethodNode> methods;
-
-    /**
-     * Constructs a new {@link ClassNode}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the {@link #ClassNode(int)}
-     * version.
-     * 
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public ClassNode() {
-        this(Opcodes.ASM6);
-        if (getClass() != ClassNode.class) {
-            throw new IllegalStateException();
-        }
+  /**
+   * The class version. The minor version is stored in the 16 most significant bits, and the major
+   * version in the 16 least significant bits.
+   */
+  public int version;
+
+  /**
+   * The class's access flags (see {@link org.apache.tapestry5.internal.plastic.asm.Opcodes}). This field also indicates if
+   * the class is deprecated.
+   */
+  public int access;
+
+  /** The internal name of this class (see {@link org.apache.tapestry5.internal.plastic.asm.Type#getInternalName}). */
+  public String name;
+
+  /** The signature of this class. May be {@literal null}. */
+  public String signature;
+
+  /**
+   * The internal of name of the super class (see {@link org.apache.tapestry5.internal.plastic.asm.Type#getInternalName}).
+   * For interfaces, the super class is {@link Object}. May be {@literal null}, but only for the
+   * {@link Object} class.
+   */
+  public String superName;
+
+  /**
+   * The internal names of the interfaces directly implemented by this class (see {@link
+   * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName}).
+   */
+  public List<String> interfaces;
+
+  /** The name of the source file from which this class was compiled. May be {@literal null}. */
+  public String sourceFile;
+
+  /**
+   * The correspondence between source and compiled elements of this class. May be {@literal null}.
+   */
+  public String sourceDebug;
+
+  /** The module stored in this class. May be {@literal null}. */
+  public ModuleNode module;
+
+  /** The internal name of the enclosing class of this class. May be {@literal null}. */
+  public String outerClass;
+
+  /**
+   * The name of the method that contains this class, or {@literal null} if this class is not
+   * enclosed in a method.
+   */
+  public String outerMethod;
+
+  /**
+   * The descriptor of the method that contains this class, or {@literal null} if this class is not
+   * enclosed in a method.
+   */
+  public String outerMethodDesc;
+
+  /** The runtime visible annotations of this class. May be {@literal null}. */
+  public List<AnnotationNode> visibleAnnotations;
+
+  /** The runtime invisible annotations of this class. May be {@literal null}. */
+  public List<AnnotationNode> invisibleAnnotations;
+
+  /** The runtime visible type annotations of this class. May be {@literal null}. */
+  public List<TypeAnnotationNode> visibleTypeAnnotations;
+
+  /** The runtime invisible type annotations of this class. May be {@literal null}. */
+  public List<TypeAnnotationNode> invisibleTypeAnnotations;
+
+  /** The non standard attributes of this class. May be {@literal null}. */
+  public List<Attribute> attrs;
+
+  /** The inner classes of this class. */
+  public List<InnerClassNode> innerClasses;
+
+  /** The internal name of the nest host class of this class. May be {@literal null}. */
+  public String nestHostClass;
+
+  /** The internal names of the nest members of this class. May be {@literal null}. */
+  public List<String> nestMembers;
+
+  /** The fields of this class. */
+  public List<FieldNode> fields;
+
+  /** The methods of this class. */
+  public List<MethodNode> methods;
+
+  /**
+   * Constructs a new {@link ClassNode}. <i>Subclasses must not use this constructor</i>. Instead,
+   * they must use the {@link #ClassNode(int)} version.
+   *
+   * @throws IllegalStateException If a subclass calls this constructor.
+   */
+  public ClassNode() {
+    this(Opcodes.ASM7);
+    if (getClass() != ClassNode.class) {
+      throw new IllegalStateException();
     }
-
-    /**
-     * Constructs a new {@link ClassNode}.
-     * 
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
-     */
-    public ClassNode(final int api) {
-        super(api);
-        this.interfaces = new ArrayList<String>();
-        this.innerClasses = new ArrayList<InnerClassNode>();
-        this.fields = new ArrayList<FieldNode>();
-        this.methods = new ArrayList<MethodNode>();
+  }
+
+  /**
+   * Constructs a new {@link ClassNode}.
+   *
+   * @param api the ASM API version implemented by this visitor. Must be one of {@link
+   *     Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+   */
+  public ClassNode(final int api) {
+    super(api);
+    this.interfaces = new ArrayList<String>();
+    this.innerClasses = new ArrayList<InnerClassNode>();
+    this.fields = new ArrayList<FieldNode>();
+    this.methods = new ArrayList<MethodNode>();
+  }
+
+  // -----------------------------------------------------------------------------------------------
+  // Implementation of the ClassVisitor abstract class
+  // -----------------------------------------------------------------------------------------------
+
+  @Override
+  public void visit(
+      final int version,
+      final int access,
+      final String name,
+      final String signature,
+      final String superName,
+      final String[] interfaces) {
+    this.version = version;
+    this.access = access;
+    this.name = name;
+    this.signature = signature;
+    this.superName = superName;
+    this.interfaces = Util.asArrayList(interfaces);
+  }
+
+  @Override
+  public void visitSource(final String file, final String debug) {
+    sourceFile = file;
+    sourceDebug = debug;
+  }
+
+  @Override
+  public ModuleVisitor visitModule(final String name, final int access, final String version) {
+    module = new ModuleNode(name, access, version);
+    return module;
+  }
+
+  @Override
+  public void visitNestHost(final String nestHost) {
+    this.nestHostClass = nestHost;
+  }
+
+  @Override
+  public void visitOuterClass(final String owner, final String name, final String descriptor) {
+    outerClass = owner;
+    outerMethod = name;
+    outerMethodDesc = descriptor;
+  }
+
+  @Override
+  public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
+    AnnotationNode annotation = new AnnotationNode(descriptor);
+    if (visible) {
+      if (visibleAnnotations == null) {
+        visibleAnnotations = new ArrayList<AnnotationNode>(1);
+      }
+      visibleAnnotations.add(annotation);
+    } else {
+      if (invisibleAnnotations == null) {
+        invisibleAnnotations = new ArrayList<AnnotationNode>(1);
+      }
+      invisibleAnnotations.add(annotation);
+    }
+    return annotation;
+  }
+
+  @Override
+  public AnnotationVisitor visitTypeAnnotation(
+      final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {
+    TypeAnnotationNode typeAnnotation = new TypeAnnotationNode(typeRef, typePath, descriptor);
+    if (visible) {
+      if (visibleTypeAnnotations == null) {
+        visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
+      }
+      visibleTypeAnnotations.add(typeAnnotation);
+    } else {
+      if (invisibleTypeAnnotations == null) {
+        invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
+      }
+      invisibleTypeAnnotations.add(typeAnnotation);
     }
+    return typeAnnotation;
+  }
 
-    // ------------------------------------------------------------------------
-    // Implementation of the ClassVisitor abstract class
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void visit(final int version, final int access, final String name,
-            final String signature, final String superName,
-            final String[] interfaces) {
-        this.version = version;
-        this.access = access;
-        this.name = name;
-        this.signature = signature;
-        this.superName = superName;
-        if (interfaces != null) {
-            this.interfaces.addAll(Arrays.asList(interfaces));
-        }
+  @Override
+  public void visitAttribute(final Attribute attribute) {
+    if (attrs == null) {
+      attrs = new ArrayList<Attribute>(1);
     }
+    attrs.add(attribute);
+  }
 
-    @Override
-    public void visitSource(final String file, final String debug) {
-        sourceFile = file;
-        sourceDebug = debug;
+  @Override
+  public void visitNestMember(final String nestMember) {
+    if (nestMembers == null) {
+      nestMembers = new ArrayList<String>();
     }
-    
-    @Override
-    public ModuleVisitor visitModule(final String name, final int access,
-            final String version) {
-        return module = new ModuleNode(name, access, version); 
+    nestMembers.add(nestMember);
+  }
+
+  @Override
+  public void visitInnerClass(
+      final String name, final String outerName, final String innerName, final int access) {
+    InnerClassNode innerClass = new InnerClassNode(name, outerName, innerName, access);
+    innerClasses.add(innerClass);
+  }
+
+  @Override
+  public FieldVisitor visitField(
+      final int access,
+      final String name,
+      final String descriptor,
+      final String signature,
+      final Object value) {
+    FieldNode field = new FieldNode(access, name, descriptor, signature, value);
+    fields.add(field);
+    return field;
+  }
+
+  @Override
+  public MethodVisitor visitMethod(
+      final int access,
+      final String name,
+      final String descriptor,
+      final String signature,
+      final String[] exceptions) {
+    MethodNode method = new MethodNode(access, name, descriptor, signature, exceptions);
+    methods.add(method);
+    return method;
+  }
+
+  @Override
+  public void visitEnd() {
+    // Nothing to do.
+  }
+
+  // -----------------------------------------------------------------------------------------------
+  // Accept method
+  // -----------------------------------------------------------------------------------------------
+
+  /**
+   * Checks that this class node is compatible with the given ASM API version. This method checks
+   * that this node, and all its children recursively, do not contain elements that were introduced
+   * in more recent versions of the ASM API than the given version.
+   *
+   * @param api an ASM API version. Must be one of {@link Opcodes#ASM4}, {@link Opcodes#ASM5},
+   *     {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+   */
+  public void check(final int api) {
+    if (api < Opcodes.ASM7 && (nestHostClass != null || nestMembers != null)) {
+      throw new UnsupportedClassVersionException();
     }
-
-    @Override
-    public void visitOuterClass(final String owner, final String name,
-            final String desc) {
-        outerClass = owner;
-        outerMethod = name;
-        outerMethodDesc = desc;
+    if (api < Opcodes.ASM6 && module != null) {
+      throw new UnsupportedClassVersionException();
     }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        AnnotationNode an = new AnnotationNode(desc);
-        if (visible) {
-            if (visibleAnnotations == null) {
-                visibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            visibleAnnotations.add(an);
-        } else {
-            if (invisibleAnnotations == null) {
-                invisibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            invisibleAnnotations.add(an);
-        }
-        return an;
+    if (api < Opcodes.ASM5) {
+      if (visibleTypeAnnotations != null && !visibleTypeAnnotations.isEmpty()) {
+        throw new UnsupportedClassVersionException();
+      }
+      if (invisibleTypeAnnotations != null && !invisibleTypeAnnotations.isEmpty()) {
+        throw new UnsupportedClassVersionException();
+      }
     }
-
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
-        if (visible) {
-            if (visibleTypeAnnotations == null) {
-                visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            visibleTypeAnnotations.add(an);
-        } else {
-            if (invisibleTypeAnnotations == null) {
-                invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            invisibleTypeAnnotations.add(an);
-        }
-        return an;
+    // Check the annotations.
+    if (visibleAnnotations != null) {
+      for (int i = visibleAnnotations.size() - 1; i >= 0; --i) {
+        visibleAnnotations.get(i).check(api);
+      }
     }
-
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        if (attrs == null) {
-            attrs = new ArrayList<Attribute>(1);
-        }
-        attrs.add(attr);
+    if (invisibleAnnotations != null) {
+      for (int i = invisibleAnnotations.size() - 1; i >= 0; --i) {
+        invisibleAnnotations.get(i).check(api);
+      }
     }
-
-    @Override
-    public void visitInnerClass(final String name, final String outerName,
-            final String innerName, final int access) {
-        InnerClassNode icn = new InnerClassNode(name, outerName, innerName,
-                access);
-        innerClasses.add(icn);
+    if (visibleTypeAnnotations != null) {
+      for (int i = visibleTypeAnnotations.size() - 1; i >= 0; --i) {
+        visibleTypeAnnotations.get(i).check(api);
+      }
     }
-
-    @Override
-    public FieldVisitor visitField(final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        FieldNode fn = new FieldNode(access, name, desc, signature, value);
-        fields.add(fn);
-        return fn;
+    if (invisibleTypeAnnotations != null) {
+      for (int i = invisibleTypeAnnotations.size() - 1; i >= 0; --i) {
+        invisibleTypeAnnotations.get(i).check(api);
+      }
     }
-
-    @Override
-    public MethodVisitor visitMethod(final int access, final String name,
-            final String desc, final String signature, final String[] exceptions) {
-        MethodNode mn = new MethodNode(access, name, desc, signature,
-                exceptions);
-        methods.add(mn);
-        return mn;
+    for (int i = fields.size() - 1; i >= 0; --i) {
+      fields.get(i).check(api);
     }
-
-    @Override
-    public void visitEnd() {
+    for (int i = methods.size() - 1; i >= 0; --i) {
+      methods.get(i).check(api);
     }
-
-    // ------------------------------------------------------------------------
-    // Accept method
-    // ------------------------------------------------------------------------
-
-    /**
-     * Checks that this class node is compatible with the given ASM API version.
-     * This methods checks that this node, and all its nodes recursively, do not
-     * contain elements that were introduced in more recent versions of the ASM
-     * API than the given version.
-     * 
-     * @param api
-     *            an ASM API version. Must be one of {@link Opcodes#ASM4},
-     *            {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
-     */
-    public void check(final int api) {
-        if (api < Opcodes.ASM6) {
-            if (module != null) {
-                throw new RuntimeException();
-            }
-        }
-        if (api < Opcodes.ASM5) {
-            if (visibleTypeAnnotations != null
-                    && visibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-            if (invisibleTypeAnnotations != null
-                    && invisibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-        }
-        // checks attributes
-        int i, n;
-        n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            visibleAnnotations.get(i).check(api);
-        }
-        n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            invisibleAnnotations.get(i).check(api);
-        }
-        n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            visibleTypeAnnotations.get(i).check(api);
-        }
-        n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
-                .size();
-        for (i = 0; i < n; ++i) {
-            invisibleTypeAnnotations.get(i).check(api);
-        }
-        for (FieldNode f : fields) {
-            f.check(api);
-        }
-        for (MethodNode m : methods) {
-            m.check(api);
-        }
+  }
+
+  /**
+   * Makes the given class visitor visit this class.
+   *
+   * @param classVisitor a class visitor.
+   */
+  public void accept(final ClassVisitor classVisitor) {
+    // Visit the header.
+    String[] interfacesArray = new String[this.interfaces.size()];
+    this.interfaces.toArray(interfacesArray);
+    classVisitor.visit(version, access, name, signature, superName, interfacesArray);
+    // Visit the source.
+    if (sourceFile != null || sourceDebug != null) {
+      classVisitor.visitSource(sourceFile, sourceDebug);
     }
-
-    /**
-     * Makes the given class visitor visit this class.
-     * 
-     * @param cv
-     *            a class visitor.
-     */
-    public void accept(final ClassVisitor cv) {
-        // visits header
-        String[] interfaces = new String[this.interfaces.size()];
-        this.interfaces.toArray(interfaces);
-        cv.visit(version, access, name, signature, superName, interfaces);
-        // visits source
-        if (sourceFile != null || sourceDebug != null) {
-            cv.visitSource(sourceFile, sourceDebug);
-        }
-        // visits module
-        if (module != null) {
-            module.accept(cv);
-        }
-        // visits outer class
-        if (outerClass != null) {
-            cv.visitOuterClass(outerClass, outerMethod, outerMethodDesc);
-        }
-        // visits attributes
-        int i, n;
-        n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = visibleAnnotations.get(i);
-            an.accept(cv.visitAnnotation(an.desc, true));
-        }
-        n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = invisibleAnnotations.get(i);
-            an.accept(cv.visitAnnotation(an.desc, false));
-        }
-        n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = visibleTypeAnnotations.get(i);
-            an.accept(cv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    true));
-        }
-        n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
-                .size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
-            an.accept(cv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    false));
-        }
-        n = attrs == null ? 0 : attrs.size();
-        for (i = 0; i < n; ++i) {
-            cv.visitAttribute(attrs.get(i));
-        }
-        // visits inner classes
-        for (i = 0; i < innerClasses.size(); ++i) {
-            innerClasses.get(i).accept(cv);
-        }
-        // visits fields
-        for (i = 0; i < fields.size(); ++i) {
-            fields.get(i).accept(cv);
-        }
-        // visits methods
-        for (i = 0; i < methods.size(); ++i) {
-            methods.get(i).accept(cv);
-        }
-        // visits end
-        cv.visitEnd();
+    // Visit the module.
+    if (module != null) {
+      module.accept(classVisitor);
+    }
+    // Visit the nest host class.
+    if (nestHostClass != null) {
+      classVisitor.visitNestHost(nestHostClass);
+    }
+    // Visit the outer class.
+    if (outerClass != null) {
+      classVisitor.visitOuterClass(outerClass, outerMethod, outerMethodDesc);
+    }
+    // Visit the annotations.
+    if (visibleAnnotations != null) {
+      for (int i = 0, n = visibleAnnotations.size(); i < n; ++i) {
+        AnnotationNode annotation = visibleAnnotations.get(i);
+        annotation.accept(classVisitor.visitAnnotation(annotation.desc, true));
+      }
+    }
+    if (invisibleAnnotations != null) {
+      for (int i = 0, n = invisibleAnnotations.size(); i < n; ++i) {
+        AnnotationNode annotation = invisibleAnnotations.get(i);
+        annotation.accept(classVisitor.visitAnnotation(annotation.desc, false));
+      }
+    }
+    if (visibleTypeAnnotations != null) {
+      for (int i = 0, n = visibleTypeAnnotations.size(); i < n; ++i) {
+        TypeAnnotationNode typeAnnotation = visibleTypeAnnotations.get(i);
+        typeAnnotation.accept(
+            classVisitor.visitTypeAnnotation(
+                typeAnnotation.typeRef, typeAnnotation.typePath, typeAnnotation.desc, true));
+      }
+    }
+    if (invisibleTypeAnnotations != null) {
+      for (int i = 0, n = invisibleTypeAnnotations.size(); i < n; ++i) {
+        TypeAnnotationNode typeAnnotation = invisibleTypeAnnotations.get(i);
+        typeAnnotation.accept(
+            classVisitor.visitTypeAnnotation(
+                typeAnnotation.typeRef, typeAnnotation.typePath, typeAnnotation.desc, false));
+      }
+    }
+    // Visit the non standard attributes.
+    if (attrs != null) {
+      for (int i = 0, n = attrs.size(); i < n; ++i) {
+        classVisitor.visitAttribute(attrs.get(i));
+      }
+    }
+    // Visit the nest members.
+    if (nestMembers != null) {
+      for (int i = 0, n = nestMembers.size(); i < n; ++i) {
+        classVisitor.visitNestMember(nestMembers.get(i));
+      }
+    }
+    // Visit the inner classes.
+    for (int i = 0, n = innerClasses.size(); i < n; ++i) {
+      innerClasses.get(i).accept(classVisitor);
+    }
+    // Visit the fields.
+    for (int i = 0, n = fields.size(); i < n; ++i) {
+      fields.get(i).accept(classVisitor);
+    }
+    // Visit the methods.
+    for (int i = 0, n = methods.size(); i < n; ++i) {
+      methods.get(i).accept(classVisitor);
     }
+    classVisitor.visitEnd();
+  }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldInsnNode.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldInsnNode.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldInsnNode.java
old mode 100644
new mode 100755
index 075519e..97bf7b0
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldInsnNode.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldInsnNode.java
@@ -1,110 +1,96 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
 package org.apache.tapestry5.internal.plastic.asm.tree;
 
 import java.util.Map;
-
 import org.apache.tapestry5.internal.plastic.asm.MethodVisitor;
 
 /**
- * A node that represents a field instruction. A field instruction is an
- * instruction that loads or stores the value of a field of an object.
- * 
+ * A node that represents a field instruction. A field instruction is an instruction that loads or
+ * stores the value of a field of an object.
+ *
  * @author Eric Bruneton
  */
 public class FieldInsnNode extends AbstractInsnNode {
 
-    /**
-     * The internal name of the field's owner class (see
-     * {@link org.objectweb.asm.Type#getInternalName() getInternalName}).
-     */
-    public String owner;
+  /**
+   * The internal name of the field's owner class (see {@link
+   * org.apache.tapestry5.internal.plastic.asm.Type#getInternalName}).
+   */
+  public String owner;
 
-    /**
-     * The field's name.
-     */
-    public String name;
+  /** The field's name. */
+  public String name;
 
-    /**
-     * The field's descriptor (see {@link org.objectweb.asm.Type}).
-     */
-    public String desc;
+  /** The field's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}). */
+  public String desc;
 
-    /**
-     * Constructs a new {@link FieldInsnNode}.
-     * 
-     * @param opcode
-     *            the opcode of the type instruction to be constructed. This
-     *            opcode must be GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
-     * @param owner
-     *            the internal name of the field's owner class (see
-     *            {@link org.objectweb.asm.Type#getInternalName()
-     *            getInternalName}).
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link org.objectweb.asm.Type}).
-     */
-    public FieldInsnNode(final int opcode, final String owner,
-            final String name, final String desc) {
-        super(opcode);
-        this.owner = owner;
-        this.name = name;
-        this.desc = desc;
-    }
+  /**
+   * Constructs a new {@link FieldInsnNode}.
+   *
+   * @param opcode the opcode of the type instruction to be constructed. This opcode must be
+   *     GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
+   * @param owner the internal name of the field's owner class (see {@link
+   *     org.apache.tapestry5.internal.plastic.asm.Type#getInternalName}).
+   * @param name the field's name.
+   * @param descriptor the field's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+   */
+  public FieldInsnNode(
+      final int opcode, final String owner, final String name, final String descriptor) {
+    super(opcode);
+    this.owner = owner;
+    this.name = name;
+    this.desc = descriptor;
+  }
 
-    /**
-     * Sets the opcode of this instruction.
-     * 
-     * @param opcode
-     *            the new instruction opcode. This opcode must be GETSTATIC,
-     *            PUTSTATIC, GETFIELD or PUTFIELD.
-     */
-    public void setOpcode(final int opcode) {
-        this.opcode = opcode;
-    }
+  /**
+   * Sets the opcode of this instruction.
+   *
+   * @param opcode the new instruction opcode. This opcode must be GETSTATIC, PUTSTATIC, GETFIELD or
+   *     PUTFIELD.
+   */
+  public void setOpcode(final int opcode) {
+    this.opcode = opcode;
+  }
 
-    @Override
-    public int getType() {
-        return FIELD_INSN;
-    }
+  @Override
+  public int getType() {
+    return FIELD_INSN;
+  }
 
-    @Override
-    public void accept(final MethodVisitor mv) {
-        mv.visitFieldInsn(opcode, owner, name, desc);
-        acceptAnnotations(mv);
-    }
+  @Override
+  public void accept(final MethodVisitor methodVisitor) {
+    methodVisitor.visitFieldInsn(opcode, owner, name, desc);
+    acceptAnnotations(methodVisitor);
+  }
 
-    @Override
-    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
-        return new FieldInsnNode(opcode, owner, name, desc)
-                .cloneAnnotations(this);
-    }
+  @Override
+  public AbstractInsnNode clone(final Map<LabelNode, LabelNode> clonedLabels) {
+    return new FieldInsnNode(opcode, owner, name, desc).cloneAnnotations(this);
+  }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldNode.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldNode.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldNode.java
old mode 100644
new mode 100755
index b4e08d8..c1b516c
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldNode.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/FieldNode.java
@@ -1,37 +1,34 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
 package org.apache.tapestry5.internal.plastic.asm.tree;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor;
 import org.apache.tapestry5.internal.plastic.asm.Attribute;
 import org.apache.tapestry5.internal.plastic.asm.ClassVisitor;
@@ -41,267 +38,223 @@ import org.apache.tapestry5.internal.plastic.asm.TypePath;
 
 /**
  * A node that represents a field.
- * 
+ *
  * @author Eric Bruneton
  */
 public class FieldNode extends FieldVisitor {
 
-    /**
-     * The field's access flags (see {@link org.objectweb.asm.Opcodes}). This
-     * field also indicates if the field is synthetic and/or deprecated.
-     */
-    public int access;
+  /**
+   * The field's access flags (see {@link org.apache.tapestry5.internal.plastic.asm.Opcodes}). This field also indicates if
+   * the field is synthetic and/or deprecated.
+   */
+  public int access;
 
-    /**
-     * The field's name.
-     */
-    public String name;
+  /** The field's name. */
+  public String name;
 
-    /**
-     * The field's descriptor (see {@link org.objectweb.asm.Type}).
-     */
-    public String desc;
+  /** The field's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}). */
+  public String desc;
 
-    /**
-     * The field's signature. May be <tt>null</tt>.
-     */
-    public String signature;
+  /** The field's signature. May be {@literal null}. */
+  public String signature;
 
-    /**
-     * The field's initial value. This field, which may be <tt>null</tt> if the
-     * field does not have an initial value, must be an {@link Integer}, a
-     * {@link Float}, a {@link Long}, a {@link Double} or a {@link String}.
-     */
-    public Object value;
+  /**
+   * The field's initial value. This field, which may be {@literal null} if the field does not have
+   * an initial value, must be an {@link Integer}, a {@link Float}, a {@link Long}, a {@link Double}
+   * or a {@link String}.
+   */
+  public Object value;
 
-    /**
-     * The runtime visible annotations of this field. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.tree.AnnotationNode
-     * @label visible
-     */
-    public List<AnnotationNode> visibleAnnotations;
+  /** The runtime visible annotations of this field. May be {@literal null}. */
+  public List<AnnotationNode> visibleAnnotations;
 
-    /**
-     * The runtime invisible annotations of this field. This list is a list of
-     * {@link AnnotationNode} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.tree.AnnotationNode
-     * @label invisible
-     */
-    public List<AnnotationNode> invisibleAnnotations;
+  /** The runtime invisible annotations of this field. May be {@literal null}. */
+  public List<AnnotationNode> invisibleAnnotations;
 
-    /**
-     * The runtime visible type annotations of this field. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.tree.TypeAnnotationNode
-     * @label visible
-     */
-    public List<TypeAnnotationNode> visibleTypeAnnotations;
+  /** The runtime visible type annotations of this field. May be {@literal null}. */
+  public List<TypeAnnotationNode> visibleTypeAnnotations;
 
-    /**
-     * The runtime invisible type annotations of this field. This list is a list
-     * of {@link TypeAnnotationNode} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.tree.TypeAnnotationNode
-     * @label invisible
-     */
-    public List<TypeAnnotationNode> invisibleTypeAnnotations;
+  /** The runtime invisible type annotations of this field. May be {@literal null}. */
+  public List<TypeAnnotationNode> invisibleTypeAnnotations;
 
-    /**
-     * The non standard attributes of this field. This list is a list of
-     * {@link Attribute} objects. May be <tt>null</tt>.
-     * 
-     * @associates org.objectweb.asm.Attribute
-     */
-    public List<Attribute> attrs;
+  /** The non standard attributes of this field. * May be {@literal null}. */
+  public List<Attribute> attrs;
 
-    /**
-     * Constructs a new {@link FieldNode}. <i>Subclasses must not use this
-     * constructor</i>. Instead, they must use the
-     * {@link #FieldNode(int, int, String, String, String, Object)} version.
-     * 
-     * @param access
-     *            the field's access flags (see
-     *            {@link org.objectweb.asm.Opcodes}). This parameter also
-     *            indicates if the field is synthetic and/or deprecated.
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link org.objectweb.asm.Type
-     *            Type}).
-     * @param signature
-     *            the field's signature.
-     * @param value
-     *            the field's initial value. This parameter, which may be
-     *            <tt>null</tt> if the field does not have an initial value,
-     *            must be an {@link Integer}, a {@link Float}, a {@link Long}, a
-     *            {@link Double} or a {@link String}.
-     * @throws IllegalStateException
-     *             If a subclass calls this constructor.
-     */
-    public FieldNode(final int access, final String name, final String desc,
-            final String signature, final Object value) {
-        this(Opcodes.ASM6, access, name, desc, signature, value);
-        if (getClass() != FieldNode.class) {
-            throw new IllegalStateException();
-        }
+  /**
+   * Constructs a new {@link FieldNode}. <i>Subclasses must not use this constructor</i>. Instead,
+   * they must use the {@link #FieldNode(int, int, String, String, String, Object)} version.
+   *
+   * @param access the field's access flags (see {@link org.apache.tapestry5.internal.plastic.asm.Opcodes}). This parameter
+   *     also indicates if the field is synthetic and/or deprecated.
+   * @param name the field's name.
+   * @param descriptor the field's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+   * @param signature the field's signature.
+   * @param value the field's initial value. This parameter, which may be {@literal null} if the
+   *     field does not have an initial value, must be an {@link Integer}, a {@link Float}, a {@link
+   *     Long}, a {@link Double} or a {@link String}.
+   * @throws IllegalStateException If a subclass calls this constructor.
+   */
+  public FieldNode(
+      final int access,
+      final String name,
+      final String descriptor,
+      final String signature,
+      final Object value) {
+    this(Opcodes.ASM7, access, name, descriptor, signature, value);
+    if (getClass() != FieldNode.class) {
+      throw new IllegalStateException();
     }
+  }
 
-    /**
-     * Constructs a new {@link FieldNode}. <i>Subclasses must not use this
-     * constructor</i>.
-     * 
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}.
-     * @param access
-     *            the field's access flags (see
-     *            {@link org.objectweb.asm.Opcodes}). This parameter also
-     *            indicates if the field is synthetic and/or deprecated.
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link org.objectweb.asm.Type
-     *            Type}).
-     * @param signature
-     *            the field's signature.
-     * @param value
-     *            the field's initial value. This parameter, which may be
-     *            <tt>null</tt> if the field does not have an initial value,
-     *            must be an {@link Integer}, a {@link Float}, a {@link Long}, a
-     *            {@link Double} or a {@link String}.
-     */
-    public FieldNode(final int api, final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        super(api);
-        this.access = access;
-        this.name = name;
-        this.desc = desc;
-        this.signature = signature;
-        this.value = value;
-    }
+  /**
+   * Constructs a new {@link FieldNode}. <i>Subclasses must not use this constructor</i>.
+   *
+   * @param api the ASM API version implemented by this visitor. Must be one of {@link Opcodes#ASM4}
+   *     or {@link Opcodes#ASM5}.
+   * @param access the field's access flags (see {@link org.apache.tapestry5.internal.plastic.asm.Opcodes}). This parameter
+   *     also indicates if the field is synthetic and/or deprecated.
+   * @param name the field's name.
+   * @param descriptor the field's descriptor (see {@link org.apache.tapestry5.internal.plastic.asm.Type}).
+   * @param signature the field's signature.
+   * @param value the field's initial value. This parameter, which may be {@literal null} if the
+   *     field does not have an initial value, must be an {@link Integer}, a {@link Float}, a {@link
+   *     Long}, a {@link Double} or a {@link String}.
+   */
+  public FieldNode(
+      final int api,
+      final int access,
+      final String name,
+      final String descriptor,
+      final String signature,
+      final Object value) {
+    super(api);
+    this.access = access;
+    this.name = name;
+    this.desc = descriptor;
+    this.signature = signature;
+    this.value = value;
+  }
 
-    // ------------------------------------------------------------------------
-    // Implementation of the FieldVisitor abstract class
-    // ------------------------------------------------------------------------
+  // -----------------------------------------------------------------------------------------------
+  // Implementation of the FieldVisitor abstract class
+  // -----------------------------------------------------------------------------------------------
 
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        AnnotationNode an = new AnnotationNode(desc);
-        if (visible) {
-            if (visibleAnnotations == null) {
-                visibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            visibleAnnotations.add(an);
-        } else {
-            if (invisibleAnnotations == null) {
-                invisibleAnnotations = new ArrayList<AnnotationNode>(1);
-            }
-            invisibleAnnotations.add(an);
-        }
-        return an;
+  @Override
+  public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
+    AnnotationNode annotation = new AnnotationNode(descriptor);
+    if (visible) {
+      if (visibleAnnotations == null) {
+        visibleAnnotations = new ArrayList<AnnotationNode>(1);
+      }
+      visibleAnnotations.add(annotation);
+    } else {
+      if (invisibleAnnotations == null) {
+        invisibleAnnotations = new ArrayList<AnnotationNode>(1);
+      }
+      invisibleAnnotations.add(annotation);
     }
+    return annotation;
+  }
 
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        TypeAnnotationNode an = new TypeAnnotationNode(typeRef, typePath, desc);
-        if (visible) {
-            if (visibleTypeAnnotations == null) {
-                visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            visibleTypeAnnotations.add(an);
-        } else {
-            if (invisibleTypeAnnotations == null) {
-                invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
-            }
-            invisibleTypeAnnotations.add(an);
-        }
-        return an;
+  @Override
+  public AnnotationVisitor visitTypeAnnotation(
+      final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {
+    TypeAnnotationNode typeAnnotation = new TypeAnnotationNode(typeRef, typePath, descriptor);
+    if (visible) {
+      if (visibleTypeAnnotations == null) {
+        visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
+      }
+      visibleTypeAnnotations.add(typeAnnotation);
+    } else {
+      if (invisibleTypeAnnotations == null) {
+        invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>(1);
+      }
+      invisibleTypeAnnotations.add(typeAnnotation);
     }
+    return typeAnnotation;
+  }
 
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        if (attrs == null) {
-            attrs = new ArrayList<Attribute>(1);
-        }
-        attrs.add(attr);
+  @Override
+  public void visitAttribute(final Attribute attribute) {
+    if (attrs == null) {
+      attrs = new ArrayList<Attribute>(1);
     }
+    attrs.add(attribute);
+  }
 
-    @Override
-    public void visitEnd() {
-    }
+  @Override
+  public void visitEnd() {
+    // Nothing to do.
+  }
 
-    // ------------------------------------------------------------------------
-    // Accept methods
-    // ------------------------------------------------------------------------
+  // -----------------------------------------------------------------------------------------------
+  // Accept methods
+  // -----------------------------------------------------------------------------------------------
 
-    /**
-     * Checks that this field node is compatible with the given ASM API version.
-     * This methods checks that this node, and all its nodes recursively, do not
-     * contain elements that were introduced in more recent versions of the ASM
-     * API than the given version.
-     * 
-     * @param api
-     *            an ASM API version. Must be one of {@link Opcodes#ASM4},
-     *            {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
-     */
-    public void check(final int api) {
-        if (api == Opcodes.ASM4) {
-            if (visibleTypeAnnotations != null
-                    && visibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-            if (invisibleTypeAnnotations != null
-                    && invisibleTypeAnnotations.size() > 0) {
-                throw new RuntimeException();
-            }
-        }
+  /**
+   * Checks that this field node is compatible with the given ASM API version. This method checks
+   * that this node, and all its children recursively, do not contain elements that were introduced
+   * in more recent versions of the ASM API than the given version.
+   *
+   * @param api an ASM API version. Must be one of {@link Opcodes#ASM4}, {@link Opcodes#ASM5},
+   *     {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+   */
+  public void check(final int api) {
+    if (api == Opcodes.ASM4) {
+      if (visibleTypeAnnotations != null && !visibleTypeAnnotations.isEmpty()) {
+        throw new UnsupportedClassVersionException();
+      }
+      if (invisibleTypeAnnotations != null && !invisibleTypeAnnotations.isEmpty()) {
+        throw new UnsupportedClassVersionException();
+      }
     }
+  }
 
-    /**
-     * Makes the given class visitor visit this field.
-     * 
-     * @param cv
-     *            a class visitor.
-     */
-    public void accept(final ClassVisitor cv) {
-        FieldVisitor fv = cv.visitField(access, name, desc, signature, value);
-        if (fv == null) {
-            return;
-        }
-        int i, n;
-        n = visibleAnnotations == null ? 0 : visibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = visibleAnnotations.get(i);
-            an.accept(fv.visitAnnotation(an.desc, true));
-        }
-        n = invisibleAnnotations == null ? 0 : invisibleAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            AnnotationNode an = invisibleAnnotations.get(i);
-            an.accept(fv.visitAnnotation(an.desc, false));
-        }
-        n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations.size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = visibleTypeAnnotations.get(i);
-            an.accept(fv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    true));
-        }
-        n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
-                .size();
-        for (i = 0; i < n; ++i) {
-            TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
-            an.accept(fv.visitTypeAnnotation(an.typeRef, an.typePath, an.desc,
-                    false));
-        }
-        n = attrs == null ? 0 : attrs.size();
-        for (i = 0; i < n; ++i) {
-            fv.visitAttribute(attrs.get(i));
-        }
-        fv.visitEnd();
+  /**
+   * Makes the given class visitor visit this field.
+   *
+   * @param classVisitor a class visitor.
+   */
+  public void accept(final ClassVisitor classVisitor) {
+    FieldVisitor fieldVisitor = classVisitor.visitField(access, name, desc, signature, value);
+    if (fieldVisitor == null) {
+      return;
+    }
+    // Visit the annotations.
+    if (visibleAnnotations != null) {
+      for (int i = 0, n = visibleAnnotations.size(); i < n; ++i) {
+        AnnotationNode annotation = visibleAnnotations.get(i);
+        annotation.accept(fieldVisitor.visitAnnotation(annotation.desc, true));
+      }
+    }
+    if (invisibleAnnotations != null) {
+      for (int i = 0, n = invisibleAnnotations.size(); i < n; ++i) {
+        AnnotationNode annotation = invisibleAnnotations.get(i);
+        annotation.accept(fieldVisitor.visitAnnotation(annotation.desc, false));
+      }
+    }
+    if (visibleTypeAnnotations != null) {
+      for (int i = 0, n = visibleTypeAnnotations.size(); i < n; ++i) {
+        TypeAnnotationNode typeAnnotation = visibleTypeAnnotations.get(i);
+        typeAnnotation.accept(
+            fieldVisitor.visitTypeAnnotation(
+                typeAnnotation.typeRef, typeAnnotation.typePath, typeAnnotation.desc, true));
+      }
+    }
+    if (invisibleTypeAnnotations != null) {
+      for (int i = 0, n = invisibleTypeAnnotations.size(); i < n; ++i) {
+        TypeAnnotationNode typeAnnotation = invisibleTypeAnnotations.get(i);
+        typeAnnotation.accept(
+            fieldVisitor.visitTypeAnnotation(
+                typeAnnotation.typeRef, typeAnnotation.typePath, typeAnnotation.desc, false));
+      }
+    }
+    // Visit the non standard attributes.
+    if (attrs != null) {
+      for (int i = 0, n = attrs.size(); i < n; ++i) {
+        fieldVisitor.visitAttribute(attrs.get(i));
+      }
     }
+    fieldVisitor.visitEnd();
+  }
 }