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 }