    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    }