Commit c6f0c89c authored by Skylot's avatar Skylot

core: fix indent for anonymous class

parent 3c84975a
...@@ -184,6 +184,10 @@ public class CodeWriter { ...@@ -184,6 +184,10 @@ public class CodeWriter {
} }
} }
public int length() {
return buf.length();
}
public boolean isEmpty() { public boolean isEmpty() {
return buf.length() == 0; return buf.length() == 0;
} }
......
...@@ -44,7 +44,6 @@ import java.util.HashMap; ...@@ -44,7 +44,6 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -78,16 +77,28 @@ public class InsnGen { ...@@ -78,16 +77,28 @@ public class InsnGen {
return fallback; return fallback;
} }
@Deprecated
public CodeWriter arg(InsnNode insn, int arg) throws CodegenException { public CodeWriter arg(InsnNode insn, int arg) throws CodegenException {
return arg(insn.getArg(arg)); return arg(insn.getArg(arg));
} }
@Deprecated
public CodeWriter arg(InsnArg arg) throws CodegenException { public CodeWriter arg(InsnArg arg) throws CodegenException {
return arg(arg, true); return arg(arg, true);
} }
@Deprecated
public CodeWriter arg(InsnArg arg, boolean wrap) throws CodegenException { public CodeWriter arg(InsnArg arg, boolean wrap) throws CodegenException {
CodeWriter code = new CodeWriter(); CodeWriter code = new CodeWriter();
addArg(code, arg, wrap);
return code;
}
public void addArg(CodeWriter code, InsnArg arg) throws CodegenException {
addArg(code, arg, true);
}
public void addArg(CodeWriter code, InsnArg arg, boolean wrap) throws CodegenException {
if (arg.isRegister()) { if (arg.isRegister()) {
code.add(mgen.makeArgName((RegisterArg) arg)); code.add(mgen.makeArgName((RegisterArg) arg));
} else if (arg.isLiteral()) { } else if (arg.isLiteral()) {
...@@ -100,16 +111,15 @@ public class InsnGen { ...@@ -100,16 +111,15 @@ public class InsnGen {
} else if (arg.isField()) { } else if (arg.isField()) {
FieldArg f = (FieldArg) arg; FieldArg f = (FieldArg) arg;
if (f.isStatic()) { if (f.isStatic()) {
code.add(sfield(f.getField())); code.add(staticField(f.getField()));
} else { } else {
RegisterArg regArg = new RegisterArg(f.getRegNum()); RegisterArg regArg = new RegisterArg(f.getRegNum());
regArg.replaceTypedVar(f); regArg.replaceTypedVar(f);
code.add(ifield(f.getField(), regArg)); instanceField(code, f.getField(), regArg);
} }
} else { } else {
throw new CodegenException("Unknown arg type " + arg); throw new CodegenException("Unknown arg type " + arg);
} }
return code;
} }
public String assignVar(InsnNode insn) throws CodegenException { public String assignVar(InsnNode insn) throws CodegenException {
...@@ -129,32 +139,20 @@ public class InsnGen { ...@@ -129,32 +139,20 @@ public class InsnGen {
return TypeGen.literalToString(arg.getLiteral(), arg.getType()); return TypeGen.literalToString(arg.getLiteral(), arg.getType());
} }
private String ifield(FieldInfo field, InsnArg arg) throws CodegenException { private void instanceField(CodeWriter code, FieldInfo field, InsnArg arg) throws CodegenException {
FieldNode fieldNode = mth.getParentClass().searchField(field); FieldNode fieldNode = mth.getParentClass().searchField(field);
if (fieldNode != null && fieldNode.getAttributes().contains(AttributeFlag.DONT_GENERATE)) { if (fieldNode != null && fieldNode.getAttributes().contains(AttributeFlag.DONT_GENERATE)) {
return ""; return;
} }
String name = field.getName(); int len = code.length();
// TODO: add jadx argument "add this" addArg(code, arg);
// FIXME: check variable names in scope if (code.length() != len) {
if (false && arg.isThis()) { code.add('.');
boolean useShort = true;
List<RegisterArg> args = mth.getArguments(false);
for (RegisterArg param : args) {
String paramName = param.getTypedVar().getName();
if (paramName != null && paramName.equals(name)) {
useShort = false;
}
}
if (useShort) {
return name;
}
} }
CodeWriter argStr = arg(arg); code.add(field.getName());
return argStr.isEmpty() ? name : argStr + "." + name;
} }
protected String sfield(FieldInfo field) { protected String staticField(FieldInfo field) {
String thisClass = mth.getParentClass().getFullName(); String thisClass = mth.getParentClass().getFullName();
ClassInfo declClass = field.getDeclClass(); ClassInfo declClass = field.getDeclClass();
if (thisClass.startsWith(declClass.getFullName())) { if (thisClass.startsWith(declClass.getFullName())) {
...@@ -242,7 +240,7 @@ public class InsnGen { ...@@ -242,7 +240,7 @@ public class InsnGen {
break; break;
case MOVE: case MOVE:
code.add(arg(insn.getArg(0), false)); addArg(code, insn.getArg(0), false);
break; break;
case CHECK_CAST: case CHECK_CAST:
...@@ -254,7 +252,7 @@ public class InsnGen { ...@@ -254,7 +252,7 @@ public class InsnGen {
code.add("("); code.add("(");
code.add(useType(((ArgType) ((IndexInsnNode) insn).getIndex()))); code.add(useType(((ArgType) ((IndexInsnNode) insn).getIndex())));
code.add(") "); code.add(") ");
code.add(arg(insn.getArg(0))); addArg(code, insn.getArg(0), true);
if (wrap) { if (wrap) {
code.add(")"); code.add(")");
} }
...@@ -275,7 +273,8 @@ public class InsnGen { ...@@ -275,7 +273,8 @@ public class InsnGen {
case RETURN: case RETURN:
if (insn.getArgsCount() != 0) { if (insn.getArgsCount() != 0) {
code.add("return ").add(arg(insn.getArg(0), false)); code.add("return ");
addArg(code, insn.getArg(0), false);
} else { } else {
code.add("return"); code.add("return");
} }
...@@ -290,7 +289,8 @@ public class InsnGen { ...@@ -290,7 +289,8 @@ public class InsnGen {
break; break;
case THROW: case THROW:
code.add("throw ").add(arg(insn.getArg(0), true)); code.add("throw ");
addArg(code, insn.getArg(0), true);
break; break;
case CMP_L: case CMP_L:
...@@ -342,31 +342,41 @@ public class InsnGen { ...@@ -342,31 +342,41 @@ public class InsnGen {
break; break;
case AGET: case AGET:
code.add(arg(insn.getArg(0))).add('[').add(arg(insn.getArg(1), false)).add(']'); addArg(code, insn.getArg(0));
code.add('[');
addArg(code, insn.getArg(1), false);
code.add(']');
break; break;
case APUT: case APUT:
code.add(arg(insn, 0)).add('[').add(arg(insn.getArg(1), false)).add("] = ").add(arg(insn.getArg(2), false)); addArg(code, insn.getArg(0));
code.add('[');
addArg(code, insn.getArg(1), false);
code.add("] = ");
addArg(code, insn.getArg(2), false);
break; break;
case IGET: { case IGET: {
FieldInfo fieldInfo = (FieldInfo) ((IndexInsnNode) insn).getIndex(); FieldInfo fieldInfo = (FieldInfo) ((IndexInsnNode) insn).getIndex();
code.add(ifield(fieldInfo, insn.getArg(0))); instanceField(code, fieldInfo, insn.getArg(0));
break; break;
} }
case IPUT: { case IPUT: {
FieldInfo fieldInfo = (FieldInfo) ((IndexInsnNode) insn).getIndex(); FieldInfo fieldInfo = (FieldInfo) ((IndexInsnNode) insn).getIndex();
code.add(ifield(fieldInfo, insn.getArg(1))).add(" = ").add(arg(insn.getArg(0), false)); instanceField(code, fieldInfo, insn.getArg(1));
code.add(" = ");
addArg(code, insn.getArg(0), false);
break; break;
} }
case SGET: case SGET:
code.add(sfield((FieldInfo) ((IndexInsnNode) insn).getIndex())); code.add(staticField((FieldInfo) ((IndexInsnNode) insn).getIndex()));
break; break;
case SPUT: case SPUT:
IndexInsnNode node = (IndexInsnNode) insn; IndexInsnNode node = (IndexInsnNode) insn;
fieldPut(node); fieldPut(node);
code.add(sfield((FieldInfo) node.getIndex())).add(" = ").add(arg(node.getArg(0), false)); code.add(staticField((FieldInfo) node.getIndex())).add(" = ");
addArg(code, node.getArg(0), false);
break; break;
case STR_CONCAT: case STR_CONCAT:
...@@ -552,9 +562,7 @@ public class InsnGen { ...@@ -552,9 +562,7 @@ public class InsnGen {
defCtr.getAttributes().add(AttributeFlag.DONT_GENERATE); defCtr.getAttributes().add(AttributeFlag.DONT_GENERATE);
} }
code.add("new ").add(parent == null ? "Object" : useClass(parent)).add("() "); code.add("new ").add(parent == null ? "Object" : useClass(parent)).add("() ");
code.incIndent(2);
new ClassGen(cls, mgen.getClassGen().getParentGen(), fallback).makeClassBody(code); new ClassGen(cls, mgen.getClassGen().getParentGen(), fallback).makeClassBody(code);
code.decIndent(2);
return; return;
} }
if (insn.isSelf()) { if (insn.isSelf()) {
...@@ -632,9 +640,10 @@ public class InsnGen { ...@@ -632,9 +640,10 @@ public class InsnGen {
InsnArg arg = insn.getArg(i); InsnArg arg = insn.getArg(i);
ArgType origType = originalType.get(origPos); ArgType origType = originalType.get(origPos);
if (!arg.getType().equals(origType)) { if (!arg.getType().equals(origType)) {
code.add('(').add(useType(origType)).add(')').add(arg(arg, true)); code.add('(').add(useType(origType)).add(')');
addArg(code, arg, true);
} else { } else {
code.add(arg(arg, false)); addArg(code, arg, false);
} }
if (i < argsCount - 1) { if (i < argsCount - 1) {
code.add(", "); code.add(", ");
...@@ -645,10 +654,10 @@ public class InsnGen { ...@@ -645,10 +654,10 @@ public class InsnGen {
} else { } else {
code.add('('); code.add('(');
if (k < argsCount) { if (k < argsCount) {
code.add(arg(insn.getArg(k), false)); addArg(code, insn.getArg(k), false);
for (int i = k + 1; i < argsCount; i++) { for (int i = k + 1; i < argsCount; i++) {
code.add(", "); code.add(", ");
code.add(arg(insn.getArg(i), false)); addArg(code, insn.getArg(i), false);
} }
} }
code.add(')'); code.add(')');
...@@ -688,7 +697,7 @@ public class InsnGen { ...@@ -688,7 +697,7 @@ public class InsnGen {
} }
makeInsn(inl, code, IGState.BODY_ONLY); makeInsn(inl, code, IGState.BODY_ONLY);
// revert changes // revert changes
for (Entry<RegisterArg, InsnArg> e : toRevert.entrySet()) { for (Map.Entry<RegisterArg, InsnArg> e : toRevert.entrySet()) {
inl.replaceArg(e.getValue(), e.getKey()); inl.replaceArg(e.getValue(), e.getKey());
} }
} }
......
...@@ -183,7 +183,9 @@ public class RegionGen extends InsnGen { ...@@ -183,7 +183,9 @@ public class RegionGen extends InsnGen {
} }
private void makeSynchronizedRegion(SynchronizedRegion cont, CodeWriter code) throws CodegenException { private void makeSynchronizedRegion(SynchronizedRegion cont, CodeWriter code) throws CodegenException {
code.startLine("synchronized(").add(arg(cont.getInsn().getArg(0))).add(") {"); code.startLine("synchronized (");
addArg(code, cont.getInsn().getArg(0));
code.add(") {");
makeRegionIndent(code, cont.getRegion()); makeRegionIndent(code, cont.getRegion());
code.startLine('}'); code.startLine('}');
} }
...@@ -191,7 +193,9 @@ public class RegionGen extends InsnGen { ...@@ -191,7 +193,9 @@ public class RegionGen extends InsnGen {
private CodeWriter makeSwitch(SwitchRegion sw, CodeWriter code) throws CodegenException { private CodeWriter makeSwitch(SwitchRegion sw, CodeWriter code) throws CodegenException {
SwitchNode insn = (SwitchNode) sw.getHeader().getInstructions().get(0); SwitchNode insn = (SwitchNode) sw.getHeader().getInstructions().get(0);
InsnArg arg = insn.getArg(0); InsnArg arg = insn.getArg(0);
code.startLine("switch(").add(arg(arg)).add(") {"); code.startLine("switch (");
addArg(code, arg);
code.add(") {");
int size = sw.getKeys().size(); int size = sw.getKeys().size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
...@@ -200,7 +204,7 @@ public class RegionGen extends InsnGen { ...@@ -200,7 +204,7 @@ public class RegionGen extends InsnGen {
for (Object k : keys) { for (Object k : keys) {
code.startLine("case "); code.startLine("case ");
if (k instanceof IndexInsnNode) { if (k instanceof IndexInsnNode) {
code.add(sfield((FieldInfo) ((IndexInsnNode) k).getIndex())); code.add(staticField((FieldInfo) ((IndexInsnNode) k).getIndex()));
} else { } else {
code.add(TypeGen.literalToString((Integer) k, arg.getType())); code.add(TypeGen.literalToString((Integer) k, arg.getType()));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment