From 008216d599019481985122c909befc1d48d0981f Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 30 Mar 2019 20:50:12 +0300 Subject: [PATCH] fix: don't cast overloaded methods with generics from other class (#448) --- .../main/java/jadx/core/codegen/InsnGen.java | 4 ++ .../invoke/TestSuperInvokeWithGenerics.java | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvokeWithGenerics.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 b8ffe3ba5..46fee61d2 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -733,6 +733,10 @@ public class InsnGen { origType = callMth.getMethodInfo().getArgumentsTypes().get(origPos); } else { origType = arguments.get(origPos).getInitType(); + if (origType.isGenericType() && !callMth.getParentClass().equals(mth.getParentClass())) { + // cancel cast + return false; + } } if (!arg.getType().equals(origType)) { code.add('('); diff --git a/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvokeWithGenerics.java b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvokeWithGenerics.java new file mode 100644 index 000000000..a5747f007 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/invoke/TestSuperInvokeWithGenerics.java @@ -0,0 +1,45 @@ +package jadx.tests.integration.invoke; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.anyOf; + +public class TestSuperInvokeWithGenerics extends IntegrationTest { + + public static class TestCls { + + public class A { + public A(T t) { + System.out.println("t" + t); + } + + public A(V v) { + System.out.println("v" + v); + } + } + + public class B extends A { + public B(String s) { + super(s); + } + + public B(Exception e) { + super(e); + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("super(e);")); + assertThat(code, containsOne("super(s);")); + } +}