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
This commit is contained in:
Natalia Selezneva
2019-11-26 12:20:17 +03:00
parent 07b6dadbf0
commit c9cb4dff52
@@ -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 {