From 78b39a60e8d2d2d8048cac327c5a771efe7ac9d6 Mon Sep 17 00:00:00 2001 From: Skylot Date: Mon, 11 May 2015 20:33:16 +0300 Subject: [PATCH] core: fixed invoke arguments list (fix #61) --- .../main/java/jadx/core/codegen/InsnGen.java | 4 +- .../invoke/TestConstructorInvoke.java | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/invoke/TestConstructorInvoke.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 117e5a23f..d0c07388d 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -640,6 +640,7 @@ public class InsnGen { } int argsCount = insn.getArgsCount(); code.add('('); + boolean firstArg = true; if (k < argsCount) { boolean overloaded = callMth != null && callMth.isArgsOverload(); for (int i = k; i < argsCount; i++) { @@ -651,7 +652,7 @@ public class InsnGen { if (callArg != null && callArg.contains(AFlag.SKIP_ARG)) { continue; } - if (i != k) { + if (!firstArg) { code.add(", "); } boolean cast = overloaded && processOverloadedArg(code, callMth, arg, i - startArgNum); @@ -659,6 +660,7 @@ public class InsnGen { continue; } addArg(code, arg, false); + firstArg = false; } } code.add(')'); diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestConstructorInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestConstructorInvoke.java new file mode 100644 index 000000000..32eaa919e --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestConstructorInvoke.java @@ -0,0 +1,37 @@ +package jadx.tests.integration.invoke; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import org.junit.Test; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertThat; + +public class TestConstructorInvoke extends IntegrationTest { + + public class TestCls { + void test(String root, String name) { + ViewHolder viewHolder = new ViewHolder(root, name); + } + + private final class ViewHolder { + private int mElements = 0; + private final String mRoot; + private String mName; + + private ViewHolder(String root, String name) { + this.mRoot = root; + this.mName = name; + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestConstructorInvoke.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString("new ViewHolder(root, name);")); + } +}