src/share/classes/jdk/internal/org/objectweb/asm/tree/ClassNode.java

Print this page

        

*** 66,75 **** --- 66,76 ---- import jdk.internal.org.objectweb.asm.Attribute; import jdk.internal.org.objectweb.asm.ClassVisitor; import jdk.internal.org.objectweb.asm.FieldVisitor; import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.internal.org.objectweb.asm.Opcodes; + import jdk.internal.org.objectweb.asm.TypePath; /** * A node that represents a class. * * @author Eric Bruneton
*** 92,110 **** * {@link jdk.internal.org.objectweb.asm.Type#getInternalName() getInternalName}). */ public String name; /** ! * The signature of the class. Mayt be <tt>null</tt>. */ public String signature; /** * The internal of name of the super class (see * {@link jdk.internal.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 --- 93,111 ---- * {@link jdk.internal.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 jdk.internal.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
*** 118,128 **** * <tt>null</tt>. */ public String sourceFile; /** ! * Debug information to compute the correspondance between source and * compiled elements of the class. May be <tt>null</tt>. */ public String sourceDebug; /** --- 119,129 ---- * <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; /**
*** 136,147 **** * 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 --- 137,148 ---- * 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
*** 160,169 **** --- 161,188 ---- * @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 jdk.internal.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 jdk.internal.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 jdk.internal.org.objectweb.asm.Attribute */
*** 197,214 **** * Constructs a new {@link ClassNode}. <i>Subclasses must not use this * constructor</i>. Instead, they must use the {@link #ClassNode(int)} * version. */ public ClassNode() { ! this(Opcodes.ASM4); } /** * Constructs a new {@link ClassNode}. * ! * @param api the ASM API version implemented by this visitor. Must be one ! * of {@link Opcodes#ASM4}. */ public ClassNode(final int api) { super(api); this.interfaces = new ArrayList<String>(); this.innerClasses = new ArrayList<InnerClassNode>(); --- 216,234 ---- * Constructs a new {@link ClassNode}. <i>Subclasses must not use this * constructor</i>. Instead, they must use the {@link #ClassNode(int)} * version. */ public ClassNode() { ! this(Opcodes.ASM5); } /** * Constructs a new {@link ClassNode}. * ! * @param api ! * the ASM API version implemented by this visitor. Must be one ! * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}. */ public ClassNode(final int api) { super(api); this.interfaces = new ArrayList<String>(); this.innerClasses = new ArrayList<InnerClassNode>();
*** 219,236 **** // ------------------------------------------------------------------------ // 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; --- 239,251 ---- // ------------------------------------------------------------------------ // 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;
*** 244,268 **** sourceFile = file; sourceDebug = debug; } @Override ! public void visitOuterClass( ! final String owner, ! final String name, ! final String desc) ! { outerClass = owner; outerMethod = name; outerMethodDesc = desc; } @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); } --- 259,278 ---- sourceFile = file; sourceDebug = debug; } @Override ! public void visitOuterClass(final String owner, final String name, ! final String desc) { outerClass = owner; outerMethod = name; outerMethodDesc = desc; } @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); }
*** 275,330 **** } return an; } @Override public void visitAttribute(final Attribute attr) { if (attrs == null) { attrs = new ArrayList<Attribute>(1); } attrs.add(attr); } @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); } @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; } @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; } --- 285,339 ---- } return an; } @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 void visitAttribute(final Attribute attr) { if (attrs == null) { attrs = new ArrayList<Attribute>(1); } attrs.add(attr); } @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); } @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; } @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; }
*** 340,359 **** * 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}. */ public void check(final int api) { ! // nothing to do } /** * 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); --- 349,386 ---- * 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} or ! * {@link Opcodes#ASM5}. */ 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(); + } + for (FieldNode f : fields) { + f.check(api); + } + for (MethodNode m : methods) { + m.check(api); + } + } + } /** * 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);
*** 376,385 **** --- 403,425 ---- 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