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 8af4385f8..516d1cf9d 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -694,7 +694,7 @@ public class InsnGen { * Add additional cast for overloaded method argument. */ private boolean processOverloadedArg(CodeWriter code, MethodNode callMth, InsnArg arg, int origPos) { - ArgType origType = callMth.getMethodInfo().getArgumentsTypes().get(origPos); + ArgType origType = callMth.getArguments(false).get(origPos).getInitType(); if (!arg.getType().equals(origType)) { code.add('('); useType(code, origType); diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke.java new file mode 100644 index 000000000..bbb65e347 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke.java @@ -0,0 +1,54 @@ +package jadx.tests.integration.invoke; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.junit.Assert.assertThat; + +public class TestCastInOverloadedInvoke extends IntegrationTest { + + public static class TestCls { + + public void test() { + call(new ArrayList<>()); + call((List) new ArrayList()); + } + + public void test2(Object obj) { + if (obj instanceof String) { + call((String) obj); + } + } + + public void call(String str) { + } + + public void call(List list) { + } + + public void call(ArrayList list) { + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + +// TODO: implement more checks for casts in overloaded methods +// assertThat(code, containsOne("call(new ArrayList<>());")); + assertThat(code, containsOne("call((ArrayList) new ArrayList());")); + +// TODO: fix generics in constructors +// assertThat(code, containsOne("call((List) new ArrayList());")); + assertThat(code, containsOne("call((List) new ArrayList());")); + + assertThat(code, containsOne("call((String) obj);")); + } +}