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    }