From 63c003a02d058f2c07dbf1af05c5fa8277570b83 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 2 Mar 2014 23:34:56 +0400 Subject: [PATCH] core: fix generic types for local variables --- .../typeresolver/finish/PostTypeResolver.java | 10 +++- .../internal/generics/TestGenerics2.java | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/internal/generics/TestGenerics2.java diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/finish/PostTypeResolver.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/finish/PostTypeResolver.java index b6847220..baa86b91 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/finish/PostTypeResolver.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/finish/PostTypeResolver.java @@ -7,6 +7,7 @@ import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.LiteralArg; import jadx.core.dex.instructions.args.RegisterArg; +import jadx.core.dex.instructions.args.TypedVar; import jadx.core.dex.nodes.InsnNode; import jadx.core.dex.nodes.MethodNode; @@ -88,8 +89,13 @@ public class PostTypeResolver { case CHECK_CAST: { ArgType castType = (ArgType) ((IndexInsnNode) insn).getIndex(); - // workaround for compiler bug (see TestDuplicateCast) - insn.getResult().getTypedVar().forceSetType(castType); + TypedVar typedVar = insn.getResult().getTypedVar(); + // don't override generic types of same base class + boolean skip = castType.isObject() && castType.getObject().equals(typedVar.getType().getObject()); + if (!skip) { + // workaround for compiler bug (see TestDuplicateCast) + typedVar.forceSetType(castType); + } return true; } diff --git a/jadx-core/src/test/java/jadx/tests/internal/generics/TestGenerics2.java b/jadx-core/src/test/java/jadx/tests/internal/generics/TestGenerics2.java new file mode 100644 index 00000000..841a6e78 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/generics/TestGenerics2.java @@ -0,0 +1,48 @@ +package jadx.tests.internal.generics; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; +import java.util.Map; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + +public class TestGenerics2 extends InternalJadxTest { + + public static class TestCls { + private static class ItemReference extends WeakReference { + private Object id; + + public ItemReference(V item, Object id, ReferenceQueue queue) { + super(item, queue); + this.id = id; + } + } + + public static class ItemReferences { + private Map> items; + + public V get(Object id) { + WeakReference ref = this.items.get(id); + return (ref != null) ? ref.get() : null; + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + System.out.println(code); + + assertThat(code, containsString("public ItemReference(V item, Object id, ReferenceQueue queue) {")); + assertThat(code, containsString("public V get(Object id) {")); + assertThat(code, containsString("WeakReference ref = ")); + assertThat(code, containsString("return (ref != null) ? ref.get() : null;")); + } +} -- GitLab