diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationLoader.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationLoader.kt index 1094712002b..4cd806916ff 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationLoader.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptConfigurationLoader.kt @@ -39,7 +39,7 @@ class GradleScriptConfigurationLoader(project: Project) : DefaultScriptConfigura return true } - if (!isInAffectedGradleProjectFiles(ktFile.project, ktFile.originalFile.virtualFile)) { + if (!isInAffectedGradleProjectFiles(ktFile.project, ktFile.originalFile.virtualFile.path)) { // todo: provide an action to load configuration through scripting API: KT-34625, KT-35268 } 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 a80dae808b6..a1ffe481f28 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 @@ -34,7 +34,7 @@ class GradleScriptInputsWatcher(val project: Project) : PersistentStateComponent val files = getAffectedGradleProjectFiles(project) for (event in events) { val file = event.file ?: return - if (isInAffectedGradleProjectFiles(files, file)) { + if (isInAffectedGradleProjectFiles(files, event.path)) { storage.fileChanged(file, file.timeStamp) } } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptListener.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptListener.kt index 8c65f66a58a..9238fb13e8c 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptListener.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptListener.kt @@ -37,6 +37,6 @@ open class GradleScriptListener(project: Project) : ScriptChangeListener(project override fun isApplicable(vFile: VirtualFile): Boolean { if (!isGradleKotlinScript(vFile)) return false - return isInAffectedGradleProjectFiles(project, vFile) + return isInAffectedGradleProjectFiles(project, vFile.path) } } \ No newline at end of file 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 d46d52ec31e..841a4f56dee 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,9 +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.components.service import com.intellij.openapi.project.Project import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.vfs.VirtualFile @@ -24,33 +22,39 @@ import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType import org.jetbrains.plugins.gradle.GradleManager import org.jetbrains.plugins.gradle.settings.GradleProjectSettings import org.jetbrains.plugins.gradle.util.GradleConstants -import java.io.File private val sections = arrayListOf("buildscript", "plugins", "initscript", "pluginManagement") fun isGradleKotlinScript(virtualFile: VirtualFile) = virtualFile.name.endsWith(".gradle.kts") -fun isInAffectedGradleProjectFiles(project: Project, file: VirtualFile): Boolean { +fun isInAffectedGradleProjectFiles(project: Project, filePath: String): Boolean { + // fast path + if (!filePath.contains("gradle")) return false + val affectedFiles = getAffectedGradleProjectFiles(project) - return isInAffectedGradleProjectFiles(affectedFiles, file) + return isInAffectedGradleProjectFiles(affectedFiles, filePath) } -fun isInAffectedGradleProjectFiles(files: List, file: VirtualFile): Boolean { +fun isInAffectedGradleProjectFiles(files: Set, filePath: String): Boolean { // todo: avoid isUnitTestMode usage if (ApplicationManager.getApplication().isUnitTestMode) return true - return files.any { it.toPath().systemIndependentPath == file.path } + return filePath in files } -fun getAffectedGradleProjectFiles(project: Project): List { +fun getAffectedGradleProjectFiles(project: Project): Set { val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID) - if (gradleSettings.getLinkedProjectsSettings().isEmpty()) return emptyList() + if (gradleSettings.getLinkedProjectsSettings().isEmpty()) return setOf() val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance().firstOrNull() - ?: return emptyList() + ?: return setOf() - return ExternalSystemApiUtil.getAllManagers().filterIsInstance().firstOrNull() - ?.getAffectedExternalProjectFiles(projectSettings.externalProjectPath, project) ?: emptyList() + return ExternalSystemApiUtil.getAllManagers() + .filterIsInstance() + .firstOrNull() + ?.getAffectedExternalProjectFiles(projectSettings.externalProjectPath, project) + ?.mapTo(mutableSetOf()) { it.toPath().systemIndependentPath } + ?: setOf() } fun getGradleScriptInputsStamp(