Compiler&plugin deprecations cleanup: length, size, indices, tail and other collection operations.

This commit is contained in:
Ilya Gorbunov
2015-06-25 18:49:25 +03:00
parent f3a19ebe11
commit 32144257ec
23 changed files with 46 additions and 45 deletions
@@ -34,7 +34,7 @@ public fun isComponentLike(name: Name): Boolean {
} }
public fun getComponentIndex(componentName: Name): Int = public fun getComponentIndex(componentName: Name): Int =
componentName.asString().substring(COMPONENT_FUNCTION_NAME_PREFIX.length).toInt() componentName.asString().substring(COMPONENT_FUNCTION_NAME_PREFIX.length()).toInt()
public fun createComponentName(index: Int): Name = public fun createComponentName(index: Int): Name =
Name.identifier(COMPONENT_FUNCTION_NAME_PREFIX + index) Name.identifier(COMPONENT_FUNCTION_NAME_PREFIX + index)
@@ -76,8 +76,8 @@ private class ExplicitTypeBinding(
override fun getArgumentBindings(): List<TypeArgumentBinding<JetTypeElement>?> { override fun getArgumentBindings(): List<TypeArgumentBinding<JetTypeElement>?> {
val psiTypeArguments = psiElement.getTypeArgumentsAsTypes() val psiTypeArguments = psiElement.getTypeArgumentsAsTypes()
val isErrorBinding = run { val isErrorBinding = run {
val sizeIsEqual = psiTypeArguments.size == jetType.getArguments().size val sizeIsEqual = psiTypeArguments.size() == jetType.getArguments().size()
&& psiTypeArguments.size == jetType.getConstructor().getParameters().size && psiTypeArguments.size() == jetType.getConstructor().getParameters().size()
jetType.isError() || !sizeIsEqual jetType.isError() || !sizeIsEqual
} }
@@ -115,7 +115,7 @@ private class NoTypeElementBinding<out P : PsiElement>(
): TypeBinding<P> { ): TypeBinding<P> {
override fun getArgumentBindings(): List<TypeArgumentBinding<P>?> { override fun getArgumentBindings(): List<TypeArgumentBinding<P>?> {
val isErrorBinding = jetType.isError() || jetType.getConstructor().getParameters().size != jetType.getArguments().size val isErrorBinding = jetType.isError() || jetType.getConstructor().getParameters().size() != jetType.getArguments().size()
return jetType.getArguments().indices.map { return jetType.getArguments().indices.map {
val typeProjection = jetType.getArguments()[it] val typeProjection = jetType.getArguments()[it]
TypeArgumentBindingImpl( TypeArgumentBindingImpl(
@@ -131,7 +131,7 @@ public class CapturedTypeApproximationTest() : JetLiteFixture() {
private fun getTestTypesForOneTypeVariable(): List<String> { private fun getTestTypesForOneTypeVariable(): List<String> {
val typePatterns = getTypePatternsForOneTypeVariable() val typePatterns = getTypePatternsForOneTypeVariable()
val range = typePatterns.size().indices val range = typePatterns.indices
val variants = ArrayList<List<Int>>() val variants = ArrayList<List<Int>>()
for (i in range) variants.add(listOf(i)) for (i in range) variants.add(listOf(i))
for (i in range) for (j in range) variants.add(listOf(i, j)) for (i in range) for (j in range) variants.add(listOf(i, j))
@@ -152,7 +152,7 @@ public class CapturedTypeApproximationTest() : JetLiteFixture() {
private fun getTestTypesForTwoTypeVariables(): List<String> { private fun getTestTypesForTwoTypeVariables(): List<String> {
val typePatterns = getTypePatternsForOneTypeVariable() val typePatterns = getTypePatternsForOneTypeVariable()
val range = typePatterns.size().indices val range = typePatterns.indices
val result = ArrayList<String>() val result = ArrayList<String>()
for (pattern in getTypePatternsForTwoTypeVariables()) { for (pattern in getTypePatternsForTwoTypeVariables()) {
for (i in range) { for (i in range) {
@@ -66,10 +66,10 @@ public fun String.trimIndent(): String {
else { else {
if (!line.startsWith(trimmedPrefix)) { if (!line.startsWith(trimmedPrefix)) {
throw IllegalArgumentException( throw IllegalArgumentException(
"""Invalid line "$line", ${trimmedPrefix.size} whitespace character are expected""") """Invalid line "$line", ${trimmedPrefix.length()} whitespace character are expected""")
} }
line.substring(trimmedPrefix.length) line.substring(trimmedPrefix.length())
} }
}.joinToString(separator = "\n") }.joinToString(separator = "\n")
} }
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil
import org.jetbrains.kotlin.psi.JetCallableDeclaration import org.jetbrains.kotlin.psi.JetCallableDeclaration
import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.test.JetTestUtils.* import org.jetbrains.kotlin.test.JetTestUtils.*
@@ -37,7 +38,7 @@ abstract class AbstractJetTypeBindingTest : JetLiteFixture() {
val analyzeResult = JvmResolveUtil.analyzeFilesWithJavaIntegration(getProject(), listOf(testKtFile)) val analyzeResult = JvmResolveUtil.analyzeFilesWithJavaIntegration(getProject(), listOf(testKtFile))
val testDeclaration = testKtFile.getDeclarations().last!! as JetCallableDeclaration val testDeclaration = testKtFile.getDeclarations().last()!! as JetCallableDeclaration
val typeBinding = testDeclaration.createTypeBindingForReturnType(analyzeResult.bindingContext) val typeBinding = testDeclaration.createTypeBindingForReturnType(analyzeResult.bindingContext)
@@ -122,7 +122,7 @@ public class JDIEval(
if (!nestedSizes.isEmpty()) { if (!nestedSizes.isEmpty()) {
val nestedElementType = elementType.arrayElementType val nestedElementType = elementType.arrayElementType
val nestedSize = nestedSizes[0] val nestedSize = nestedSizes[0]
val tail = nestedSizes.tail val tail = nestedSizes.drop(1)
for (i in 0..size - 1) { for (i in 0..size - 1) {
setArrayElement(arr, int(i), fillArray(nestedElementType, nestedSize, tail)) setArrayElement(arr, int(i), fillArray(nestedElementType, nestedSize, tail))
} }
@@ -131,7 +131,7 @@ public class JDIEval(
} }
override fun newMultiDimensionalArray(arrayType: Type, dimensionSizes: List<Int>): Value { override fun newMultiDimensionalArray(arrayType: Type, dimensionSizes: List<Int>): Value {
return fillArray(arrayType.arrayElementType, dimensionSizes[0], dimensionSizes.tail) return fillArray(arrayType.arrayElementType, dimensionSizes[0], dimensionSizes.drop(1))
} }
private fun Value.array() = jdiObj.checkNull() as jdi.ArrayReference private fun Value.array() = jdiObj.checkNull() as jdi.ArrayReference
@@ -83,7 +83,7 @@ fun initFrame(
} }
val args = Type.getArgumentTypes(m.desc) val args = Type.getArgumentTypes(m.desc)
for (i in 0..args.size - 1) { for (i in 0..args.size() - 1) {
current.setLocal(local++, makeNotInitializedValue(args[i])) current.setLocal(local++, makeNotInitializedValue(args[i]))
if (args[i].getSize() == 2) { if (args[i].getSize() == 2) {
current.setLocal(local++, NOT_A_VALUE) current.setLocal(local++, NOT_A_VALUE)
@@ -351,7 +351,7 @@ fun Class<Any>.findConstructor(methodDesc: MethodDescription): Constructor<Any?>
fun MethodDescription.matches(ctor: Constructor<*>): Boolean { fun MethodDescription.matches(ctor: Constructor<*>): Boolean {
val methodParams = ctor.getParameterTypes()!! val methodParams = ctor.getParameterTypes()!!
if (parameterTypes.size() != methodParams.size) return false if (parameterTypes.size() != methodParams.size()) return false
for ((i, p) in parameterTypes.withIndices()) { for ((i, p) in parameterTypes.withIndices()) {
if (!p.matches(methodParams[i])) return false if (!p.matches(methodParams[i])) return false
} }
@@ -363,7 +363,7 @@ fun MethodDescription.matches(method: Method): Boolean {
if (name != method.getName()) return false if (name != method.getName()) return false
val methodParams = method.getParameterTypes()!! val methodParams = method.getParameterTypes()!!
if (parameterTypes.size() != methodParams.size) return false if (parameterTypes.size() != methodParams.size()) return false
for ((i, p) in parameterTypes.withIndices()) { for ((i, p) in parameterTypes.withIndices()) {
if (!p.matches(methodParams[i])) return false if (!p.matches(methodParams[i])) return false
} }
@@ -64,7 +64,7 @@ fun buildTestCase(ownerClass: Class<TestData>,
for (method in ownerClass.getDeclaredMethods()) { for (method in ownerClass.getDeclaredMethods()) {
if (method.getName() == methodNode.name) { if (method.getName() == methodNode.name) {
val isStatic = (method.getModifiers() and Modifier.STATIC) != 0 val isStatic = (method.getModifiers() and Modifier.STATIC) != 0
if (method.getParameterTypes()!!.size > 0) { if (method.getParameterTypes()!!.size() > 0) {
println("Skipping method with parameters: $method") println("Skipping method with parameters: $method")
} }
else if (!isStatic && !method.getName()!!.startsWith("test")) { else if (!isStatic && !method.getName()!!.startsWith("test")) {
@@ -74,7 +74,7 @@ trait HierarchyTraverser<T> {
val processed = HashSet<T>() val processed = HashSet<T>()
stack.push(initialElement) stack.push(initialElement)
while (!stack.empty) { while (!stack.isEmpty()) {
ProgressIndicatorProvider.checkCanceled() ProgressIndicatorProvider.checkCanceled()
val current = stack.pop()!! val current = stack.pop()!!
@@ -38,8 +38,8 @@ class ToFromOriginalFileMapper(
val syntheticText = syntheticFile.getText() val syntheticText = syntheticFile.getText()
assert(originalText.subSequence(0, completionOffset) == syntheticText.subSequence(0, completionOffset)) //TODO: drop it assert(originalText.subSequence(0, completionOffset) == syntheticText.subSequence(0, completionOffset)) //TODO: drop it
syntheticLength = syntheticText.length syntheticLength = syntheticText.length()
originalLength = originalText.length originalLength = originalText.length()
val minLength = Math.min(originalLength, syntheticLength) val minLength = Math.min(originalLength, syntheticLength)
tailLength = (0..minLength-1).firstOrNull { tailLength = (0..minLength-1).firstOrNull {
syntheticText[syntheticLength - it - 1] != originalText[originalLength - it - 1] syntheticText[syntheticLength - it - 1] != originalText[originalLength - it - 1]
@@ -54,14 +54,14 @@ class WithTailInsertHandler(val tailText: String,
if (overwriteText) { if (overwriteText) {
fun isCharAt(offset: Int, c: Char) = offset < document.getTextLength() && document.getCharsSequence().charAt(offset) == c fun isCharAt(offset: Int, c: Char) = offset < document.getTextLength() && document.getCharsSequence().charAt(offset) == c
fun isTextAt(offset: Int, text: String) = offset + text.length <= document.getTextLength() && document.getText(TextRange(offset, offset + text.length)) == text fun isTextAt(offset: Int, text: String) = offset + text.length() <= document.getTextLength() && document.getText(TextRange(offset, offset + text.length())) == text
if (spaceBefore && isCharAt(tailOffset, ' ')) { if (spaceBefore && isCharAt(tailOffset, ' ')) {
document.deleteString(tailOffset, tailOffset + 1) document.deleteString(tailOffset, tailOffset + 1)
} }
if (isTextAt(tailOffset, tailText)) { if (isTextAt(tailOffset, tailText)) {
document.deleteString(tailOffset, tailOffset + tailText.length) document.deleteString(tailOffset, tailOffset + tailText.length())
if (spaceAfter && isCharAt(tailOffset, ' ')) { if (spaceAfter && isCharAt(tailOffset, ' ')) {
document.deleteString(tailOffset, tailOffset + 1) document.deleteString(tailOffset, tailOffset + 1)
@@ -77,7 +77,7 @@ class WithTailInsertHandler(val tailText: String,
document.insertString(tailOffset, textToInsert) document.insertString(tailOffset, textToInsert)
if (moveCaret) { if (moveCaret) {
context.getEditor().getCaretModel().moveToOffset(tailOffset + textToInsert.length) context.getEditor().getCaretModel().moveToOffset(tailOffset + textToInsert.length())
if (tailText == ",") { if (tailText == ",") {
AutoPopupController.getInstance(context.getProject())?.autoPopupParameterInfo(context.getEditor(), null) AutoPopupController.getInstance(context.getProject())?.autoPopupParameterInfo(context.getEditor(), null)
@@ -50,10 +50,10 @@ private fun calcNameSimilarity(name: String, expectedName: String): Int {
val nonNumberWords2 = words2.filter(::isNonNumber) val nonNumberWords2 = words2.filter(::isNonNumber)
// count number of words matched at the end (but ignore number words - they are less important) // count number of words matched at the end (but ignore number words - they are less important)
val minWords = Math.min(nonNumberWords1.size, nonNumberWords2.size) val minWords = Math.min(nonNumberWords1.size(), nonNumberWords2.size())
val matchedTailLength = (0..minWords-1).firstOrNull { val matchedTailLength = (0..minWords-1).firstOrNull {
i -> nonNumberWords1[nonNumberWords1.size - i - 1] != nonNumberWords2[nonNumberWords2.size - i - 1] i -> nonNumberWords1[nonNumberWords1.size() - i - 1] != nonNumberWords2[nonNumberWords2.size() - i - 1]
} ?: minWords } ?: minWords
return matchedWords.size * 1000 + matchedTailLength return matchedWords.size() * 1000 + matchedTailLength
} }
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.types.Variance
private fun getTypeSubstitution(baseType: JetType, derivedType: JetType): LinkedHashMap<TypeConstructor, TypeProjection>? { private fun getTypeSubstitution(baseType: JetType, derivedType: JetType): LinkedHashMap<TypeConstructor, TypeProjection>? {
val substitutedType = TypeCheckingProcedure.findCorrespondingSupertype(derivedType, baseType) ?: return null val substitutedType = TypeCheckingProcedure.findCorrespondingSupertype(derivedType, baseType) ?: return null
val substitution = LinkedHashMap<TypeConstructor, TypeProjection>(substitutedType.getArguments().size) val substitution = LinkedHashMap<TypeConstructor, TypeProjection>(substitutedType.getArguments().size())
for ((param, arg) in baseType.getConstructor().getParameters() zip substitutedType.getArguments()) { for ((param, arg) in baseType.getConstructor().getParameters() zip substitutedType.getArguments()) {
substitution[param.getTypeConstructor()] = arg substitution[param.getTypeConstructor()] = arg
} }
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
public class JetEnumEntryWithoutSuperCallUsage(enumEntry: JetEnumEntry) : JetUsageInfo<JetEnumEntry>(enumEntry) { public class JetEnumEntryWithoutSuperCallUsage(enumEntry: JetEnumEntry) : JetUsageInfo<JetEnumEntry>(enumEntry) {
override fun processUsage(changeInfo: JetChangeInfo, element: JetEnumEntry): Boolean { override fun processUsage(changeInfo: JetChangeInfo, element: JetEnumEntry): Boolean {
if (changeInfo.getNewParameters().size > 0) { if (changeInfo.getNewParameters().size() > 0) {
val psiFactory = JetPsiFactory(element) val psiFactory = JetPsiFactory(element)
val enumClass = element.getStrictParentOfType<JetClass>()!! val enumClass = element.getStrictParentOfType<JetClass>()!!
@@ -60,7 +60,7 @@ public class KotlinJavaSafeDeleteDelegate : JavaSafeDeleteDelegate {
val namedArguments = args.filter { arg -> arg is JetValueArgument && arg.getArgumentName()?.getText() == parameter.getName() } val namedArguments = args.filter { arg -> arg is JetValueArgument && arg.getArgumentName()?.getText() == parameter.getName() }
if (!namedArguments.isEmpty()) { if (!namedArguments.isEmpty()) {
usages.add(SafeDeleteValueArgumentListUsageInfo(namedArguments.first as JetValueArgument, parameter)) usages.add(SafeDeleteValueArgumentListUsageInfo(namedArguments.first(), parameter))
return return
} }
@@ -63,7 +63,7 @@ public trait JetPsiRange {
fun match(scope: PsiElement, unifier: JetPsiUnifier): List<Match> { fun match(scope: PsiElement, unifier: JetPsiUnifier): List<Match> {
val elements = elements.filter(SIGNIFICANT_FILTER) val elements = elements.filter(SIGNIFICANT_FILTER)
if (elements.empty) return Collections.emptyList() if (elements.isEmpty()) return Collections.emptyList()
val matches = ArrayList<Match>() val matches = ArrayList<Match>()
scope.accept( scope.accept(
@@ -72,7 +72,7 @@ public trait JetPsiRange {
val range = element val range = element
.siblings() .siblings()
.filter(SIGNIFICANT_FILTER) .filter(SIGNIFICANT_FILTER)
.take(elements.size) .take(elements.size())
.toList() .toList()
.toRange() .toRange()
@@ -82,9 +82,9 @@ public trait JetPsiRange {
matches.add(Match(range, result)) matches.add(Match(range, result))
} }
else { else {
val matchCountSoFar = matches.size val matchCountSoFar = matches.size()
super.visitJetElement(element) super.visitJetElement(element)
if (result is UnificationResult.WeaklyMatched && matches.size == matchCountSoFar) { if (result is UnificationResult.WeaklyMatched && matches.size() == matchCountSoFar) {
matches.add(Match(range, result)) matches.add(Match(range, result))
} }
} }
@@ -96,7 +96,7 @@ public trait JetPsiRange {
} }
public fun List<PsiElement>.toRange(significantOnly: Boolean = true): JetPsiRange { public fun List<PsiElement>.toRange(significantOnly: Boolean = true): JetPsiRange {
return if (empty) JetPsiRange.Empty else JetPsiRange.ListRange(if (significantOnly) filter(SIGNIFICANT_FILTER) else this) return if (isEmpty()) JetPsiRange.Empty else JetPsiRange.ListRange(if (significantOnly) filter(SIGNIFICANT_FILTER) else this)
} }
public fun PsiElement?.toRange(): JetPsiRange = this?.let { JetPsiRange.ListRange(Collections.singletonList(it)) } ?: JetPsiRange.Empty public fun PsiElement?.toRange(): JetPsiRange = this?.let { JetPsiRange.ListRange(Collections.singletonList(it)) } ?: JetPsiRange.Empty
@@ -300,7 +300,7 @@ class IdeaModuleInfoTest : ModuleTestCase() {
private fun LibraryInfo.assertAdditionalLibraryDependencies(vararg expected: IdeaModuleInfo) { private fun LibraryInfo.assertAdditionalLibraryDependencies(vararg expected: IdeaModuleInfo) {
Assert.assertEquals(this, dependencies().first()) Assert.assertEquals(this, dependencies().first())
val dependenciesWithoutSelf = this.dependencies().tail val dependenciesWithoutSelf = this.dependencies().drop(1)
UsefulTestCase.assertSameElements(dependenciesWithoutSelf, expected.toList()) UsefulTestCase.assertSameElements(dependenciesWithoutSelf, expected.toList())
} }
@@ -59,13 +59,13 @@ public abstract class AbstractSmartStepIntoTest : JetLightCodeInsightFixtureTest
private fun renderTableWithResults(expected: List<String>, actual: List<String>): String { private fun renderTableWithResults(expected: List<String>, actual: List<String>): String {
val sb = StringBuilder() val sb = StringBuilder()
val maxExtStrSize = (expected.maxBy { it.size }?.size ?: 0) + 5 val maxExtStrSize = (expected.maxBy { it.length() }?.length() ?: 0) + 5
val longerList = if (expected.size < actual.size) actual else expected val longerList = if (expected.size() < actual.size()) actual else expected
val shorterList = if (expected.size < actual.size) expected else actual val shorterList = if (expected.size() < actual.size()) expected else actual
for ((i, element) in longerList.withIndices()) { for ((i, element) in longerList.withIndex()) {
sb.append(element) sb.append(element)
sb.append(" ".repeat(maxExtStrSize - element.size)) sb.append(" ".repeat(maxExtStrSize - element.length()))
if (i < shorterList.size) sb.append(shorterList[i]) if (i < shorterList.size()) sb.append(shorterList[i])
sb.append("\n") sb.append("\n")
} }
@@ -111,7 +111,7 @@ private fun createCodeFragment(filePath: String, contextElement: PsiElement): Je
val fileForFragment = File(filePath + ".fragment") val fileForFragment = File(filePath + ".fragment")
val codeFragmentText = FileUtil.loadFile(fileForFragment, true).trim() val codeFragmentText = FileUtil.loadFile(fileForFragment, true).trim()
val psiFactory = JetPsiFactory(contextElement.getProject()) val psiFactory = JetPsiFactory(contextElement.getProject())
if (fileForFragment.readLines().size == 1) { if (fileForFragment.readLines().size() == 1) {
return psiFactory.createExpressionCodeFragment( return psiFactory.createExpressionCodeFragment(
codeFragmentText, codeFragmentText,
KotlinCodeFragmentFactory.getContextElement(contextElement) KotlinCodeFragmentFactory.getContextElement(contextElement)
@@ -64,7 +64,7 @@ class FoldingAfterOptimizeImportsTest : AbstractKotlinFoldingTest() {
fixture.doHighlighting() fixture.doHighlighting()
val model = getEditor().getFoldingModel() val model = getEditor().getFoldingModel()
val foldingRegions = model.getAllFoldRegions() val foldingRegions = model.getAllFoldRegions()
assert(foldingRegions.size >= number) { "There is no enough folding regions in file: in file - ${foldingRegions.size} , expected = ${number}" } assert(foldingRegions.size() >= number) { "There is no enough folding regions in file: in file - ${foldingRegions.size()} , expected = ${number}" }
return foldingRegions[number] return foldingRegions[number]
} }
@@ -37,7 +37,7 @@ public abstract class AbstractReferenceResolveInLibrarySourcesTest : JetLightCod
val expectedResolveData = AbstractReferenceResolveTest.readResolveData(fixture.getFile()!!.getText()) val expectedResolveData = AbstractReferenceResolveTest.readResolveData(fixture.getFile()!!.getText())
val gotoData = NavigationTestUtils.invokeGotoImplementations(fixture.getEditor(), fixture.getFile())!! val gotoData = NavigationTestUtils.invokeGotoImplementations(fixture.getEditor(), fixture.getFile())!!
Assert.assertEquals("Single target expected for origianl file", 1, gotoData.targets.size) Assert.assertEquals("Single target expected for origianl file", 1, gotoData.targets.size())
val testedPsiElement = gotoData.targets[0].getNavigationElement() val testedPsiElement = gotoData.targets[0].getNavigationElement()
val testedElementFile = testedPsiElement.getContainingFile()!! val testedElementFile = testedPsiElement.getContainingFile()!!
@@ -135,7 +135,7 @@ class LambdaExpression(val arguments: String?, val block: Block) : Expression()
if (arguments != null) { if (arguments != null) {
builder.append(arguments) builder.append(arguments)
.append("->") .append("->")
.append(if (block.statements.size > 1) "\n" else " ") .append(if (block.statements.size() > 1) "\n" else " ")
.append(block.statements, "\n") .append(block.statements, "\n")
} }
else { else {
@@ -419,7 +419,7 @@ public class IncrementalCacheImpl(targetDataRoot: File) : StorageOwner, Incremen
val size = `in`.readInt() val size = `in`.readInt()
val map = HashMap<String, Any>(size) val map = HashMap<String, Any>(size)
for (i in size.indices) { repeat(size) {
val name = IOUtil.readString(`in`)!! val name = IOUtil.readString(`in`)!!
val kind = Kind.values()[`in`.readByte().toInt()] val kind = Kind.values()[`in`.readByte().toInt()]
@@ -531,7 +531,7 @@ public class IncrementalCacheImpl(targetDataRoot: File) : StorageOwner, Incremen
val size = `in`.readInt() val size = `in`.readInt()
val map = HashMap<String, Long>(size) val map = HashMap<String, Long>(size)
for (i in size.indices) { repeat(size) {
val name = IOUtil.readString(`in`)!! val name = IOUtil.readString(`in`)!!
val value = `in`.readLong() val value = `in`.readLong()