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