// that instead
classFile.minor = header.getDefaultClassMinorVersion(); // TODO if
// classVersionMinor[] use
// that instead
// build constant pool
ClassConstantPool cp = classFile.pool;
String fullName = classBands.getClassThis()[classNum];
// SourceFile attribute
int i = fullName.lastIndexOf("/") + 1; // if lastIndexOf==-1, then
// -1+1=0, so str.substring(0)
// == str
AttributeLayout SOURCE_FILE = attrDefinitionBands.getAttributeDefinitionMap()
.getAttributeLayout(AttributeLayout.ATTRIBUTE_SOURCE_FILE,
AttributeLayout.CONTEXT_CLASS);
if (SOURCE_FILE.matches(classBands.getClassFlags()[classNum])) {
int firstDollar = SegmentUtils.indexOfFirstDollar(fullName);
String fileName = null;
if(firstDollar > -1 && (i <= firstDollar)) {
fileName = fullName.substring(i, firstDollar) + ".java";
} else {
fileName = fullName.substring(i) + ".java";
}
classFile.attributes = new Attribute[] { (Attribute) cp
.add(new SourceFileAttribute(fileName)) };
} else {
classFile.attributes = new Attribute[] {};
}
// this/superclass
ClassFileEntry cfThis = cp.add(new CPClass(fullName));
ClassFileEntry cfSuper = cp.add(new CPClass(classBands.getClassSuper()[classNum]));
// add interfaces
ClassFileEntry cfInterfaces[] = new ClassFileEntry[classBands.getClassInterfaces()[classNum].length];
for (i = 0; i < cfInterfaces.length; i++) {
cfInterfaces[i] = cp.add(new CPClass(classBands.getClassInterfaces()[classNum][i]));
}
// add fields
ClassFileEntry cfFields[] = new ClassFileEntry[classBands.getClassFieldCount()[classNum]];
// fieldDescr and fieldFlags used to create this
for (i = 0; i < cfFields.length; i++) {
cfFields[i] = cp.add(new CPField(classBands.getFieldDescr()[classNum][i],
classBands.getFieldFlags()[classNum][i], classBands.getFieldAttributes()[classNum][i]));
}
// add methods
ClassFileEntry cfMethods[] = new ClassFileEntry[classBands.getClassMethodCount()[classNum]];
// fieldDescr and fieldFlags used to create this
for (i = 0; i < cfMethods.length; i++) {
cfMethods[i] = cp.add(new CPMethod(classBands.getMethodDescr()[classNum][i],
classBands.getMethodFlags()[classNum][i], classBands.getMethodAttributes()[classNum][i]));
}
// add inner class attribute (if required)
boolean addInnerClassesAttr = false;
IcTuple[] ic_local = getClassBands().getIcLocal()[classNum];
boolean ic_local_sent = false;
if(ic_local != null) {
ic_local_sent = true;
}
InnerClassesAttribute innerClassesAttribute = new InnerClassesAttribute("InnerClasses");
IcTuple[] ic_relevant = getIcBands().getRelevantIcTuples(fullName, cp);
IcTuple[] ic_stored = computeIcStored(ic_local, ic_relevant);
for(int index = 0; index < ic_stored.length; index++) {
String innerClassString = ic_stored[index].thisClassString();
String outerClassString = ic_stored[index].outerClassString();
String simpleClassName = ic_stored[index].simpleClassName();
CPClass innerClass = null;
CPUTF8 innerName = null;
CPClass outerClass = null;
if(ic_stored[index].isAnonymous()) {
innerClass = new CPClass(innerClassString);
} else {
innerClass = new CPClass(innerClassString);
innerName = new CPUTF8(simpleClassName, ClassConstantPool.DOMAIN_ATTRIBUTEASCIIZ);
}
if(ic_stored[index].isMember()) {
outerClass = new CPClass(outerClassString);
}
int flags = ic_stored[index].F;
innerClassesAttribute.addInnerClassesEntry(innerClass, outerClass, innerName, flags);
addInnerClassesAttr = true;
}
// If ic_local is sent and it's empty, don't add
// the inner classes attribute.
if(ic_local_sent && (ic_local.length == 0)) {
addInnerClassesAttr = false;
}
// If ic_local is not sent and ic_relevant is empty,
// don't add the inner class attribute.
if(!ic_local_sent && (ic_relevant.length == 0)) {
addInnerClassesAttr = false;
}
if(addInnerClassesAttr) {
// Need to add the InnerClasses attribute to the
// existing classFile attributes.
Attribute[] originalAttrs = classFile.attributes;
Attribute[] newAttrs = new Attribute[originalAttrs.length + 1];
for(int index=0; index < originalAttrs.length; index++) {
newAttrs[index] = originalAttrs[index];
}
newAttrs[newAttrs.length - 1] = innerClassesAttribute;
classFile.attributes = newAttrs;
cp.add(innerClassesAttribute);
}
// sort CP according to cp_All
cp.resolve(this);
// print out entries
debug("Constant pool looks like:");
for (i = 1; i <= cp.size(); i++) {
debug(String.valueOf(i) + ":" + String.valueOf(cp.get(i)));
}
// NOTE the indexOf is only valid after the cp.resolve()
// build up remainder of file
classFile.accessFlags = (int) classBands.getClassFlags()[classNum];
classFile.thisClass = cp.indexOf(cfThis);
classFile.superClass = cp.indexOf(cfSuper);
// TODO placate format of file for writing purposes
classFile.interfaces = new int[cfInterfaces.length];
for (i = 0; i < cfInterfaces.length; i++) {
classFile.interfaces[i] = cp.indexOf(cfInterfaces[i]);
}
classFile.fields = cfFields;
classFile.methods = cfMethods;
return classFile;
}