001/*
002 * Forge Mod Loader
003 * Copyright (c) 2012-2013 cpw.
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser Public License v2.1
006 * which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
008 * 
009 * Contributors:
010 *     cpw - implementation
011 */
012
013package cpw.mods.fml.common.discovery.asm;
014
015import org.objectweb.asm.AnnotationVisitor;
016import org.objectweb.asm.Opcodes;
017
018public class ModAnnotationVisitor extends AnnotationVisitor
019{
020    private ASMModParser discoverer;
021    private boolean array;
022    private String name;
023    private boolean isSubAnnotation;
024
025    public ModAnnotationVisitor(ASMModParser discoverer)
026    {
027        super(Opcodes.ASM4);
028        this.discoverer = discoverer;
029    }
030    
031    public ModAnnotationVisitor(ASMModParser discoverer, String name)
032    {
033        this(discoverer);
034        this.array = true;
035        this.name = name;
036        discoverer.addAnnotationArray(name);
037    }
038
039    public ModAnnotationVisitor(ASMModParser discoverer, boolean isSubAnnotation)
040    {
041        this(discoverer);
042        this.isSubAnnotation = true;
043    }
044
045    @Override
046    public void visit(String key, Object value)
047    {
048        discoverer.addAnnotationProperty(key, value);
049    }
050    
051    @Override
052    public void visitEnum(String name, String desc, String value)
053    {
054        discoverer.addAnnotationEnumProperty(name, desc, value);
055    }
056    
057    @Override
058    public AnnotationVisitor visitArray(String name)
059    {
060        return new ModAnnotationVisitor(discoverer, name);
061    }
062    @Override
063    public AnnotationVisitor visitAnnotation(String name, String desc)
064    {
065        discoverer.addSubAnnotation(name, desc);
066        return new ModAnnotationVisitor(discoverer, true);
067    }
068    @Override
069    public void visitEnd()
070    {
071        if (array)
072        {
073            discoverer.endArray();
074        }
075        
076        if (isSubAnnotation)
077        {
078            discoverer.endSubAnnotation();
079        }
080    }
081}