~ fix serialization
diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/serizliation.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/serizliation.kt
index 4f1bbd4..b5f8a44 100644
--- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/serizliation.kt
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/serizliation.kt
@@ -17,118 +17,117 @@
private val attribute = FileAttribute("kotlin-script-dependencies", 1, false)
fun read(project: Project): List<KotlinDslScriptModel>? {
- return attribute.readAttribute(project.projectFile ?: return null)?.use { readValue(it) }
+ return attribute.readAttribute(project.projectFile ?: return null)?.use { readKotlinDslScriptModels(it) }
}
fun write(project: Project, models: List<KotlinDslScriptModel>) {
attribute.writeAttribute(project.projectFile ?: return).use {
- writeValue(it, models)
+ writeKotlinDslScriptModels(it, models)
}
}
}
-fun writeValue(output: DataOutputStream, value: List<KotlinDslScriptModel>) {
- val strings = StringsPool()
+fun writeKotlinDslScriptModels(output: DataOutputStream, value: List<KotlinDslScriptModel>) {
+ val strings = StringsPool.writer(output)
value.forEach {
- strings.getStringId(it.file)
+ strings.addString(it.file)
strings.addStrings(it.classPath)
strings.addStrings(it.sourcePath)
strings.addStrings(it.imports)
}
- strings.freeze()
- strings.writeStrings(output)
- value.forEach {
- strings.writeStringId(it.file, output)
+ strings.writeHeader()
+ output.writeList(value) {
+ strings.writeStringId(it.file)
output.writeString(it.inputs.sections)
output.writeLong(it.inputs.inputsTS)
- strings.writeStringIds(it.classPath, output)
- strings.writeStringIds(it.sourcePath, output)
- strings.writeStringIds(it.imports, output)
+ strings.writeStringIds(it.classPath)
+ strings.writeStringIds(it.sourcePath)
+ strings.writeStringIds(it.imports)
}
}
-fun readValue(input: DataInputStream): List<KotlinDslScriptModel> {
- val strings = StringsPool()
- strings.readStrings(input)
- val n = input.readInt()
- val result = mutableListOf<KotlinDslScriptModel>()
- repeat(n) {
- result.add(
- KotlinDslScriptModel(
- strings.readStringId(input),
- GradleKotlinScriptConfigurationInputs(input.readString(), input.readLong()),
- strings.readStringIds(input),
- strings.readStringIds(input),
- strings.readStringIds(input),
- listOf()
- )
+fun readKotlinDslScriptModels(input: DataInputStream): List<KotlinDslScriptModel> {
+ val strings = StringsPool.reader(input)
+ return input.readList {
+ KotlinDslScriptModel(
+ strings.readString(),
+ GradleKotlinScriptConfigurationInputs(input.readString(), input.readLong()),
+ strings.readStrings(),
+ strings.readStrings(),
+ strings.readStrings(),
+ listOf()
)
}
- return result
}
-private class StringsPool {
- var freeze = false
- val strings = mutableListOf<String>()
- val ids = mutableMapOf<String, Int>()
+private object StringsPool {
+ fun writer(output: DataOutputStream) = Writer(output)
- fun getString(id: Int) = strings[id]
+ class Writer(val output: DataOutputStream) {
+ var freeze = false
+ val ids = mutableMapOf<String, Int>()
- fun getStringId(string: String): Int = ids.getOrPut(string) {
- check(!freeze)
- val id = strings.size
- strings.add(string)
- id
- }
-
- fun addString(string: String) {
- getStringId(string)
- }
-
- fun addStrings(list: List<String>) {
- list.forEach { getStringId(it) }
- }
-
- fun freeze() {
- // sort for optimal performance and compression
- strings.sort()
- strings.forEachIndexed { index, s ->
- ids[s] = index
+ fun getStringId(string: String) = ids.getOrPut(string) {
+ check(!freeze)
+ ids.size
}
- freeze = true
- }
+ fun addString(string: String) {
+ getStringId(string)
+ }
- fun writeStringIds(strings: List<String>, output: DataOutputStream) {
- output.writeInt(strings.size)
- strings.forEach {
- writeStringId(it, output)
+ fun addStrings(list: List<String>) {
+ list.forEach { addString(it) }
+ }
+
+ fun writeHeader() {
+ freeze = true
+
+ output.writeInt(ids.size)
+
+ // sort for optimal performance and compression
+ ids.keys.sorted().forEachIndexed { index, s ->
+ ids[s] = index
+ output.writeString(s)
+ }
+ }
+
+ fun writeStringId(it: String) {
+ output.writeInt(getStringId(it))
+ }
+
+ fun writeStringIds(strings: List<String>) {
+ output.writeInt(strings.size)
+ strings.forEach {
+ writeStringId(it)
+ }
}
}
- fun writeStringId(it: String, output: DataOutputStream) {
- output.writeInt(getStringId(it))
+ fun reader(input: DataInputStream): Reader {
+ val strings = input.readList { input.readString() }
+ return Reader(input, strings)
}
- fun readStringIds(input: DataInputStream): List<String> {
- val n = input.readInt()
- val result = ArrayList<String>(n)
- repeat(n) {
- result.add(readStringId(input))
- }
- return result
- }
+ class Reader(val input: DataInputStream, val strings: List<String>) {
+ fun getString(id: Int) = strings[id]
- fun readStringId(input: DataInputStream) = getString(input.readInt())
+ fun readString() = getString(input.readInt())
- fun writeStrings(output: DataOutputStream) {
- output.writeInt(ids.size)
- ids.keys.forEach { output.writeChars(it) }
+ fun readStrings(): List<String> = input.readList { readString() }
}
+}
- fun readStrings(input: DataInputStream) {
- repeat(input.readInt()) {
- ids[input.readString()] = ids.size
- }
+private inline fun <T> DataOutputStream.writeList(list: List<T>, write: (T) -> Unit) {
+ writeInt(list.size)
+ list.forEach { write(it) }
+}
+
+private inline fun <T> DataInputStream.readList(read: () -> T): List<T> {
+ val n = readInt()
+ val result = ArrayList<T>(n)
+ repeat(n) {
+ result.add(read())
}
+ return result
}
\ No newline at end of file
diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/KotlinDslScriptModelsTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/KotlinDslScriptModelsTest.kt
index f14aadb..63fa21d 100644
--- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/KotlinDslScriptModelsTest.kt
+++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/KotlinDslScriptModelsTest.kt
@@ -5,14 +5,42 @@
package org.jetbrains.kotlin.idea.scripting.gradle
+import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslScriptModel
import org.junit.Test
-
-import org.junit.Assert.*
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import java.io.DataInputStream
+import java.io.DataOutputStream
+import kotlin.test.assertEquals
class KotlinDslScriptModelsTest {
-
@Test
- fun read() {
- write
+ fun write() {
+ val buffer = ByteArrayOutputStream()
+
+ val list = listOf(
+ KotlinDslScriptModel(
+ "a",
+ GradleKotlinScriptConfigurationInputs("b", 1),
+ listOf("c", "a", "b"),
+ listOf("b", "c", "a"),
+ listOf("i", "c", "b"),
+ listOf()
+ ),
+ KotlinDslScriptModel(
+ "a",
+ GradleKotlinScriptConfigurationInputs("b", 1),
+ listOf("c", "a", "b"),
+ listOf("b", "c", "a"),
+ listOf("i", "c", "b"),
+ listOf()
+ )
+ )
+
+ writeKotlinDslScriptModels(DataOutputStream(buffer), list)
+
+ val restored = readKotlinDslScriptModels(DataInputStream(ByteArrayInputStream(buffer.toByteArray())))
+
+ assertEquals(list.joinToString(), restored.joinToString())
}
}
\ No newline at end of file