    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 java.util.ArrayList;
    016import java.util.Map;
    017
    018import org.objectweb.asm.Type;
    019
    020import com.google.common.base.Objects;
    021import com.google.common.collect.Lists;
    022import com.google.common.collect.Maps;
    023
    024import cpw.mods.fml.common.discovery.asm.ASMModParser.AnnotationType;
    025
    026public class ModAnnotation
    027{
    028    public class EnumHolder
    029    {
    030
    031        private String desc;
    032        private String value;
    033
    034        public EnumHolder(String desc, String value)
    035        {
    036            this.desc = desc;
    037            this.value = value;
    038        }
    039
    040    }
    041    AnnotationType type;
    042    Type asmType;
    043    String member;
    044    Map<String,Object> values = Maps.newHashMap();
    045    private ArrayList<Object> arrayList;
    046    private Object array;
    047    private String arrayName;
    048    private ModAnnotation parent;
    049    public ModAnnotation(AnnotationType type, Type asmType, String member)
    050    {
    051        this.type = type;
    052        this.asmType = asmType;
    053        this.member = member;
    054    }
    055
    056    public ModAnnotation(AnnotationType type, Type asmType, ModAnnotation parent)
    057    {
    058        this.type = type;
    059        this.asmType = asmType;
    060        this.parent = parent;
    061    }
    062    @Override
    063    public String toString()
    064    {
    065        return Objects.toStringHelper("Annotation")
    066                .add("type",type)
    067                .add("name",asmType.getClassName())
    068                .add("member",member)
    069                .add("values", values)
    070                .toString();
    071    }
    072    public AnnotationType getType()
    073    {
    074        return type;
    075    }
    076    public Type getASMType()
    077    {
    078        return asmType;
    079    }
    080    public String getMember()
    081    {
    082        return member;
    083    }
    084    public Map<String, Object> getValues()
    085    {
    086        return values;
    087    }
    088    public void addArray(String name)
    089    {
    090        this.arrayList = Lists.newArrayList();
    091        this.arrayName = name;
    092    }
    093    public void addProperty(String key, Object value)
    094    {
    095        if (this.arrayList != null)
    096        {
    097            arrayList.add(value);
    098        }
    099        else
    100        {
    101            values.put(key, value);
    102        }
    103    }
    104
    105    public void addEnumProperty(String key, String enumName, String value)
    106    {
    107        values.put(key, new EnumHolder(enumName, value));
    108    }
    109
    110    public void endArray()
    111    {
    112        values.put(arrayName, arrayList);
    113        arrayList = null;
    114    }
    115    public ModAnnotation addChildAnnotation(String name, String desc)
    116    {
    117        return new ModAnnotation(AnnotationType.SUBTYPE, Type.getType(desc), this);
    118    }
    119}