From 87cd6160a9ed45c79b30c888a21489a0ee2782ea Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 20 Mar 2020 16:39:33 +0300 Subject: [PATCH] build.gradle.kts: save gradle project roots per project Otherwise they can be overwritten if multiple projects are open Also do not overwrite them in KotlinDslScrtiptModelProcessor because it can be called multiple times during import --- .../gradle/GradleScriptInputsWatcher.kt | 31 +++++++++++++++++++ .../KotlinDslScrtiptModelProcessor.kt | 3 +- .../kotlin/idea/scripting/gradle/utils.kt | 26 ++-------------- 3 files changed, 34 insertions(+), 26 deletions(-) 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,