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 }