From 4c952328540a79f6f5636ccb2ce20da6e99210db Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Sat, 30 Sep 2023 21:35:25 +0530 Subject: [PATCH] fix(tooling-api): reuse GradleConnector whenever possible --- .../tooling/impl/ToolingApiServerImpl.kt | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt index 3ddb80d87..b0508a6b3 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt @@ -50,6 +50,7 @@ import org.gradle.tooling.BuildException import org.gradle.tooling.CancellationTokenSource import org.gradle.tooling.GradleConnectionException import org.gradle.tooling.GradleConnector +import org.gradle.tooling.ProjectConnection import org.gradle.tooling.UnsupportedVersionException import org.gradle.tooling.exceptions.UnsupportedBuildArgumentException import org.gradle.tooling.exceptions.UnsupportedOperationConfigurationException @@ -68,16 +69,14 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : private var initialized = false private var client: IToolingApiClient? = null private var connector: GradleConnector? = null + private var lastInitParams: InitializeProjectParams? = null private var buildCancellationToken: CancellationTokenSource? = null private val log = ILogger.newInstance(javaClass.simpleName) override fun initialize(params: InitializeProjectParams): CompletableFuture { return CompletableFuture.supplyAsync { try { - if (initialized && connector != null) { - connector?.disconnect() - connector = null - } + log.debug("Got initialize request", params) Main.checkGradleWrapper() @@ -85,15 +84,24 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : cancelCurrentBuild().get() } - log.debug("Got initialize request", params) val stopWatch = StopWatch("Connection to project") - this.connector = GradleConnector.newConnector().forProjectDirectory(File(params.directory)) - setupConnectorForGradleInstallation(this.connector!!, params.gradleDistribution) - stopWatch.lap("Connector created") - if (this.connector == null) { - throw IllegalStateException( - "Unable to create gradle connector for project directory: ${params.directory}") + if (connector != null && params == lastInitParams) { + log.info("Project is being reinitialized. Reusing connector instance...") + } else { + // a new project is being initialized + // or the project is being initialized with different parameters + connector?.disconnect() + + connector = GradleConnector.newConnector().forProjectDirectory(File(params.directory)) + setupConnectorForGradleInstallation(this.connector!!, params.gradleDistribution) + stopWatch.lap("Connector created") + } + + lastInitParams = params + + checkNotNull(connector) { + "Unable to create gradle connector for project directory: ${params.directory}" } notifyBeforeBuild(BuildInfo(emptyList()))