diff --git a/recaf-core/src/main/java/software/coley/recaf/services/search/SearchFeedback.java b/recaf-core/src/main/java/software/coley/recaf/services/search/SearchFeedback.java index 806fda61d..f51d1195b 100644 --- a/recaf-core/src/main/java/software/coley/recaf/services/search/SearchFeedback.java +++ b/recaf-core/src/main/java/software/coley/recaf/services/search/SearchFeedback.java @@ -3,6 +3,8 @@ import jakarta.annotation.Nonnull; import software.coley.recaf.info.ClassInfo; import software.coley.recaf.info.FileInfo; +import software.coley.recaf.services.search.result.Result; +import software.coley.recaf.services.search.result.Results; /** * Outline of search feedback capabilities. Allows for: @@ -49,4 +51,15 @@ default boolean doVisitClass(@Nonnull ClassInfo cls) { default boolean doVisitFile(@Nonnull FileInfo file) { return true; } + + /** + * @param result + * Result to consider. + * + * @return {@code true} to accept the result into the final {@link Results} collection. + * {@code false} to drop it. + */ + default boolean doAcceptResult(@Nonnull Result result) { + return true; + } } diff --git a/recaf-core/src/main/java/software/coley/recaf/services/search/SearchService.java b/recaf-core/src/main/java/software/coley/recaf/services/search/SearchService.java index d96cf58ec..b9bb37ba0 100644 --- a/recaf-core/src/main/java/software/coley/recaf/services/search/SearchService.java +++ b/recaf-core/src/main/java/software/coley/recaf/services/search/SearchService.java @@ -1,6 +1,7 @@ package software.coley.recaf.services.search; import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import software.coley.recaf.info.AndroidClassInfo; @@ -131,7 +132,7 @@ public Results search(@Nonnull Workspace workspace, @Nonnull List queries service.submit(() -> { if (feedback.hasRequestedStop()) return; - androidClassVisitor.visit((path, value) -> results.add(createResult(path, value)), classPath, classInfo); + androidClassVisitor.visit(getResultSink(results, feedback), classPath, classInfo); }); } } @@ -150,7 +151,7 @@ public Results search(@Nonnull Workspace workspace, @Nonnull List queries service.submit(() -> { if (feedback.hasRequestedStop()) return; - jvmClassVisitor.visit((path, value) -> results.add(createResult(path, value)), classPath, classInfo); + jvmClassVisitor.visit(getResultSink(results, feedback), classPath, classInfo); }); } }); @@ -169,7 +170,7 @@ public Results search(@Nonnull Workspace workspace, @Nonnull List queries service.submit(() -> { if (feedback.hasRequestedStop()) return; - fileVisitor.visit((path, value) -> results.add(createResult(path, value)), filePath, fileInfo); + fileVisitor.visit(getResultSink(results, feedback), filePath, fileInfo); }); } } @@ -179,6 +180,15 @@ public Results search(@Nonnull Workspace workspace, @Nonnull List queries return results; } + @Nonnull + private static ResultSink getResultSink(@Nonnull Results results, @Nullable SearchFeedback feedback) { + return (path, value) -> { + Result result = createResult(path, value); + if (feedback == null || feedback.doAcceptResult(result)) + results.add(result); + }; + } + @Nonnull private static Result createResult(@Nonnull PathNode path, @Nonnull Object value) { if (value instanceof Number)