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:
+31
@@ -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)
|
||||
}
|
||||
|
||||
+1
-2
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user