.gralde.kts: optimize getAffectedGradleProjectFiles (EA-220597 fixed)

This commit is contained in:
Sergey Rostov
2020-01-16 09:41:46 +03:00
parent 676c99b933
commit 40914e79ee
4 changed files with 19 additions and 15 deletions
@@ -39,7 +39,7 @@ class GradleScriptConfigurationLoader(project: Project) : DefaultScriptConfigura
return true 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 // todo: provide an action to load configuration through scripting API: KT-34625, KT-35268
} }
@@ -34,7 +34,7 @@ class GradleScriptInputsWatcher(val project: Project) : PersistentStateComponent
val files = getAffectedGradleProjectFiles(project) val files = getAffectedGradleProjectFiles(project)
for (event in events) { for (event in events) {
val file = event.file ?: return val file = event.file ?: return
if (isInAffectedGradleProjectFiles(files, file)) { if (isInAffectedGradleProjectFiles(files, event.path)) {
storage.fileChanged(file, file.timeStamp) storage.fileChanged(file, file.timeStamp)
} }
} }
@@ -37,6 +37,6 @@ open class GradleScriptListener(project: Project) : ScriptChangeListener(project
override fun isApplicable(vFile: VirtualFile): Boolean { override fun isApplicable(vFile: VirtualFile): Boolean {
if (!isGradleKotlinScript(vFile)) return false if (!isGradleKotlinScript(vFile)) return false
return isInAffectedGradleProjectFiles(project, vFile) return isInAffectedGradleProjectFiles(project, vFile.path)
} }
} }
@@ -6,9 +6,7 @@
package org.jetbrains.kotlin.idea.scripting.gradle package org.jetbrains.kotlin.idea.scripting.gradle
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.service
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.vfs.VirtualFile 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.GradleManager
import org.jetbrains.plugins.gradle.settings.GradleProjectSettings import org.jetbrains.plugins.gradle.settings.GradleProjectSettings
import org.jetbrains.plugins.gradle.util.GradleConstants import org.jetbrains.plugins.gradle.util.GradleConstants
import java.io.File
private val sections = arrayListOf("buildscript", "plugins", "initscript", "pluginManagement") private val sections = arrayListOf("buildscript", "plugins", "initscript", "pluginManagement")
fun isGradleKotlinScript(virtualFile: VirtualFile) = virtualFile.name.endsWith(".gradle.kts") 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) val affectedFiles = getAffectedGradleProjectFiles(project)
return isInAffectedGradleProjectFiles(affectedFiles, file) return isInAffectedGradleProjectFiles(affectedFiles, filePath)
} }
fun isInAffectedGradleProjectFiles(files: List<File>, file: VirtualFile): Boolean { fun isInAffectedGradleProjectFiles(files: Set<String>, filePath: String): Boolean {
// todo: avoid isUnitTestMode usage // todo: avoid isUnitTestMode usage
if (ApplicationManager.getApplication().isUnitTestMode) return true if (ApplicationManager.getApplication().isUnitTestMode) return true
return files.any { it.toPath().systemIndependentPath == file.path } return filePath in files
} }
fun getAffectedGradleProjectFiles(project: Project): List<File> { fun getAffectedGradleProjectFiles(project: Project): Set<String> {
val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID) 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<GradleProjectSettings>().firstOrNull() val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance<GradleProjectSettings>().firstOrNull()
?: return emptyList() ?: return setOf()
return ExternalSystemApiUtil.getAllManagers().filterIsInstance<GradleManager>().firstOrNull() return ExternalSystemApiUtil.getAllManagers()
?.getAffectedExternalProjectFiles(projectSettings.externalProjectPath, project) ?: emptyList() .filterIsInstance<GradleManager>()
.firstOrNull()
?.getAffectedExternalProjectFiles(projectSettings.externalProjectPath, project)
?.mapTo(mutableSetOf()) { it.toPath().systemIndependentPath }
?: setOf()
} }
fun getGradleScriptInputsStamp( fun getGradleScriptInputsStamp(