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
This commit is contained in:
Natalia Selezneva
2020-03-20 16:39:33 +03:00
parent 47d97902c1
commit 87cd6160a9
3 changed files with 34 additions and 26 deletions
@@ -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<GradleScriptInputsWatcher.Storage> {
private var storage = Storage()
private var cachedGradleProjectsRoots: Set<String>? = null
fun getGradleProjectsRoots(): Set<String> {
if (cachedGradleProjectsRoots == null) {
cachedGradleProjectsRoots = computeGradleProjectRoots(project)
}
return cachedGradleProjectsRoots ?: emptySet()
}
fun saveGradleProjectRootsAfterImport(roots: Set<String>) {
val oldRoots = cachedGradleProjectsRoots
if (oldRoots != null && oldRoots.isNotEmpty()) {
cachedGradleProjectsRoots = oldRoots + roots
} else {
cachedGradleProjectsRoots = roots
}
}
private fun computeGradleProjectRoots(project: Project): Set<String> {
val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID)
if (gradleSettings.getLinkedProjectsSettings().isEmpty()) return setOf()
val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance<GradleProjectSettings>().firstOrNull()
?: return setOf()
return projectSettings.modules.takeIf { it.isNotEmpty() } ?: setOf(projectSettings.externalProjectPath)
}
fun startWatching() {
addVfsListener(this)
}
@@ -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<GradleScriptInputsWatcher>().saveGradleProjectRootsAfterImport(
scriptConfigurations.map { it.first.parent.path }.toSet()
)
@@ -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<GradleScriptInputsWatcher>().getGradleProjectsRoots()
}
return false
}
private var cachedGradleProjectsRoots: Set<String>? = null
private fun getGradleProjectsRoots(project: Project): Set<String> {
if (cachedGradleProjectsRoots == null) {
cachedGradleProjectsRoots = computeGradleProjectRoots(project)
}
return cachedGradleProjectsRoots ?: emptySet()
}
fun saveGradleProjectRootsAfterImport(roots: Set<String>) {
cachedGradleProjectsRoots = roots
}
private fun computeGradleProjectRoots(project: Project): Set<String> {
val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID)
if (gradleSettings.getLinkedProjectsSettings().isEmpty()) return setOf()
val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance<GradleProjectSettings>().firstOrNull()
?: return setOf()
return projectSettings.modules.takeIf { it.isNotEmpty() } ?: setOf(projectSettings.externalProjectPath)
}
fun getGradleScriptInputsStamp(
project: Project,
file: VirtualFile,