001 package cpw.mods.fml.common.discovery.asm;
002
003 import org.objectweb.asm.AnnotationVisitor;
004 import org.objectweb.asm.Opcodes;
005
006 public class ModAnnotationVisitor extends AnnotationVisitor
007 {
008 private ASMModParser discoverer;
009 private boolean array;
010 private String name;
011 private boolean isSubAnnotation;
012
013 public ModAnnotationVisitor(ASMModParser discoverer)
014 {
015 super(Opcodes.ASM4);
016 this.discoverer = discoverer;
017 }
018
019 public ModAnnotationVisitor(ASMModParser discoverer, String name)
020 {
021 this(discoverer);
022 this.array = true;
023 this.name = name;
024 discoverer.addAnnotationArray(name);
025 }
026
027 public ModAnnotationVisitor(ASMModParser discoverer, boolean isSubAnnotation)
028 {
029 this(discoverer);
030 this.isSubAnnotation = true;
031 }
032
033 @Override
034 public void visit(String key, Object value)
035 {
036 discoverer.addAnnotationProperty(key, value);
037 }
038
039 @Override
040 public void visitEnum(String name, String desc, String value)
041 {
042 discoverer.addAnnotationEnumProperty(name, desc, value);
043 }
044
045 @Override
046 public AnnotationVisitor visitArray(String name)
047 {
048 return new ModAnnotationVisitor(discoverer, name);
049 }
050 @Override
051 public AnnotationVisitor visitAnnotation(String name, String desc)
052 {
053 discoverer.addSubAnnotation(name, desc);
054 return new ModAnnotationVisitor(discoverer, true);
055 }
056 @Override
057 public void visitEnd()
058 {
059 if (array)
060 {
061 discoverer.endArray();
062 }
063
064 if (isSubAnnotation)
065 {
066 discoverer.endSubAnnotation();
067 }
068 }
069 }