From c8af8fea88e93f36d7643fe70c99b9162ac70857 Mon Sep 17 00:00:00 2001 From: Sergei Vorobyov Date: Wed, 20 Mar 2024 17:32:30 +0100 Subject: [PATCH] [Gradle|Sync] cleanup: use CancellationToken instead of CancellationTokenSource CancellationToken is an abstraction that represents the process cancellation state. But it can't be canceled from the consumer's code. So we need to use the CancellationTokenSource in the controller, and CancellationToken in the process that the controller should control. GitOrigin-RevId: 0b7a17fc72a90db7ea1ee57ee6e045dbedfe953a --- .../GradleBuildActionResultHandler.kt | 2 +- .../execution/GradleExecutionHelper.java | 44 ++++--------------- .../UnsupportedCancellationToken.java | 35 --------------- .../DefaultProjectResolverContext.java | 24 +++++++--- .../project/GradleProjectResolver.java | 8 ++-- .../project/ProjectResolverContext.java | 10 +++-- .../service/task/GradleTaskManager.java | 14 +++--- .../KotlinDslScriptModelProcessor.kt | 12 ++--- 8 files changed, 49 insertions(+), 100 deletions(-) delete mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/UnsupportedCancellationToken.java diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/buildActionRunner/GradleBuildActionResultHandler.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/buildActionRunner/GradleBuildActionResultHandler.kt index 60706fe8bd71..c63a31ab29bb 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/buildActionRunner/GradleBuildActionResultHandler.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/buildActionRunner/GradleBuildActionResultHandler.kt @@ -62,7 +62,7 @@ class GradleBuildActionResultHandler( onProjectLoaded(state) } catch (e: ProcessCanceledException) { - resolverCtx.cancellationTokenSource.cancel() + resolverCtx.cancel() } } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java index b057cbe76305..442b018045f3 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java @@ -116,7 +116,7 @@ public class GradleExecutionHelper { @Nullable GradleExecutionSettings settings, @Nullable ExternalSystemTaskId taskId, @Nullable ExternalSystemTaskNotificationListener listener, - @Nullable CancellationTokenSource cancellationTokenSource, + @Nullable CancellationToken cancellationToken, @NotNull Function f) { String projectDir; File projectPathFile = new File(projectPath); @@ -132,7 +132,6 @@ public class GradleExecutionHelper { else { projectDir = projectPath; } - CancellationToken cancellationToken = cancellationTokenSource != null ? cancellationTokenSource.token() : null; return withGradleConnection( projectDir, taskId, settings, listener, cancellationToken, connection -> { @@ -326,15 +325,14 @@ public class GradleExecutionHelper { return () -> FileUtil.loadFileOrNull(fileWithPathToProperties); } - @Nullable - public static BuildEnvironment getBuildEnvironment(ProjectResolverContext projectResolverContext) { - CancellationTokenSource cancellationTokenSource = projectResolverContext.getCancellationTokenSource(); - CancellationToken cancellationToken = cancellationTokenSource != null ? cancellationTokenSource.token() : null; - return getBuildEnvironment(projectResolverContext.getConnection(), - projectResolverContext.getExternalSystemTaskId(), - projectResolverContext.getListener(), - cancellationToken, - projectResolverContext.getSettings()); + public static @Nullable BuildEnvironment getBuildEnvironment(@NotNull ProjectResolverContext projectResolverContext) { + return getBuildEnvironment( + projectResolverContext.getConnection(), + projectResolverContext.getExternalSystemTaskId(), + projectResolverContext.getListener(), + projectResolverContext.getCancellationTokenSource().token(), + projectResolverContext.getSettings() + ); } public static void prepare( @@ -763,30 +761,6 @@ public class GradleExecutionHelper { } } - @Nullable - public static GradleVersion getGradleVersion(@NotNull ProjectConnection connection, - @NotNull ExternalSystemTaskId taskId, - @NotNull ExternalSystemTaskNotificationListener listener, - @Nullable CancellationTokenSource cancellationTokenSource) { - final BuildEnvironment buildEnvironment = getBuildEnvironment(connection, taskId, listener, cancellationTokenSource, null); - - GradleVersion gradleVersion = null; - if (buildEnvironment != null) { - gradleVersion = GradleVersion.version(buildEnvironment.getGradle().getGradleVersion()); - } - return gradleVersion; - } - - @Nullable - public static BuildEnvironment getBuildEnvironment(@NotNull ProjectConnection connection, - @NotNull ExternalSystemTaskId taskId, - @NotNull ExternalSystemTaskNotificationListener listener, - @Nullable CancellationTokenSource cancellationTokenSource, - @Nullable GradleExecutionSettings settings) { - CancellationToken cancellationToken = cancellationTokenSource != null ? cancellationTokenSource.token() : null; - return getBuildEnvironment(connection, taskId, listener, cancellationToken, settings); - } - private static @Nullable BuildEnvironment getBuildEnvironment( @NotNull ProjectConnection connection, @NotNull ExternalSystemTaskId taskId, diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/UnsupportedCancellationToken.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/UnsupportedCancellationToken.java deleted file mode 100644 index 02656fde3951..000000000000 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/UnsupportedCancellationToken.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2000-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.gradle.service.execution; - -import com.intellij.openapi.externalSystem.service.execution.NotSupportedException; -import org.gradle.tooling.CancellationToken; -import org.gradle.tooling.CancellationTokenSource; - -/** - * @author Vladislav.Soroka - */ -public class UnsupportedCancellationToken implements CancellationTokenSource { - @Override - public void cancel() { - throw new NotSupportedException("Configured version of Gradle does not support cancellation. \nPlease, use Gradle 2.1 or newer."); - } - - @Override - public CancellationToken token() { - return null; - } -} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/DefaultProjectResolverContext.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/DefaultProjectResolverContext.java index b175c17597b2..3b4064e1dcf6 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/DefaultProjectResolverContext.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/DefaultProjectResolverContext.java @@ -102,6 +102,23 @@ public class DefaultProjectResolverContext extends UserDataHolderBase implements return myCancellationTokenSource; } + @Override + public boolean isCancellationRequested() { + return myCancellationTokenSource.token().isCancellationRequested(); + } + + @Override + public void cancel() { + myCancellationTokenSource.cancel(); + } + + @Override + public void checkCancelled() { + if (isCancellationRequested()) { + throw new ProcessCanceledException(); + } + } + @NotNull @Override public ExternalSystemTaskNotificationListener getListener() { @@ -175,13 +192,6 @@ public class DefaultProjectResolverContext extends UserDataHolderBase implements return getModels().hasModulesWithModel(modelClass); } - @Override - public void checkCancelled() { - if (myCancellationTokenSource.token().isCancellationRequested()) { - throw new ProcessCanceledException(); - } - } - @Override public String getProjectGradleVersion() { if (myProjectGradleVersion == null) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java index 1fc11b56b0ed..b225146829c5 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java @@ -39,6 +39,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import org.gradle.api.ProjectConfigurationException; import org.gradle.tooling.BuildActionFailureException; +import org.gradle.tooling.CancellationToken; import org.gradle.tooling.CancellationTokenSource; import org.gradle.tooling.ProjectConnection; import org.gradle.tooling.model.ProjectModel; @@ -137,7 +138,8 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver extensionsFilter = gradleResolverPolicy != null ? gradleResolverPolicy.getExtensionsFilter() : null; final GradleProjectResolverExtension projectResolverChain = createProjectResolverChain(resolverContext, extensionsFilter); final DataNode projectDataNode = myHelper.execute( - projectPath, settings, syncTaskId, listener, cancellationTokenSource, + projectPath, settings, syncTaskId, listener, cancellationToken, getProjectDataFunction(resolverContext, projectResolverChain, false)); // auto-discover buildSrc projects of the main and included builds diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/ProjectResolverContext.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/ProjectResolverContext.java index 0c4252e2b774..a3c0c28315a8 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/ProjectResolverContext.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/ProjectResolverContext.java @@ -40,9 +40,15 @@ public interface ProjectResolverContext extends UserDataHolderEx { @NotNull ProjectConnection getConnection(); - @Nullable + @NotNull CancellationTokenSource getCancellationTokenSource(); + boolean isCancellationRequested(); + + void cancel(); + + void checkCancelled() throws ProcessCanceledException; + @NotNull ExternalSystemTaskNotificationListener getListener(); @@ -96,8 +102,6 @@ public interface ProjectResolverContext extends UserDataHolderEx { boolean hasModulesWithModel(@NotNull Class modelClass); - void checkCancelled() throws ProcessCanceledException; - @Nullable String getProjectGradleVersion(); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java index d5dc289f7fd8..62041a0ebc71 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java @@ -104,15 +104,15 @@ public class GradleTaskManager implements ExternalSystemTaskManager { - executeTasks(id, tasks, projectPath, effectiveSettings, jvmParametersSetup, listener, connection, cancellationTokenSource); + myHelper.execute(projectPath, effectiveSettings, id, listener, cancellationToken, connection -> { + executeTasks(id, tasks, projectPath, effectiveSettings, jvmParametersSetup, listener, connection, cancellationToken); return null; }); } @@ -128,10 +128,10 @@ public class GradleTaskManager implements ExternalSystemTaskManager ext.onSuccess(id, projectPath)); diff --git a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/importing/KotlinDslScriptModelProcessor.kt b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/importing/KotlinDslScriptModelProcessor.kt index fcdfeeba4402..5ae4c5ea7b34 100644 --- a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/importing/KotlinDslScriptModelProcessor.kt +++ b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/importing/KotlinDslScriptModelProcessor.kt @@ -3,18 +3,16 @@ package org.jetbrains.kotlin.idea.gradleJava.scripting.importing import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId -import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.project.Project import com.intellij.openapi.util.NlsSafe import com.intellij.openapi.util.io.FileUtil.toSystemIndependentName import com.intellij.openapi.vfs.VfsUtil import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel -import org.jetbrains.kotlin.idea.gradleTooling.BrokenKotlinDslScriptsModel -import org.jetbrains.kotlin.idea.gradle.KotlinIdeaGradleBundle -import org.jetbrains.kotlin.idea.gradle.scripting.importing.* +import org.jetbrains.kotlin.idea.gradle.scripting.importing.LOG import org.jetbrains.kotlin.idea.gradleJava.scripting.getGradleScriptInputsStamp import org.jetbrains.kotlin.idea.gradleJava.scripting.roots.GradleBuildRootsManager +import org.jetbrains.kotlin.idea.gradleTooling.BrokenKotlinDslScriptsModel import org.jetbrains.plugins.gradle.model.GradleBuildScriptClasspathModel import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext import java.io.File @@ -71,11 +69,7 @@ fun processScriptModel( it.failed = true } } - resolverCtx.cancellationTokenSource?.cancel() ?: throw ProcessCanceledException( - IllegalStateException(KotlinIdeaGradleBundle.message("title.kotlin.build.script") - + ":\n" - + errors.joinToString("\n") { it.text + "\n" + it.details }) - ) + resolverCtx.cancel() } errors.isEmpty() }