From 5684d033e0c7bf9d649f3dd99cd3e6d65d6ea2ad Mon Sep 17 00:00:00 2001 From: Vlad Koshkin Date: Mon, 17 Jun 2024 19:24:40 +0000 Subject: [PATCH] [kotlin] fix gist instantiating for GradleBuildRootDataSerializer GitOrigin-RevId: ee0ad4e3be2346879d56ac706d3e41c8e43b0e87 --- .../roots/GradleBuildRootDataSerializer.kt | 19 ++++++++++++++----- .../roots/GradleBuildRootsManager.kt | 10 +++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootDataSerializer.kt b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootDataSerializer.kt index 565b20828246..75b5a1d47097 100644 --- a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootDataSerializer.kt +++ b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootDataSerializer.kt @@ -2,6 +2,8 @@ package org.jetbrains.kotlin.idea.gradleJava.scripting.roots +import com.intellij.openapi.components.Service +import com.intellij.openapi.components.service import com.intellij.openapi.util.IntellijInternalApi import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.gist.storage.GistStorage @@ -17,20 +19,22 @@ import java.io.DataOutput private const val BINARY_FORMAT_VERSION = 1 private const val NO_TRACK_GIST_STAMP = 0 -internal object GradleBuildRootDataSerializer { +@Service(Service.Level.APP) +class GradleBuildRootDataSerializer { private val currentBuildRoot: ThreadLocal = ThreadLocal() - private fun newGist() = GistStorage.getInstance().newGist("GradleBuildRootData", BINARY_FORMAT_VERSION, Externalizer) + private val buildRootDataGist = + GistStorage.getInstance().newGist("GradleBuildRootData", BINARY_FORMAT_VERSION, Externalizer()) fun read(buildRoot: VirtualFile): GradleBuildRootData? { currentBuildRoot.set(buildRoot) - return newGist().getGlobalData(buildRoot, NO_TRACK_GIST_STAMP).data() + return buildRootDataGist.getGlobalData(buildRoot, NO_TRACK_GIST_STAMP).data() } fun write(buildRoot: VirtualFile, data: GradleBuildRootData?) { currentBuildRoot.set(buildRoot) // putGlobalData calls Externalizer.read - newGist().putGlobalData(buildRoot, data, NO_TRACK_GIST_STAMP) + buildRootDataGist.putGlobalData(buildRoot, data, NO_TRACK_GIST_STAMP) } fun remove(buildRoot: VirtualFile) { @@ -38,13 +42,18 @@ internal object GradleBuildRootDataSerializer { LastModifiedFiles.remove(buildRoot) } - private object Externalizer: DataExternalizer { + inner class Externalizer: DataExternalizer { override fun save(out: DataOutput, value: GradleBuildRootData) = writeKotlinDslScriptModels(out, value) override fun read(`in`: DataInput): GradleBuildRootData = readKotlinDslScriptModels(`in`, currentBuildRoot.get().path) } + + companion object { + @JvmStatic + fun getInstance(): GradleBuildRootDataSerializer = service() + } } @IntellijInternalApi diff --git a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootsManager.kt b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootsManager.kt index ee6622e6f63c..03b4251d240d 100644 --- a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootsManager.kt +++ b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/scripting/roots/GradleBuildRootsManager.kt @@ -3,8 +3,8 @@ package org.jetbrains.kotlin.idea.gradleJava.scripting.roots import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer -import com.intellij.openapi.application.ReadAction import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.diagnostic.ControlFlowException import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.progress.util.BackgroundTaskUtil @@ -186,7 +186,7 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(pr val newRoot = tryCreateImportedRoot(sync.workingDir, LastModifiedFiles()) { mergedData } ?: return null val buildRootDir = newRoot.dir ?: return null - GradleBuildRootDataSerializer.write(buildRootDir, mergedData) + GradleBuildRootDataSerializer.getInstance().write(buildRootDir, mergedData) newRoot.saveLastModifiedFiles() return newRoot @@ -309,7 +309,7 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(pr private fun tryLoadFromFsCache(settings: GradleProjectSettings, version: String): Imported? { return tryCreateImportedRoot(settings.externalProjectPath) { - GradleBuildRootDataSerializer.read(it)?.let { data -> + GradleBuildRootDataSerializer.getInstance().read(it)?.let { data -> val gradleHome = data.gradleHome if (gradleHome.isNotBlank() && GradleInstallationManager.getGradleVersion(gradleHome) != version) return@let null @@ -335,7 +335,7 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(pr return Imported(externalProjectPath, data, lastModifiedFiles) } catch (e: Exception) { when (e) { - is ReadAction.CannotReadException -> scriptingDebugLog { "tryCreateImportedRoot cancelled" } + is ControlFlowException -> throw e else -> scriptingErrorLog("Cannot load script configurations from file attributes for $externalProjectPath", e) } return null @@ -367,7 +367,7 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(pr private fun removeData(rootPath: String) { val buildRoot = LocalFileSystem.getInstance().findFileByPath(rootPath) if (buildRoot != null) { - GradleBuildRootDataSerializer.remove(buildRoot) + GradleBuildRootDataSerializer.getInstance().remove(buildRoot) LastModifiedFiles.remove(buildRoot) } }