diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptInputsWatcher.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptInputsWatcher.kt index a6fcda1a2af..8215b419414 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptInputsWatcher.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptInputsWatcher.kt @@ -6,9 +6,12 @@ package org.jetbrains.kotlin.idea.scripting.gradle import com.intellij.openapi.components.* +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.annotations.TestOnly +import org.jetbrains.plugins.gradle.settings.GradleProjectSettings +import org.jetbrains.plugins.gradle.util.GradleConstants @State( name = "KotlinBuildScriptsModificationInfo", @@ -17,6 +20,34 @@ import org.jetbrains.annotations.TestOnly class GradleScriptInputsWatcher(val project: Project) : PersistentStateComponent { private var storage = Storage() + private var cachedGradleProjectsRoots: Set? = null + + fun getGradleProjectsRoots(): Set { + if (cachedGradleProjectsRoots == null) { + cachedGradleProjectsRoots = computeGradleProjectRoots(project) + } + return cachedGradleProjectsRoots ?: emptySet() + } + + fun saveGradleProjectRootsAfterImport(roots: Set) { + val oldRoots = cachedGradleProjectsRoots + if (oldRoots != null && oldRoots.isNotEmpty()) { + cachedGradleProjectsRoots = oldRoots + roots + } else { + cachedGradleProjectsRoots = roots + } + } + + private fun computeGradleProjectRoots(project: Project): Set { + val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID) + if (gradleSettings.getLinkedProjectsSettings().isEmpty()) return setOf() + + val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance().firstOrNull() + ?: return setOf() + + return projectSettings.modules.takeIf { it.isNotEmpty() } ?: setOf(projectSettings.externalProjectPath) + } + fun startWatching() { addVfsListener(this) } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt index 33b3054f5d2..662ab5188ca 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigura import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot import org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptInputsWatcher import org.jetbrains.kotlin.idea.scripting.gradle.getGradleScriptInputsStamp -import org.jetbrains.kotlin.idea.scripting.gradle.saveGradleProjectRootsAfterImport import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource @@ -86,7 +85,7 @@ fun saveScriptModels( errorReporter.reportError(scriptFile, model) } - saveGradleProjectRootsAfterImport( + project.service().saveGradleProjectRootsAfterImport( scriptConfigurations.map { it.first.parent.path }.toSet() ) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/utils.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/utils.kt index f860b66e699..e6c3021f404 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/utils.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/utils.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.scripting.gradle import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.components.service import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.project.Project import com.intellij.openapi.util.registry.Registry @@ -34,35 +35,12 @@ fun isInAffectedGradleProjectFiles(project: Project, filePath: String): Boolean return true } - return filePath.substringBeforeLast("/") in getGradleProjectsRoots(project) + return filePath.substringBeforeLast("/") in project.service().getGradleProjectsRoots() } return false } -private var cachedGradleProjectsRoots: Set? = null - -private fun getGradleProjectsRoots(project: Project): Set { - if (cachedGradleProjectsRoots == null) { - cachedGradleProjectsRoots = computeGradleProjectRoots(project) - } - return cachedGradleProjectsRoots ?: emptySet() -} - -fun saveGradleProjectRootsAfterImport(roots: Set) { - cachedGradleProjectsRoots = roots -} - -private fun computeGradleProjectRoots(project: Project): Set { - val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID) - if (gradleSettings.getLinkedProjectsSettings().isEmpty()) return setOf() - - val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance().firstOrNull() - ?: return setOf() - - return projectSettings.modules.takeIf { it.isNotEmpty() } ?: setOf(projectSettings.externalProjectPath) -} - fun getGradleScriptInputsStamp( project: Project, file: VirtualFile,