From cd5f782c15655a6734cb28245f3287c69e45813f Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 28 Jan 2025 18:15:37 +0100 Subject: [PATCH] replace `QueryWrapper` with non-parameterized `QueryExecutionInterceptor` GitOrigin-RevId: 04bb5d6da9c0fa11bbb7251a3500d5d89b93d000 --- platform/core-api/api-dump-experimental.txt | 4 ++++ .../src/com/intellij/util/ExecutorsQuery.java | 18 +++++++++++++++++- .../core-api/src/com/intellij/util/Query.java | 19 ++++++++++++++++++- .../util/QueryExecutionInterceptor.kt | 13 +++++++++++++ .../src/com/intellij/util/QueryExecutor.java | 5 ++++- .../src/com/intellij/util/QueryWrapper.java | 8 +++++++- 6 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 platform/core-api/src/com/intellij/util/QueryExecutionInterceptor.kt diff --git a/platform/core-api/api-dump-experimental.txt b/platform/core-api/api-dump-experimental.txt index 484467ceb9a3..439bb2e5ebbe 100644 --- a/platform/core-api/api-dump-experimental.txt +++ b/platform/core-api/api-dump-experimental.txt @@ -441,6 +441,7 @@ f:com.intellij.util.CoroutinesKt - *bs:awaitCancellationAndInvoke$default(kotlinx.coroutines.CoroutineScope,kotlin.coroutines.CoroutineContext,kotlin.jvm.functions.Function2,I,java.lang.Object):V f:com.intellij.util.ExecutorsQuery - com.intellij.util.AbstractQuery +- *:interceptWith(com.intellij.util.QueryExecutionInterceptor):com.intellij.util.Query - *:wrap(com.intellij.util.QueryWrapper):com.intellij.util.Query *a:com.intellij.util.PerformanceAssertions - *sf:Companion:com.intellij.util.PerformanceAssertions$Companion @@ -453,9 +454,12 @@ com.intellij.util.Query - java.lang.Iterable - *:filtering(java.util.function.Predicate):com.intellij.util.Query - *:flatMapping(java.util.function.Function):com.intellij.util.Query +- *:interceptWith(com.intellij.util.QueryExecutionInterceptor):com.intellij.util.Query - *:mapping(java.util.function.Function):com.intellij.util.Query - *:transforming(java.util.function.Function):com.intellij.util.Query - *:wrap(com.intellij.util.QueryWrapper):com.intellij.util.Query +*:com.intellij.util.QueryExecutionInterceptor +- a:intercept(kotlin.jvm.functions.Function0):Z com.intellij.util.QueryExecutor - *:wrap(com.intellij.util.QueryWrapper):com.intellij.util.QueryExecutor *:com.intellij.util.QueryWrapper diff --git a/platform/core-api/src/com/intellij/util/ExecutorsQuery.java b/platform/core-api/src/com/intellij/util/ExecutorsQuery.java index e37215850574..f505065c16b1 100644 --- a/platform/core-api/src/com/intellij/util/ExecutorsQuery.java +++ b/platform/core-api/src/com/intellij/util/ExecutorsQuery.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.util; import com.intellij.openapi.diagnostic.Logger; @@ -7,6 +7,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.ApiStatus.Experimental; +import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -44,9 +45,24 @@ public final class ExecutorsQuery extends AbstractQuery wrap(@NotNull QueryWrapper wrapper) { return new ExecutorsQuery<>(myParameters, ContainerUtil.map(myExecutors, e -> e.wrap(wrapper))); } + + @Experimental + @Override + public @NotNull Query interceptWith(@NotNull QueryExecutionInterceptor interceptor) { + return new ExecutorsQuery<>(myParameters, ContainerUtil.map(myExecutors, e -> interceptWith(e, interceptor))); + } + + private static QueryExecutor interceptWith(QueryExecutor executor, QueryExecutionInterceptor interceptor) { + return (parameters, consumer) -> { + return interceptor.intercept(() -> executor.execute(parameters, consumer)); + }; + } } diff --git a/platform/core-api/src/com/intellij/util/Query.java b/platform/core-api/src/com/intellij/util/Query.java index 68823ec80c89..0f4d6b609eef 100644 --- a/platform/core-api/src/com/intellij/util/Query.java +++ b/platform/core-api/src/com/intellij/util/Query.java @@ -1,9 +1,10 @@ -// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.util; import com.intellij.concurrency.AsyncFuture; import com.intellij.concurrency.AsyncUtil; import org.jetbrains.annotations.ApiStatus.Experimental; +import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -127,6 +128,22 @@ public interface Query extends Iterable { return findAll().iterator(); } + @Experimental + default @NotNull Query interceptWith(@NotNull QueryExecutionInterceptor interceptor) { + Query query = this; + return new AbstractQuery() { + @Override + protected boolean processResults(@NotNull Processor consumer) { + return interceptor.intercept(() -> delegateProcessResults(query, consumer)); + } + }; + } + + /** + * @deprecated use {@link #interceptWith} + */ + @ScheduledForRemoval + @Deprecated @Experimental default @NotNull Query wrap(@NotNull QueryWrapper wrapper) { Query query = this; diff --git a/platform/core-api/src/com/intellij/util/QueryExecutionInterceptor.kt b/platform/core-api/src/com/intellij/util/QueryExecutionInterceptor.kt new file mode 100644 index 000000000000..202486b9f296 --- /dev/null +++ b/platform/core-api/src/com/intellij/util/QueryExecutionInterceptor.kt @@ -0,0 +1,13 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.util + +import org.jetbrains.annotations.ApiStatus.Experimental + +@Experimental +fun interface QueryExecutionInterceptor { + + /** + * Implementation is expected to call [invocation] and return its value. + */ + fun intercept(invocation: () -> Boolean): Boolean +} diff --git a/platform/core-api/src/com/intellij/util/QueryExecutor.java b/platform/core-api/src/com/intellij/util/QueryExecutor.java index afbe7b688ab3..7692a66dbefc 100644 --- a/platform/core-api/src/com/intellij/util/QueryExecutor.java +++ b/platform/core-api/src/com/intellij/util/QueryExecutor.java @@ -1,7 +1,8 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.util; import org.jetbrains.annotations.ApiStatus.Experimental; +import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; import org.jetbrains.annotations.NotNull; /** @@ -21,6 +22,8 @@ public interface QueryExecutor { */ boolean execute(@NotNull Param queryParameters, @NotNull Processor consumer); + @ScheduledForRemoval + @Deprecated @Experimental default @NotNull QueryExecutor wrap(@NotNull QueryWrapper wrapper) { return (queryParameters, consumer) -> wrapper.wrapExecution(c -> execute(queryParameters, c), consumer); diff --git a/platform/core-api/src/com/intellij/util/QueryWrapper.java b/platform/core-api/src/com/intellij/util/QueryWrapper.java index 6901895e2e53..ede59b969cb0 100644 --- a/platform/core-api/src/com/intellij/util/QueryWrapper.java +++ b/platform/core-api/src/com/intellij/util/QueryWrapper.java @@ -1,9 +1,15 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.util; import org.jetbrains.annotations.ApiStatus.Experimental; +import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; import org.jetbrains.annotations.NotNull; +/** + * @deprecated use {@link QueryExecutionInterceptor} + */ +@ScheduledForRemoval +@Deprecated @Experimental @FunctionalInterface public interface QueryWrapper {