}
sd.drawDefault(" ");
sd.drawField(f.getName());
ConstantPoolInfo constant = f.getConstant();
if (constant != null) {
sd.drawDefault(" = ");
drawConstant(sd, constant);
}
sd.drawDefault(";");
} else if (er instanceof DeprecatedAnnotationDefRow) {
sd.drawIndent();
sd.drawAnnotation("@Deprecated");
} else if (er instanceof ClassAnnotationDefRow || er instanceof MethodAnnotationDefRow || er instanceof FieldAnnotationDefRow) {
Annotation ann = null;
if (er instanceof ClassAnnotationDefRow) {
ann = ((ClassAnnotationDefRow)er).getAnnotation();
} else if (er instanceof MethodAnnotationDefRow) {
sd.drawIndent();
ann = ((MethodAnnotationDefRow)er).getAnnotation();
} else {
sd.drawIndent();
ann = ((FieldAnnotationDefRow)er).getAnnotation();
}
sd.drawAnnotation("@" + ia.getShortName(ann.getName()));
if (ann.getElementValueCount() > 0) {
sd.drawDefault("(");
Map<String, ElementValue> elementValues = ann.getElementValues();
boolean first = true;
for (Entry<String, ElementValue> entry : elementValues.entrySet()) {
if (!first) {
sd.drawDefault(", ");
} else {
first = false;
}
if (entry.getKey().equals("value") && elementValues.size() == 1) {
// only one element, named "value", don't show the display name, just show the value
} else {
sd.drawDefault(entry.getKey() + "=");
}
ElementValue ev = entry.getValue();
drawElementValue(sd, ev, ia);
}
sd.drawDefault(")");
}
} else if (er instanceof MethodDefRow) {
MethodDefRow mdr = (MethodDefRow)er;
sd.drawIndent();
if (mdr.isClosing()) {
sd.drawDefault("}");
} else {
Method m = mdr.getMethod();
MethodSignature methodSig = null;
boolean displayGenerics = SystemFacade.getInstance().getPreferences().isSettingTrue(Settings.DISPLAY_GENERICS);
if (displayGenerics) {
SignatureAttribute signature = m.getAttributes().getSignatureAttribute();
if (signature != null) {
methodSig = Signatures.getMethodSignature(signature.getSignatureString());
}
}
String access = m.getAccessString();
if (access.length() > 0) {
sd.drawKeyword(access + " ");
}
if (methodSig != null) {
List<FormalTypeParameter> typeParams = methodSig.getFormalTypeParameters();
renderFormalTypeParameters(sd, ia, typeParams);
if (typeParams != null && typeParams.size() > 0) {
sd.drawKeyword(" ");
}
}
JavaType ret = m.getDescriptor().getReturn();
if (methodSig == null) {
if (ret.isPrimitive()) {
sd.drawKeyword(ret.getType());
} else {
sd.drawDefault(ia.getShortName(ret.getType()));
}
sd.drawDefault(ret.getDimensions());
} else {
renderGenericJavaType(sd, ia, methodSig.getReturnType());
}
sd.drawDefault(" ");
if (m.isDeprecated()) {
sd.drawDefaultOverstrike(m.getName());
} else {
sd.drawDefault(m.getName());
}
CodeAttribute ca = m.getAttributes().getCode();
LocalVariableTableAttribute lvs = null;
if (ca != null) {
lvs = ca.getAttributes().getLocalVariableTable();
}
int paramLVDefOffset = 0;
if (!AccessFlags.isStatic(m.getAccessFlags())) {
paramLVDefOffset = 1;
}
sd.drawDefault("(");
List<JavaType> params = m.getDescriptor().getParamList();
List<GenericJavaType> genParams = null;
if (methodSig != null) {
genParams = methodSig.getParameters();
}
boolean displayVarargs = SystemFacade.getInstance().getPreferences().isSettingTrue(Settings.DISPLAY_VARARGS);
for (int i = 0; i < params.size(); i++) {
if (i > 0) {
sd.drawDefault(", ");
}
JavaType item = params.get(i);
// last time, method has varargs flag and type is a one dimensional array
boolean isLastItem = (i == params.size()-1);
if (displayVarargs
&& isLastItem
&& AccessFlags.isVarArgs(m.getAccessFlags())
&& (item.getDimensionCount() > 0)) {
item.dropDimension();
if (methodSig == null) {
if (item.isPrimitive()) {
sd.drawKeyword(item.getType());
} else {
sd.drawDefault(ia.getShortName(item.getType()));
}
sd.drawDefault(item.getDimensions());
} else {
GenericJavaType genType = genParams.get(i);
genType.getBaseType().dropDimension();
renderGenericJavaType(sd, ia, genType);
}
sd.drawDefault(" ... ");
LocalVariable lv = null;
if (lvs != null) {
lv = lvs.getLocalVariable(paramLVDefOffset + i, 0);
}
if (lv != null) {
sd.drawDefault(lv.getName());
} else {
sd.drawDefault("p" + i);
}
} else {
if (methodSig == null) {
if (item.isPrimitive()) {
sd.drawKeyword(item.getType());
} else {
sd.drawDefault(ia.getShortName(item.getType()));
}
sd.drawDefault(item.getDimensions());
} else {
renderGenericJavaType(sd, ia, genParams.get(i));
}
sd.drawDefault(" ");
LocalVariable lv = null;
if (lvs != null) {
lv = lvs.getLocalVariable(paramLVDefOffset + i, 0);
}
if (lv != null) {
sd.drawDefault(lv.getName());
} else {
sd.drawDefault("p" + i);
}
}
}
sd.drawDefault(")");
List exc = m.getExceptions();
for (int i = 0; i < exc.size(); i++) {
if (i == 0) {
sd.drawKeyword(" throws ");
} else {
sd.drawDefault(", ");
}
sd.drawDefault(ia.getShortName(((ExceptionDescriptor) exc.get(i)).getName()));
}
if (mdr.hasBody()) {
sd.drawDefault(" {");
} else {
sd.drawDefault(";");
}
}
} else if (er instanceof LocalVariableDefRow) {
LocalVariableDefRow lvdr = (LocalVariableDefRow)er;
LocalVariable lv = lvdr.getLocalVariable();
JavaType ret = lv.getDescriptor().getReturn();
sd.drawIndent();
sd.drawIndent();
if (ret.isPrimitive()) {
sd.drawKeyword(ret.getType());
} else {
sd.drawDefault(ia.getShortName(ret.getType()));
}
sd.drawDefault(ret.getDimensions() + " " + lv.getName() + " (#" + lv.getIndex() + " " + lv.getStartPc() + " - " + lv.getEndPc() + ")");
} else if (er instanceof LabelRow) {
LabelRow lr = (LabelRow)er;
sd.drawIndent();
sd.drawIndent();
sd.drawDefault(lr.getLabel().getId() + ":");
} else if (er instanceof CodeRow) {
CodeRow cr = (CodeRow)er;
// execution row
if (cr.isExecutionRow()) {
sd.setExecutionBackground();
}
// breakpoint
if (cr.getBreakpoint() != null) {
sd.drawBreakpoint();
}
// line identifier
LineIdentifierMode mode = EditorFacade.getInstance().getLineIdentifierMode();
switch (mode.getMode()) {
case LineIdentifierMode.MODE_OFF:
break;
case LineIdentifierMode.MODE_PC:
sd.drawSmall(String.valueOf(cr.getPosition()), 15);
break;
case LineIdentifierMode.MODE_SOURCELINE:
if (cr.hasLineNumber()) {
sd.drawSmall(String.valueOf(cr.getLineNumber()), 0);
}
break;
}
sd.setOffset(0);
Instruction inst = cr.getInstruction();
DecompilationContext dc = cr.getDecompilationContext();
LocalVariableTableAttribute lvs = dc.getLocalVariableTable();
ConstantPool pool = dc.getConstantPool();
sd.drawIndent();
sd.drawIndent();
sd.drawInstruction(inst.getMnemonic());
Parameters params = inst.getParameters();
for (int i = 0; i < params.getCount(); i++) {
try {
switch (params.getType(i)) {
case TYPE_LOCAL_VARIABLE:
case TYPE_LOCAL_VARIABLE_WIDE:
case TYPE_LOCAL_VARIABLE_READONLY:
if (lvs == null) {
sd.drawDefault(" " + params.getInt(i));
} else {
LocalVariable lv = lvs.getLocalVariable(params.getInt(i), cr.getPosition());
if (lv == null) {
sd.drawDefault(" " + params.getInt(i));
} else {
sd.drawDefault(" " + lv.getName());
}
}
break;
case TYPE_CONSTANT_POOL_METHOD_REF: {
int index = params.getInt(i);
ConstantPoolInfo cpi = pool.get(index);
renderMethodRef(sd, ia, (RefInfo) cpi, index);
break;
}
case TYPE_CONSTANT_POOL_FIELD_REF: {
int index = params.getInt(i);
ConstantPoolInfo cpi = pool.get(index);
renderFieldRef(sd, ia, (RefInfo) cpi, index);
break;
}
case TYPE_CONSTANT_POOL_CLASS: {
int index = params.getInt(i);
ConstantPoolInfo cpi = pool.get(index);
renderClassRef(sd, ia, (ClassInfo) cpi, index);
break;
}
case TYPE_CONSTANT_POOL_CONSTANT: {
int index = params.getInt(i);
ConstantPoolInfo cpi = pool.get(index);
renderConstant(sd, cpi, index);
break;
}
case TYPE_LABEL: {
Label label = (Label) params.getObject(i);