From c9cb4dff5239232318677a99e698e57fa5b873a3 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Tue, 26 Nov 2019 12:20:17 +0300 Subject: [PATCH] Scripting: introduce ide-specific comparision of script compilation configurations (KT-34626) Do not take into account fields that doesn't affect IDE Also it will threat configurations from old and new scripting API as similar FIt will make sense for script dependencies loaded using Gradle TAPI (new Scripting API) and Old Scripting API ^KT-34626 --- .../DefaultScriptConfigurationManager.kt | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptConfigurationManager.kt index 55c2b90b6e8..a6ba54ad9c9 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptConfigurationManager.kt @@ -34,10 +34,14 @@ import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings import org.jetbrains.kotlin.idea.core.util.EDT import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition +import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink import java.util.concurrent.locks.ReentrantLock import kotlin.concurrent.withLock -import kotlin.script.experimental.api.ScriptDiagnostic +import kotlin.script.experimental.api.* +import kotlin.script.experimental.jvm.impl.toClassPathOrEmpty +import kotlin.script.experimental.jvm.jdkHome +import kotlin.script.experimental.jvm.jvm /** * Standard implementation of scripts configuration loading and caching @@ -244,7 +248,7 @@ internal class DefaultScriptConfigurationManager(project: Project) : } else { val old = getCachedConfigurationState(file) val oldConfiguration = old?.applied?.configuration - if (oldConfiguration == newConfiguration) { + if (oldConfiguration != null && areSimilar(oldConfiguration, newConfiguration)) { saveReports(file, newResult.reports) file.removeScriptDependenciesNotificationPanel(project) } else { @@ -306,6 +310,27 @@ internal class DefaultScriptConfigurationManager(project: Project) : } } } + + private fun areSimilar(old: ScriptCompilationConfigurationWrapper, new: ScriptCompilationConfigurationWrapper): Boolean { + if (old.script != new.script) return false + + val oldConfig = old.configuration + val newConfig = new.configuration + + if (oldConfig == newConfig) return true + if (oldConfig == null || newConfig == null) return false + + if (oldConfig[ScriptCompilationConfiguration.jvm.jdkHome] != newConfig[ScriptCompilationConfiguration.jvm.jdkHome]) return false + + // there is differences how script definition classpath is added to script classpath in old and new scripting API, + // so it's important to compare the resulting classpath list, not only the value of key + if (oldConfig[ScriptCompilationConfiguration.dependencies].toClassPathOrEmpty() != newConfig[ScriptCompilationConfiguration.dependencies].toClassPathOrEmpty()) return false + + if (oldConfig[ScriptCompilationConfiguration.ide.dependenciesSources] != newConfig[ScriptCompilationConfiguration.ide.dependenciesSources]) return false + if (oldConfig[ScriptCompilationConfiguration.defaultImports] != newConfig[ScriptCompilationConfiguration.defaultImports]) return false + + return true + } } object DefaultScriptConfigurationManagerExtensions {