package immibis.bon;
import immibis.bon.org.objectweb.asm.tree.ClassNode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class ClassCollection implements Cloneable {
public ClassCollection(NameSet nameSet, Collection<ClassNode> classes) {
this.nameSet = nameSet;
this.classes.addAll(classes);
}
private NameSet nameSet;
private Collection<ClassNode> classes = new ArrayList<>();
private Map<String, byte[]> extraFiles = new HashMap<>();
public Collection<ClassNode> getAllClasses() {
return classes;
}
public NameSet getNameSet() {
return nameSet;
}
@Override
public ClassCollection clone() {
try {
ClassCollection clone = (ClassCollection)super.clone();
clone.classes = new ArrayList<>();
for(ClassNode ocn : classes) {
// clone the ClassNode
ClassNode ncn = new ClassNode();
ocn.accept(ncn);
clone.classes.add(ncn);
}
// copy map, but don't copy data
clone.extraFiles = new HashMap<>(extraFiles);
return clone;
} catch(CloneNotSupportedException e) {
throw new RuntimeException("This can't happen", e);
}
}
public ClassCollection cloneWithNameSet(NameSet newNS) {
ClassCollection rv = clone();
rv.nameSet = newNS;
return rv;
}
public Map<String, ClassNode> getClassMap() {
Map<String, ClassNode> rv = new HashMap<String, ClassNode>();
for(ClassNode cn : classes)
rv.put(cn.name, cn);
return rv;
}
public Map<String, byte[]> getExtraFiles() {
return extraFiles;
}
}