diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java index 9a3f1a7b3..2726b83db 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java @@ -25,6 +25,7 @@ import jadx.core.dex.regions.SwitchRegion; import jadx.core.dex.regions.SynchronizedRegion; import jadx.core.dex.regions.loops.LoopRegion; import jadx.core.dex.visitors.AbstractVisitor; +import jadx.core.dex.visitors.shrink.CodeShrinkVisitor; import jadx.core.utils.InsnRemover; import jadx.core.utils.RegionUtils; import jadx.core.utils.exceptions.JadxException; @@ -58,6 +59,8 @@ public class RegionMakerVisitor extends AbstractVisitor { } private static void postProcessRegions(MethodNode mth) { + processForceInlineInsns(mth); + // make try-catch regions ProcessTryCatchRegions.process(mth); @@ -70,6 +73,15 @@ public class RegionMakerVisitor extends AbstractVisitor { } } + private static void processForceInlineInsns(MethodNode mth) { + boolean needShrink = mth.getBasicBlocks().stream() + .flatMap(block -> block.getInstructions().stream()) + .anyMatch(insn -> insn.contains(AFlag.FORCE_ASSIGN_INLINE)); + if (needShrink) { + CodeShrinkVisitor.shrinkMethod(mth); + } + } + private static final class PostRegionVisitor extends AbstractRegionVisitor { @Override public void leaveRegion(MethodNode mth, IRegion region) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions19.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestInnerAssign.java similarity index 95% rename from jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions19.java rename to jadx-core/src/test/java/jadx/tests/integration/conditions/TestInnerAssign.java index f14fc5026..888081c0f 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestConditions19.java +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestInnerAssign.java @@ -9,7 +9,7 @@ import static jadx.tests.api.utils.JadxMatchers.containsOne; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -public class TestConditions19 extends IntegrationTest { +public class TestInnerAssign extends IntegrationTest { public static class TestCls { private String result; diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestInnerAssign2.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestInnerAssign2.java new file mode 100644 index 000000000..88b3afc50 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestInnerAssign2.java @@ -0,0 +1,47 @@ +package jadx.tests.integration.conditions; + +import org.junit.jupiter.api.Test; + +import jadx.tests.api.IntegrationTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestInnerAssign2 extends IntegrationTest { + + public static class TestCls { + private String field; + private String swapField; + + @SuppressWarnings("checkstyle:InnerAssignment") + public boolean test(String str) { + String sub; + return call(str) || ((sub = this.field) != null && sub.isEmpty()); + } + + private boolean call(String str) { + this.field = swapField; + return str.isEmpty(); + } + + public boolean testWrap(String str, String fieldValue) { + this.field = null; + this.swapField = fieldValue; + return test(str); + } + + public void check() { + assertThat(testWrap("", null)).isTrue(); + assertThat(testWrap("a", "")).isTrue(); + assertThat(testWrap("b", null)).isFalse(); + assertThat(testWrap("c", "d")).isFalse(); + } + } + + @Test + public void test() { + assertThat(getClassNode(TestCls.class)) + .code() + .containsOne("sub = this.field") + .containsOne("return call(str) || ((sub = this.field) != null && sub.isEmpty());"); + } +}