feat: add partial region visitor with result return

This commit is contained in:
Skylot
2026-04-14 20:59:02 +01:00
parent 869422b424
commit 169ad2901f
2 changed files with 42 additions and 0 deletions
@@ -31,6 +31,14 @@ public class DepthRegionTraversal {
traverseInternal(mth, visitor, container);
}
public static <R> @Nullable R traversePartial(MethodNode mth, IRegionPartialVisitor<R> visitor) {
return traversePartialInternal(mth, visitor, mth.getRegion());
}
public static <R> @Nullable R traversePartial(MethodNode mth, IContainer container, IRegionPartialVisitor<R> visitor) {
return traversePartialInternal(mth, visitor, container);
}
public static void traverseIterative(MethodNode mth, IRegionIterativeVisitor visitor) {
boolean repeat;
int k = 0;
@@ -95,6 +103,24 @@ public class DepthRegionTraversal {
}
}
private static <R> @Nullable R traversePartialInternal(MethodNode mth, IRegionPartialVisitor<R> visitor, IContainer startContainer) {
List<IContainer> stack = new ArrayList<>();
stack.add(startContainer);
while (true) {
IContainer current = ListUtils.removeLast(stack);
if (current == null) {
return null;
}
R result = visitor.visit(mth, current);
if (result != null) {
return result;
}
if (current instanceof IRegion) {
addSubBlocksToStack(stack, (IRegion) current);
}
}
}
private static void addSubBlocksToStack(List<IContainer> stack, IRegion region) {
List<IContainer> subBlocks = region.getSubBlocks();
// add in reverse order to keep original order during visit
@@ -0,0 +1,16 @@
package jadx.core.dex.visitors.regions;
import org.jetbrains.annotations.Nullable;
import jadx.core.dex.nodes.IContainer;
import jadx.core.dex.nodes.MethodNode;
public interface IRegionPartialVisitor<R> {
/**
* Visit all containers in region until stopped
*
* @return non-null value to stop visiting
*/
@Nullable
R visit(MethodNode mth, IContainer container);
}