From fdffe20c46d37ed4278f2e713eaa8504d41757c1 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 21 Oct 2023 23:07:40 +0100 Subject: [PATCH] fix(gui): another try to fix code search --- .../src/main/java/jadx/core/ProcessClass.java | 1 - .../gui/search/providers/BaseSearchProvider.java | 10 ++++++++++ .../gui/search/providers/ClassSearchProvider.java | 12 +----------- .../gui/search/providers/CodeSearchProvider.java | 12 +++++++----- .../gui/search/providers/FieldSearchProvider.java | 15 ++++++++------- .../search/providers/MethodSearchProvider.java | 2 +- 6 files changed, 27 insertions(+), 25 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/ProcessClass.java b/jadx-core/src/main/java/jadx/core/ProcessClass.java index 0394b1db3..2d042e9d5 100644 --- a/jadx-core/src/main/java/jadx/core/ProcessClass.java +++ b/jadx-core/src/main/java/jadx/core/ProcessClass.java @@ -104,7 +104,6 @@ public class ProcessClass { try { if (cls.contains(AFlag.DONT_GENERATE)) { process(cls, false); - LOG.warn("Requested code for class with DONT_GENERATE flag: {}", cls); return NOT_GENERATED; } for (ClassNode depCls : cls.getDependencies()) { diff --git a/jadx-gui/src/main/java/jadx/gui/search/providers/BaseSearchProvider.java b/jadx-gui/src/main/java/jadx/gui/search/providers/BaseSearchProvider.java index f0ae473e0..6ed549535 100644 --- a/jadx-gui/src/main/java/jadx/gui/search/providers/BaseSearchProvider.java +++ b/jadx-gui/src/main/java/jadx/gui/search/providers/BaseSearchProvider.java @@ -1,9 +1,12 @@ package jadx.gui.search.providers; import java.util.List; +import java.util.Objects; +import jadx.api.JadxDecompiler; import jadx.api.JavaClass; import jadx.api.JavaNode; +import jadx.core.dex.nodes.ICodeNode; import jadx.gui.search.ISearchMethod; import jadx.gui.search.ISearchProvider; import jadx.gui.search.SearchSettings; @@ -15,12 +18,14 @@ import jadx.gui.utils.JNodeCache; public abstract class BaseSearchProvider implements ISearchProvider { private final JNodeCache nodeCache; + private final JadxDecompiler decompiler; protected final ISearchMethod searchMth; protected final String searchStr; protected final List classes; public BaseSearchProvider(MainWindow mw, SearchSettings searchSettings, List classes) { this.nodeCache = mw.getCacheObject().getNodeCache(); + this.decompiler = mw.getWrapper().getDecompiler(); this.searchMth = searchSettings.getSearchMethod(); this.searchStr = searchSettings.getSearchString(); this.classes = classes; @@ -38,6 +43,11 @@ public abstract class BaseSearchProvider implements ISearchProvider { return nodeCache.makeFrom(cls); } + protected JNode convert(ICodeNode codeNode) { + JavaNode node = Objects.requireNonNull(decompiler.getJavaNodeByRef(codeNode)); + return Objects.requireNonNull(nodeCache.makeFrom(node)); + } + @Override public int total() { return classes.size(); diff --git a/jadx-gui/src/main/java/jadx/gui/search/providers/ClassSearchProvider.java b/jadx-gui/src/main/java/jadx/gui/search/providers/ClassSearchProvider.java index ad1fef777..269e28484 100644 --- a/jadx-gui/src/main/java/jadx/gui/search/providers/ClassSearchProvider.java +++ b/jadx-gui/src/main/java/jadx/gui/search/providers/ClassSearchProvider.java @@ -1,7 +1,6 @@ package jadx.gui.search.providers; import java.util.List; -import java.util.stream.Collectors; import org.jetbrains.annotations.Nullable; @@ -17,16 +16,7 @@ public final class ClassSearchProvider extends BaseSearchProvider { private int clsNum = 0; public ClassSearchProvider(MainWindow mw, SearchSettings searchSettings, List classes) { - super(mw, searchSettings, filterClasses(classes)); - } - - /** - * Collect top class with code - */ - private static List filterClasses(List classes) { - return classes.stream() - .filter(cls -> !cls.isInner() && !cls.isNoCode()) - .collect(Collectors.toList()); + super(mw, searchSettings, classes); } @Override diff --git a/jadx-gui/src/main/java/jadx/gui/search/providers/CodeSearchProvider.java b/jadx-gui/src/main/java/jadx/gui/search/providers/CodeSearchProvider.java index 0bcda5826..aa96c51fb 100644 --- a/jadx-gui/src/main/java/jadx/gui/search/providers/CodeSearchProvider.java +++ b/jadx-gui/src/main/java/jadx/gui/search/providers/CodeSearchProvider.java @@ -45,12 +45,14 @@ public final class CodeSearchProvider extends BaseSearchProvider { return null; } JavaClass cls = classes.get(clsNum); - if (!cls.getClassNode().isInner()) { - if (code == null) { - code = getClassCode(cls, codeCache); - } - JNode newResult = searchNext(cls, code); + String clsCode = code; + if (clsCode == null && !cls.isInner() && !cls.isNoCode()) { + clsCode = getClassCode(cls, codeCache); + } + if (clsCode != null) { + JNode newResult = searchNext(cls, clsCode); if (newResult != null) { + code = clsCode; return newResult; } } diff --git a/jadx-gui/src/main/java/jadx/gui/search/providers/FieldSearchProvider.java b/jadx-gui/src/main/java/jadx/gui/search/providers/FieldSearchProvider.java index b97757807..b41b5c4c0 100644 --- a/jadx-gui/src/main/java/jadx/gui/search/providers/FieldSearchProvider.java +++ b/jadx-gui/src/main/java/jadx/gui/search/providers/FieldSearchProvider.java @@ -5,8 +5,8 @@ import java.util.List; import org.jetbrains.annotations.Nullable; import jadx.api.JavaClass; -import jadx.api.JavaField; import jadx.core.dex.info.FieldInfo; +import jadx.core.dex.nodes.FieldNode; import jadx.gui.jobs.Cancelable; import jadx.gui.search.SearchSettings; import jadx.gui.treemodel.JNode; @@ -28,10 +28,10 @@ public final class FieldSearchProvider extends BaseSearchProvider { return null; } JavaClass cls = classes.get(clsNum); - List fields = cls.getFields(); + List fields = cls.getClassNode().getFields(); if (fldNum < fields.size()) { - JavaField fld = fields.get(fldNum++); - if (checkField(fld)) { + FieldNode fld = fields.get(fldNum++); + if (checkField(fld.getFieldInfo())) { return convert(fld); } } else { @@ -44,9 +44,10 @@ public final class FieldSearchProvider extends BaseSearchProvider { } } - private boolean checkField(JavaField field) { - FieldInfo fieldInfo = field.getFieldNode().getFieldInfo(); - return isMatch(fieldInfo.getName()) || isMatch(fieldInfo.getAlias()); + private boolean checkField(FieldInfo fieldInfo) { + return isMatch(fieldInfo.getName()) + || isMatch(fieldInfo.getAlias()) + || isMatch(fieldInfo.getFullId()); } @Override diff --git a/jadx-gui/src/main/java/jadx/gui/search/providers/MethodSearchProvider.java b/jadx-gui/src/main/java/jadx/gui/search/providers/MethodSearchProvider.java index ef1954619..06bc70cf5 100644 --- a/jadx-gui/src/main/java/jadx/gui/search/providers/MethodSearchProvider.java +++ b/jadx-gui/src/main/java/jadx/gui/search/providers/MethodSearchProvider.java @@ -32,7 +32,7 @@ public final class MethodSearchProvider extends BaseSearchProvider { if (mthNum < methods.size()) { MethodNode mth = methods.get(mthNum++); if (checkMth(mth.getMethodInfo())) { - return convert(mth.getJavaNode()); + return convert(mth); } } else { clsNum++;