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    }