[kotlin] fix gist instantiating for GradleBuildRootDataSerializer

GitOrigin-RevId: ee0ad4e3be2346879d56ac706d3e41c8e43b0e87
This commit is contained in:
Vlad Koshkin
2024-06-17 19:24:40 +00:00
committed by intellij-monorepo-bot
parent b4e950e883
commit 5684d033e0
2 changed files with 19 additions and 10 deletions

View File

@@ -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<VirtualFile> = 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<GradleBuildRootData> {
inner class Externalizer: DataExternalizer<GradleBuildRootData> {
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

View File

@@ -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)
}
}