package minijvm.print;
import minijvm.constant.ClassInfo;
import minijvm.constant.ConstantInfo.Visitor;
import minijvm.constant.FieldRefInfo;
import minijvm.constant.MethodRefInfo;
import minijvm.constant.NameAndTypeInfo;
import minijvm.constant.StringInfo;
import minijvm.constant.UTF8Info;
public class JavapPrintVisitor implements Visitor{
private int index = 1;
@Override
public void visitClassInfo(ClassInfo info) {
StringBuilder builder = new StringBuilder();
builder.append(getThisIndexOfPrefix(index++))
.append(getMid("Class"))
.append("#" + info.getUtf8Index());
System.out.println(builder.toString());
}
@Override
public void visitFieldRef(FieldRefInfo info) {
StringBuilder builder = new StringBuilder();
builder.append(getThisIndexOfPrefix(index++))
.append(getMid("Fieldref"))
.append("#" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex());
System.out.println(builder.toString());
}
@Override
public void visitMethodRef(MethodRefInfo info) {
StringBuilder builder = new StringBuilder();
builder.append(getThisIndexOfPrefix(index++))
.append(getMid("Methodref"))
.append("#" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex());
System.out.println(builder.toString());
}
@Override
public void visitNameAndType(NameAndTypeInfo info) {
StringBuilder builder = new StringBuilder();
builder.append(getThisIndexOfPrefix(index++))
.append(getMid("NameAndType"))
.append("#" + info.getIndex1() + ":#" + info.getIndex2());
System.out.println(builder.toString());
}
@Override
public void visitString(StringInfo info) {
StringBuilder builder = new StringBuilder();
builder.append(getThisIndexOfPrefix(index++))
.append(getMid("String"))
.append("#" + info.getIndex());
System.out.println(builder.toString());
}
@Override
public void visistUTF8(UTF8Info info) {
StringBuilder builder = new StringBuilder();
builder.append(getThisIndexOfPrefix(index++))
.append(getMid("Utf8"))
.append(info.getValue());
System.out.println(builder.toString());
}
private String getThisIndexOfPrefix(int index) {
if (index < 1) {
throw new IllegalArgumentException("错误的索引");
}
if (index < 10) {
return " #" + index + " = ";
} else if (index < 100) {
return " #" + index + " = ";
} else if (index < 1000) {
return " #" + index + " = ";
} else {
throw new IllegalArgumentException("还没有实现" + index + "个常量的打印");
}
}
private String getMid(String type) {
if (type.length() >= 19) {
return type;
}
String str = " ";
int length = type.length();
return type + str.substring(length);
}
}