From ce5d8eeff8259f8d2eae75cc9eaf440ddaa2885d Mon Sep 17 00:00:00 2001 From: Skylot Date: Thu, 18 Aug 2022 15:34:23 +0100 Subject: [PATCH] fix: don't inline anonymous in self inner class (#1645) --- .../core/dex/visitors/ProcessAnonymous.java | 4 ++ .../inner/TestAnonymousClass20.java | 39 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass20.java diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java index 5b1b89e0..1b10ac10 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java @@ -222,6 +222,10 @@ public class ProcessAnonymous extends AbstractVisitor { // exclude self usage return null; } + if (ctrUseCls.getTopParentClass().equals(cls)) { + // exclude usage inside inner classes + return null; + } for (MethodNode mth : cls.getMethods()) { if (mth == ctr) { continue; diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass20.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass20.java new file mode 100644 index 00000000..74af5b1d --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass20.java @@ -0,0 +1,39 @@ +package jadx.tests.integration.inner; + +import org.junit.jupiter.api.Test; + +import jadx.api.JadxInternalAccess; +import jadx.api.JavaClass; +import jadx.core.dex.attributes.AType; +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestAnonymousClass20 extends IntegrationTest { + + @SuppressWarnings({ "unused", "checkstyle:TypeName", "Convert2Lambda", "Anonymous2MethodRef" }) + public static class Test$Cls { + public Runnable test() { + return new Runnable() { + @Override + public void run() { + new Test$Cls(); + } + }; + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(Test$Cls.class); + assertThat(cls.get(AType.ANONYMOUS_CLASS)).isNull(); + + JavaClass javaClass = JadxInternalAccess.convertClassNode(jadxDecompiler, cls); + assertThat(javaClass.getTopParentClass()).isEqualTo(javaClass); + + assertThat(cls) + .code() + .containsOne("new TestAnonymousClass20$Test$Cls();"); + } +} -- GitLab