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