From 6c1cadf273b9233dccaf6a3c309e910f0d8cc8f5 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 9 Jan 2017 14:56:37 +0300 Subject: [PATCH] Refactor PackageParts: add explicit mutating methods --- .../kotlin/codegen/ClassFileFactory.java | 16 +++++------ .../kotlin/codegen/classFileUtils.kt | 18 ++++++------ .../serialization/MetadataSerializer.kt | 4 ++- .../kotlin/load/kotlin/ModuleMapping.kt | 28 +++++++++++++------ .../idea/vfilefinder/moduleMappingIndexes.kt | 4 +-- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java index 4f54c9316fa..669f8bf658b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java @@ -21,8 +21,6 @@ import com.intellij.psi.PsiFile; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import kotlin.collections.CollectionsKt; -import kotlin.collections.MapsKt; -import kotlin.jvm.functions.Function0; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; @@ -188,17 +186,17 @@ public class ClassFileFactory implements OutputFileCollection { return new PackagePartRegistry() { @Override public void addPart(@NotNull String partShortName) { - MapsKt.getOrPut(partsGroupedByPackage, packageFqNameAsString, new Function0() { - @Override - public PackageParts invoke() { - return new PackageParts(packageFqNameAsString); - } - }).getParts().add(partShortName); + PackageParts packageParts = partsGroupedByPackage.get(packageFqNameAsString); + if (packageParts == null) { + packageParts = new PackageParts(packageFqNameAsString); + partsGroupedByPackage.put(packageFqNameAsString, packageParts); + } + packageParts.addPart(partShortName); } }; } - public void registerPackagePartSourceFiles(Collection files) { + private void registerPackagePartSourceFiles(Collection files) { packagePartSourceFiles.addAll(toIoFilesIgnoringNonPhysical(PackagePartClassUtils.getFilesWithCallables(files))); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/classFileUtils.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/classFileUtils.kt index c0a03150f49..65962400a33 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/classFileUtils.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/classFileUtils.kt @@ -42,20 +42,18 @@ private fun Iterable.addCompiledParts(state: GenerationState): Lis val mapping = ModuleMapping.create(moduleMappingData, "") - incrementalCache.getObsoletePackageParts().forEach { - val i = it.lastIndexOf('/') - val qualifier = if (i == -1) "" else it.substring(0, i).replace('/', '.') - val name = it.substring(i + 1) - mapping.findPackageParts(qualifier)?.run { parts.remove(name) } + incrementalCache.getObsoletePackageParts().forEach { internalName -> + val qualifier = internalName.substringBeforeLast('/', "").replace('/', '.') + val name = internalName.substringAfterLast('/') + mapping.findPackageParts(qualifier)?.removePart(name) } return (this + mapping.packageFqName2Parts.values) .groupBy { it.packageFqName } - .map { - val (packageFqName, packageParts) = it - val newPackageParts = PackageParts(packageFqName) - packageParts.forEach { newPackageParts.parts.addAll(it.parts) } - newPackageParts + .map { (packageFqName, allOldPackageParts) -> + PackageParts(packageFqName).apply { + allOldPackageParts.forEach { packageParts -> this += packageParts } + } } } diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/MetadataSerializer.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/MetadataSerializer.kt index c4280e0d3cb..cd08a3fe2e1 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/MetadataSerializer.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/MetadataSerializer.kt @@ -115,7 +115,9 @@ open class MetadataSerializer(private val dependOnOldBuiltIns: Boolean) { val destFile = File(destDir, getPackageFilePath(packageFqName, file.name)) PackageSerializer(emptyList(), members, packageFqName, destFile).run() - packageTable.getOrPut(packageFqName) { PackageParts(packageFqName.asString()) }.metadataParts.add(destFile.nameWithoutExtension) + packageTable.getOrPut(packageFqName) { + PackageParts(packageFqName.asString()) + }.addMetadataPart(destFile.nameWithoutExtension) } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt index 94e763e738e..aa9e4797d9e 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt @@ -46,8 +46,8 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map().apply { - addParts(this, parseFrom.packagePartsList, PackageParts::parts) - addParts(this, parseFrom.metadataPartsList, PackageParts::metadataParts) + addParts(this, parseFrom.packagePartsList, PackageParts::addPart) + addParts(this, parseFrom.metadataPartsList, PackageParts::addMetadataPart) } return ModuleMapping(packageFqNameParts, debugName ?: "") } @@ -62,12 +62,12 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map, partsList: List, - whichParts: (PackageParts) -> MutableSet + addPartOrMetadataPart: (PackageParts, String) -> Unit ) { for (proto in partsList) { PackageParts(proto.packageFqName).apply { result.put(proto.packageFqName, this) - whichParts(this).addAll(proto.classNameList) + proto.classNameList.forEach { addPartOrMetadataPart(this, it) } } } } @@ -76,9 +76,21 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map() + val parts: Set = linkedSetOf() // See JvmPackageTable.PackageTable.metadata_parts - val metadataParts = linkedSetOf() + val metadataParts: Set = linkedSetOf() + + fun addPart(shortName: String) { + (parts as MutableSet /* see KT-14663 */).add(shortName) + } + + fun removePart(shortName: String) { + (parts as MutableSet).remove(shortName) + } + + fun addMetadataPart(shortName: String) { + (metadataParts as MutableSet).add(shortName) + } fun addTo(builder: JvmPackageTable.PackageTable.Builder) { if (parts.isNotEmpty()) { @@ -96,8 +108,8 @@ class PackageParts(val packageFqName: String) { } operator fun plusAssign(other: PackageParts) { - parts.addAll(other.parts) - metadataParts.addAll(other.metadataParts) + other.parts.forEach(this::addPart) + other.metadataParts.forEach(this::addMetadataPart) } override fun equals(other: Any?) = diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/moduleMappingIndexes.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/moduleMappingIndexes.kt index 88350db2e45..fdc93c93ded 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/moduleMappingIndexes.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/vfilefinder/moduleMappingIndexes.kt @@ -42,8 +42,8 @@ object KotlinModuleMappingIndex : FileBasedIndexExtension( private val VALUE_EXTERNALIZER = object : DataExternalizer { override fun read(input: DataInput): PackageParts? = PackageParts(IOUtil.readUTF(input)).apply { - parts.addAll(IOUtil.readStringList(input)) - metadataParts.addAll(IOUtil.readStringList(input)) + IOUtil.readStringList(input).forEach(this::addPart) + IOUtil.readStringList(input).forEach(this::addMetadataPart) } override fun save(out: DataOutput, value: PackageParts?) {