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:
+27
-2
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user