From 931b1c66d82c5c7cd9952fcbbdbadcf704d68175 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Thu, 14 Mar 2019 12:00:04 +0100 Subject: [PATCH] Fix equality and serializability of scripting data, fix relevant caching behaviour --- .../script/experimental/api/kotlinType.kt | 9 +++++++ .../experimental/api/scriptCompilation.kt | 12 ++++++--- .../script/experimental/api/scriptData.kt | 4 ++- .../experimental/host/scriptHostUtil.kt | 25 +++++++++++++++++++ .../experimental/util/propertiesCollection.kt | 5 ++++ .../experimental/jvm/jvmScriptCompilation.kt | 2 ++ 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/kotlinType.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/kotlinType.kt index 6f889a392d7..c6b1f908698 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/kotlinType.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/kotlinType.kt @@ -32,4 +32,13 @@ class KotlinType private constructor( * Constructs KotlinType from reflected [ktype] */ constructor(type: KType) : this(type.classifier as KClass<*>) + + override fun equals(other: Any?): Boolean = + (other as? KotlinType)?.let { typeName == it.typeName } == true + + override fun hashCode(): Int = typeName.hashCode() + + companion object { + private const val serialVersionUID: Long = 1L + } } diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt index 5d737a9a487..95392b6ed2e 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt @@ -190,14 +190,18 @@ class RefineConfigurationBuilder : PropertiesCollection.Builder() { typealias RefineScriptCompilationConfigurationHandler = (ScriptConfigurationRefinementContext) -> ResultWithDiagnostics -class RefineConfigurationUnconditionallyData( +data class RefineConfigurationUnconditionallyData( val handler: RefineScriptCompilationConfigurationHandler -) : Serializable +) : Serializable { + companion object { private const val serialVersionUID: Long = 1L } +} -class RefineConfigurationOnAnnotationsData( +data class RefineConfigurationOnAnnotationsData( val annotations: List, val handler: RefineScriptCompilationConfigurationHandler -) : Serializable +) : Serializable { + companion object { private const val serialVersionUID: Long = 1L } +} /** diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptData.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptData.kt index 2ee830a2773..493b12abd86 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptData.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptData.kt @@ -66,7 +66,9 @@ interface ExternalSourceCode : SourceCode { /** * The source code [range] with the the optional [name] */ -data class ScriptSourceNamedFragment(val name: String?, val range: SourceCode.Range) +data class ScriptSourceNamedFragment(val name: String?, val range: SourceCode.Range) : Serializable { + companion object { private const val serialVersionUID: Long = 1L } +} /** * The general interface to the Script dependency (see platform-specific implementations) diff --git a/libraries/scripting/common/src/kotlin/script/experimental/host/scriptHostUtil.kt b/libraries/scripting/common/src/kotlin/script/experimental/host/scriptHostUtil.kt index 3f5df2c9a1d..48a7bb9f023 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/host/scriptHostUtil.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/host/scriptHostUtil.kt @@ -6,6 +6,8 @@ package kotlin.script.experimental.host import java.io.File +import java.io.IOError +import java.io.IOException import java.net.URL import kotlin.script.experimental.api.* @@ -47,6 +49,11 @@ open class FileScriptSource(val file: File, private val preloadedText: String? = override val text: String by lazy { preloadedText ?: file.readText() } override val name: String? get() = file.name override val locationId: String? get() = file.path + + override fun equals(other: Any?): Boolean = + this === other || (other as? FileScriptSource)?.let { file.absolutePath == it.file.absolutePath && textSafe == it.textSafe } == true + + override fun hashCode(): Int = file.absolutePath.hashCode() + textSafe.hashCode() * 23 } /** @@ -56,6 +63,11 @@ open class UrlScriptSource(override val externalLocation: URL) : ExternalSourceC override val text: String by lazy { externalLocation.readText() } override val name: String? get() = externalLocation.file override val locationId: String? get() = externalLocation.toString() + + override fun equals(other: Any?): Boolean = + this === other || (other as? UrlScriptSource)?.let { externalLocation == it.externalLocation && textSafe == it.textSafe } == true + + override fun hashCode(): Int = externalLocation.hashCode() + textSafe.hashCode() * 17 } /** @@ -71,9 +83,22 @@ open class StringScriptSource(val source: String, override val name: String? = n override val text: String get() = source override val locationId: String? = null + + override fun equals(other: Any?): Boolean = + this === other || (other as? StringScriptSource)?.let { text == it.text && name == it.name && locationId == it.locationId } == true + + override fun hashCode(): Int = text.hashCode() + name.hashCode() * 17 + locationId.hashCode() * 23 } /** * Converts the String into the SourceCode */ fun String.toScriptSource(name: String? = null): SourceCode = StringScriptSource(this, name) + +private val ExternalSourceCode.textSafe: String? + get() = + try { + text + } catch (e: Throwable) { + null + } \ No newline at end of file diff --git a/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt b/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt index 045d862feb2..74b332e4216 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt @@ -48,6 +48,11 @@ open class PropertiesCollection(private val properties: Map, Any?> = empt fun entries(): Set, Any?>> = properties.entries + override fun equals(other: Any?): Boolean = + (other as? PropertiesCollection)?.let { it.properties == properties } == true + + override fun hashCode(): Int = properties.hashCode() + companion object { fun key(defaultValue: T? = null) = PropertyKeyDelegate(defaultValue) fun keyCopy(source: Key) = PropertyKeyCopyDelegate(source) diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt index 82932436091..1384073bed4 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt @@ -15,6 +15,8 @@ import kotlin.script.experimental.util.PropertiesCollection data class JvmDependency(val classpath: List) : ScriptDependency { @Suppress("unused") constructor(vararg classpathEntries: File) : this(classpathEntries.asList()) + + companion object { private const val serialVersionUID: Long = 1L } } interface JvmScriptCompilationConfigurationKeys