From eb6d145dcafd2a03f00aca8e9af8d0a4312513cc Mon Sep 17 00:00:00 2001 From: Skylot Date: Mon, 3 Mar 2014 22:36:38 +0400 Subject: [PATCH] core: fix indent for anonymous classes --- .../main/java/jadx/core/codegen/InsnGen.java | 19 ++++--- .../test/java/jadx/api/InternalJadxTest.java | 9 +++ .../internal/inner/TestAnonymousClass3.java | 55 +++++++++++++++++++ 3 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/internal/inner/TestAnonymousClass3.java diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index 2c135ffd3..1c75b2398 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -95,6 +95,14 @@ public class InsnGen { return code; } + public void addArgDot(CodeWriter code, InsnArg arg) throws CodegenException { + int len = code.length(); + addArg(code, arg, true); + if (len != code.length()) { + code.add('.'); + } + } + public void addArg(CodeWriter code, InsnArg arg) throws CodegenException { addArg(code, arg, true); } @@ -152,11 +160,7 @@ public class InsnGen { return; } } - int len = code.length(); - addArg(code, arg); - if (code.length() != len) { - code.add('.'); - } + addArgDot(code, arg); code.add(field.getName()); } @@ -609,10 +613,7 @@ public class InsnGen { InsnArg arg = insn.getArg(0); // FIXME: add 'this' for equals methods in scope if (!arg.isThis()) { - CodeWriter argStr = arg(arg); - if (!argStr.isEmpty()) { - code.add(argStr).add('.'); - } + addArgDot(code, arg); } k++; break; diff --git a/jadx-core/src/test/java/jadx/api/InternalJadxTest.java b/jadx-core/src/test/java/jadx/api/InternalJadxTest.java index 09f1b9f94..6e6d4a4b6 100644 --- a/jadx-core/src/test/java/jadx/api/InternalJadxTest.java +++ b/jadx-core/src/test/java/jadx/api/InternalJadxTest.java @@ -1,6 +1,7 @@ package jadx.api; import jadx.core.Jadx; +import jadx.core.codegen.CodeWriter; import jadx.core.dex.attributes.AttributeFlag; import jadx.core.dex.nodes.ClassNode; import jadx.core.dex.nodes.MethodNode; @@ -149,6 +150,14 @@ public abstract class InternalJadxTest { } } + protected String makeIndent(int indent) { + StringBuilder sb = new StringBuilder(indent * CodeWriter.INDENT.length()); + for (int i = 0; i < indent; i++) { + sb.append(CodeWriter.INDENT); + } + return sb.toString(); + } + // Use only for debug purpose @Deprecated protected void setOutputCFG() { diff --git a/jadx-core/src/test/java/jadx/tests/internal/inner/TestAnonymousClass3.java b/jadx-core/src/test/java/jadx/tests/internal/inner/TestAnonymousClass3.java new file mode 100644 index 000000000..8cc893669 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/inner/TestAnonymousClass3.java @@ -0,0 +1,55 @@ +package jadx.tests.internal.inner; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + +public class TestAnonymousClass3 extends InternalJadxTest { + + public static class TestCls { + public static class Inner { + private int f; + private double d; + + public void test() { + new Thread() { + @Override + public void run() { + int a = f--; + p(a); + + f += 2; + f *= 2; + + a = ++f; + p(a); + + d /= 3; + } + + public void p(int a) { + } + }.start(); + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + System.out.println(code); + + assertThat(code, containsString(makeIndent(4) + "public void run() {")); + assertThat(code, containsString(makeIndent(3) + "}.start();")); + +// assertThat(code, not(containsString("synthetic"))); +// assertThat(code, not(containsString("AnonymousClass_"))); + +// assertThat(code, containsString("a = f--;")); + } +}