From fd9b14ed29ecfc2aec801adc237eb4b8704ae307 Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Fri, 29 May 2020 12:51:30 +0300 Subject: [PATCH] GradleBuildRoot: require LastModifiedFiles explicitly --- .../scripting/gradle/roots/GradleBuildRoot.kt | 64 +++++++------------ .../gradle/roots/GradleBuildRootsManager.kt | 21 +++--- .../AbstractGradleBuildRootsLocatorTest.kt | 8 +-- 3 files changed, 40 insertions(+), 53 deletions(-) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRoot.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRoot.kt index 039077e5ae6..4870394668a 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRoot.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRoot.kt @@ -17,10 +17,6 @@ import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource import org.jetbrains.plugins.gradle.settings.GradleProjectSettings import java.io.File -@set:TestOnly -@get:TestOnly -internal var skipLastModifiedFilesLoading = false - /** * [GradleBuildRoot] is a linked gradle build (don't confuse with gradle project and included build). * Each [GradleBuildRoot] may have it's own Gradle version, Java home and other settings. @@ -29,7 +25,7 @@ internal var skipLastModifiedFilesLoading = false * * See [GradleBuildRootsManager] for more details. */ -sealed class GradleBuildRoot { +sealed class GradleBuildRoot(private val lastModifiedFiles: LastModifiedFiles) { @Volatile var importing = false @@ -40,18 +36,6 @@ sealed class GradleBuildRoot { val dir: VirtualFile? get() = LocalFileSystem.getInstance().findFileByPath(pathPrefix) - private lateinit var lastModifiedFiles: LastModifiedFiles - - fun loadLastModifiedFiles() { - val loaded = if (!skipLastModifiedFilesLoading) { - val dir = dir - if (dir != null) LastModifiedFiles.read(dir) - else null - } else null - - lastModifiedFiles = loaded ?: LastModifiedFiles() - } - fun saveLastModifiedFiles() { LastModifiedFiles.write(dir ?: return, lastModifiedFiles) } @@ -64,36 +48,29 @@ sealed class GradleBuildRoot { } } -sealed class WithoutScriptModels(settings: GradleProjectSettings) : GradleBuildRoot() { +sealed class WithoutScriptModels( + settings: GradleProjectSettings, + lastModifiedFiles: LastModifiedFiles +) : GradleBuildRoot(lastModifiedFiles) { final override val pathPrefix = settings.externalProjectPath!! final override val projectRoots = settings.modules.takeIf { it.isNotEmpty() } ?: listOf(pathPrefix) - - init { - loadLastModifiedFiles() - } } /** * Gradle build with old Gradle version (<6.0) */ class Legacy( - settings: GradleProjectSettings -) : WithoutScriptModels(settings) { - init { - loadLastModifiedFiles() - } -} + settings: GradleProjectSettings, + lastModifiedFiles: LastModifiedFiles = settings.loadLastModifiedFiles() ?: LastModifiedFiles() +) : WithoutScriptModels(settings, lastModifiedFiles) /** * Linked but not yet imported Gradle build. */ class New( - settings: GradleProjectSettings -) : WithoutScriptModels(settings) { - init { - loadLastModifiedFiles() - } -} + settings: GradleProjectSettings, + lastModifiedFiles: LastModifiedFiles = settings.loadLastModifiedFiles() ?: LastModifiedFiles() +) : WithoutScriptModels(settings, lastModifiedFiles) /** * Imported Gradle build. @@ -102,15 +79,12 @@ class New( class Imported( override val pathPrefix: String, val javaHome: File?, - val data: GradleBuildRootData -) : GradleBuildRoot() { + val data: GradleBuildRootData, + lastModifiedFiles: LastModifiedFiles +) : GradleBuildRoot(lastModifiedFiles) { override val projectRoots: Collection get() = data.projectRoots - init { - loadLastModifiedFiles() - } - fun collectConfigurations(builder: ScriptClassRootsBuilder) { if (javaHome != null) { builder.sdks.addSdk(javaHome) @@ -140,4 +114,14 @@ class Imported( val scriptSource = VirtualFileScriptSource(file) return definitions.firstOrNull { it.isScript(scriptSource) } } +} + +fun GradleProjectSettings.loadLastModifiedFiles(): LastModifiedFiles? { + val externalProjectPath = externalProjectPath ?: return null + return loadLastModifiedFiles(externalProjectPath) +} + +fun loadLastModifiedFiles(rootDirPath: String): LastModifiedFiles? { + val vFile = LocalFileSystem.getInstance().findFileByPath(rootDirPath) ?: return null + return LastModifiedFiles.read(vFile) } \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRootsManager.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRootsManager.kt index 0a08b31d0a6..e38053ac575 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRootsManager.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRootsManager.kt @@ -128,14 +128,16 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(), val root = actualizeBuildRoot(build.workingDir) ?: return root.importing = false - if (root is Legacy) return + if (root is Legacy) return - val templateClasspath = GradleScriptDefinitionsContributor.getDefinitionsTemplateClasspath(project) - val newData = GradleBuildRootData(build.projectRoots, templateClasspath, build.models) - val mergedData = if (build.failed && root is Imported) merge(root.data, newData) else newData + val templateClasspath = GradleScriptDefinitionsContributor.getDefinitionsTemplateClasspath(project) + val newData = GradleBuildRootData(build.projectRoots, templateClasspath, build.models) + val mergedData = if (build.failed && root is Imported) merge(root.data, newData) else newData - val newSupport = tryCreateImportedRoot(build.workingDir) { mergedData } ?: return - GradleBuildRootDataSerializer.write(newSupport.dir ?: return, mergedData) + val lastModifiedFilesReset = LastModifiedFiles() + val newSupport = tryCreateImportedRoot(build.workingDir, lastModifiedFilesReset) { mergedData } ?: return + GradleBuildRootDataSerializer.write(newSupport.dir ?: return, mergedData) + newSupport.saveLastModifiedFiles() add(newSupport) @@ -285,6 +287,7 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(), private fun tryCreateImportedRoot( externalProjectPath: String, + lastModifiedFiles: LastModifiedFiles = loadLastModifiedFiles(externalProjectPath) ?: LastModifiedFiles(), dataProvider: (buildRoot: VirtualFile) -> GradleBuildRootData? ): Imported? { val buildRoot = VfsUtil.findFile(Paths.get(externalProjectPath), true) ?: return null @@ -293,12 +296,14 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(), .getExecutionSettings(project, externalProjectPath, GradleConstants.SYSTEM_ID) .javaHome?.let { File(it) } - return Imported(externalProjectPath, javaHome, data) + return Imported(externalProjectPath, javaHome, data, lastModifiedFiles) } private fun add(newRoot: GradleBuildRoot) { val old = roots.add(newRoot) - if (old is Imported && newRoot !is Imported) removeData(old.pathPrefix) + if (old is Imported && newRoot !is Imported) { + removeData(old.pathPrefix) + } if (old is Imported || newRoot is Imported) { updater.invalidateAndCommit() } diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/roots/AbstractGradleBuildRootsLocatorTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/roots/AbstractGradleBuildRootsLocatorTest.kt index 3967ef868f9..cd3f5e2d984 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/roots/AbstractGradleBuildRootsLocatorTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/roots/AbstractGradleBuildRootsLocatorTest.kt @@ -6,14 +6,11 @@ package org.jetbrains.kotlin.idea.scripting.gradle.roots import org.jetbrains.kotlin.idea.scripting.gradle.GradleKotlinScriptConfigurationInputs +import org.jetbrains.kotlin.idea.scripting.gradle.LastModifiedFiles import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslScriptModel import kotlin.test.assertEquals open class AbstractGradleBuildRootsLocatorTest { - init { - skipLastModifiedFilesLoading = true - } - private val scripts = mutableMapOf() private val locator = MyRootsLocator() @@ -39,7 +36,8 @@ open class AbstractGradleBuildRootsLocatorTest { relativeProjectRoots.map { (pathPrefix + it).removeSuffix("/") }, listOf(), listOf() - ) + ), + LastModifiedFiles() ) add(root)