package jef.accelerator.asm.commons;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import jef.accelerator.asm.AnnotationVisitor;
import jef.tools.Assert;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class AnnotationDef extends AnnotationVisitor{
private boolean end=false;
public AnnotationDef(int api,String desc) {
super(api);
this.desc=desc;
}
protected boolean visible;
protected String desc;
protected Map<String,Object> attrs=new HashMap<String,Object>();
protected List<String[]> enums=new ArrayList<String[]>();
protected Multimap<String,AnnotationDef> annotations=ArrayListMultimap.create();
protected Map<String,AnnotationDef> arrays=new HashMap<String,AnnotationDef>();
@Override
public void visit(String name, Object value) {
attrs.put(name, value);
}
@Override
public void visitEnum(String name, String desc, String value) {
this.enums.add(new String[]{name,desc,value});
}
@Override
public AnnotationVisitor visitAnnotation(String name, String desc) {
AnnotationDef ann=new AnnotationDef(api,desc);
annotations.put(name, ann);
return ann;
}
@Override
public AnnotationVisitor visitArray(String name) {
AnnotationDef ann=new AnnotationDef(api,name);
arrays.put(name, ann);
return ann;
}
@Override
public void visitEnd() {
end=true;
}
public void inject(AnnotationVisitor to){
Assert.isTrue(end);
for(Entry<String,Object> e:attrs.entrySet()){
to.visit(e.getKey(), e.getValue());
}
for(String[] enu:enums){
to.visitEnum(enu[0], enu[1], enu[2]);
}
for(Entry<String,AnnotationDef> e: annotations.entries()){
AnnotationVisitor too=to.visitAnnotation(e.getKey(), e.getValue().desc);
e.getValue().inject(too);
}
for(Map.Entry<String, AnnotationDef> e: arrays.entrySet()){
AnnotationVisitor too=to.visitArray(e.getKey());
e.getValue().inject(too);
}
to.visitEnd();
}
public boolean isEnd() {
return end;
}
}