Refactor PackageParts: add explicit mutating methods
This commit is contained in:
@@ -21,8 +21,6 @@ import com.intellij.psi.PsiFile;
|
|||||||
import com.intellij.util.Function;
|
import com.intellij.util.Function;
|
||||||
import com.intellij.util.containers.ContainerUtil;
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import kotlin.collections.CollectionsKt;
|
import kotlin.collections.CollectionsKt;
|
||||||
import kotlin.collections.MapsKt;
|
|
||||||
import kotlin.jvm.functions.Function0;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.annotations.TestOnly;
|
import org.jetbrains.annotations.TestOnly;
|
||||||
@@ -188,17 +186,17 @@ public class ClassFileFactory implements OutputFileCollection {
|
|||||||
return new PackagePartRegistry() {
|
return new PackagePartRegistry() {
|
||||||
@Override
|
@Override
|
||||||
public void addPart(@NotNull String partShortName) {
|
public void addPart(@NotNull String partShortName) {
|
||||||
MapsKt.getOrPut(partsGroupedByPackage, packageFqNameAsString, new Function0<PackageParts>() {
|
PackageParts packageParts = partsGroupedByPackage.get(packageFqNameAsString);
|
||||||
@Override
|
if (packageParts == null) {
|
||||||
public PackageParts invoke() {
|
packageParts = new PackageParts(packageFqNameAsString);
|
||||||
return new PackageParts(packageFqNameAsString);
|
partsGroupedByPackage.put(packageFqNameAsString, packageParts);
|
||||||
}
|
}
|
||||||
}).getParts().add(partShortName);
|
packageParts.addPart(partShortName);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerPackagePartSourceFiles(Collection<KtFile> files) {
|
private void registerPackagePartSourceFiles(Collection<KtFile> files) {
|
||||||
packagePartSourceFiles.addAll(toIoFilesIgnoringNonPhysical(PackagePartClassUtils.getFilesWithCallables(files)));
|
packagePartSourceFiles.addAll(toIoFilesIgnoringNonPhysical(PackagePartClassUtils.getFilesWithCallables(files)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,20 +42,18 @@ private fun Iterable<PackageParts>.addCompiledParts(state: GenerationState): Lis
|
|||||||
|
|
||||||
val mapping = ModuleMapping.create(moduleMappingData, "<incremental>")
|
val mapping = ModuleMapping.create(moduleMappingData, "<incremental>")
|
||||||
|
|
||||||
incrementalCache.getObsoletePackageParts().forEach {
|
incrementalCache.getObsoletePackageParts().forEach { internalName ->
|
||||||
val i = it.lastIndexOf('/')
|
val qualifier = internalName.substringBeforeLast('/', "").replace('/', '.')
|
||||||
val qualifier = if (i == -1) "" else it.substring(0, i).replace('/', '.')
|
val name = internalName.substringAfterLast('/')
|
||||||
val name = it.substring(i + 1)
|
mapping.findPackageParts(qualifier)?.removePart(name)
|
||||||
mapping.findPackageParts(qualifier)?.run { parts.remove(name) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (this + mapping.packageFqName2Parts.values)
|
return (this + mapping.packageFqName2Parts.values)
|
||||||
.groupBy { it.packageFqName }
|
.groupBy { it.packageFqName }
|
||||||
.map {
|
.map { (packageFqName, allOldPackageParts) ->
|
||||||
val (packageFqName, packageParts) = it
|
PackageParts(packageFqName).apply {
|
||||||
val newPackageParts = PackageParts(packageFqName)
|
allOldPackageParts.forEach { packageParts -> this += packageParts }
|
||||||
packageParts.forEach { newPackageParts.parts.addAll(it.parts) }
|
}
|
||||||
newPackageParts
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -115,7 +115,9 @@ open class MetadataSerializer(private val dependOnOldBuiltIns: Boolean) {
|
|||||||
val destFile = File(destDir, getPackageFilePath(packageFqName, file.name))
|
val destFile = File(destDir, getPackageFilePath(packageFqName, file.name))
|
||||||
PackageSerializer(emptyList(), members, packageFqName, destFile).run()
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
|
|||||||
val parseFrom = JvmPackageTable.PackageTable.parseFrom(stream)
|
val parseFrom = JvmPackageTable.PackageTable.parseFrom(stream)
|
||||||
if (parseFrom != null) {
|
if (parseFrom != null) {
|
||||||
val packageFqNameParts = hashMapOf<String, PackageParts>().apply {
|
val packageFqNameParts = hashMapOf<String, PackageParts>().apply {
|
||||||
addParts(this, parseFrom.packagePartsList, PackageParts::parts)
|
addParts(this, parseFrom.packagePartsList, PackageParts::addPart)
|
||||||
addParts(this, parseFrom.metadataPartsList, PackageParts::metadataParts)
|
addParts(this, parseFrom.metadataPartsList, PackageParts::addMetadataPart)
|
||||||
}
|
}
|
||||||
return ModuleMapping(packageFqNameParts, debugName ?: "<unknown>")
|
return ModuleMapping(packageFqNameParts, debugName ?: "<unknown>")
|
||||||
}
|
}
|
||||||
@@ -62,12 +62,12 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
|
|||||||
private inline fun addParts(
|
private inline fun addParts(
|
||||||
result: MutableMap<String, PackageParts>,
|
result: MutableMap<String, PackageParts>,
|
||||||
partsList: List<JvmPackageTable.PackageParts>,
|
partsList: List<JvmPackageTable.PackageParts>,
|
||||||
whichParts: (PackageParts) -> MutableSet<String>
|
addPartOrMetadataPart: (PackageParts, String) -> Unit
|
||||||
) {
|
) {
|
||||||
for (proto in partsList) {
|
for (proto in partsList) {
|
||||||
PackageParts(proto.packageFqName).apply {
|
PackageParts(proto.packageFqName).apply {
|
||||||
result.put(proto.packageFqName, this)
|
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<String, Pac
|
|||||||
|
|
||||||
class PackageParts(val packageFqName: String) {
|
class PackageParts(val packageFqName: String) {
|
||||||
// See JvmPackageTable.PackageTable.package_parts
|
// See JvmPackageTable.PackageTable.package_parts
|
||||||
val parts = linkedSetOf<String>()
|
val parts: Set<String> = linkedSetOf<String>()
|
||||||
// See JvmPackageTable.PackageTable.metadata_parts
|
// See JvmPackageTable.PackageTable.metadata_parts
|
||||||
val metadataParts = linkedSetOf<String>()
|
val metadataParts: Set<String> = linkedSetOf<String>()
|
||||||
|
|
||||||
|
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) {
|
fun addTo(builder: JvmPackageTable.PackageTable.Builder) {
|
||||||
if (parts.isNotEmpty()) {
|
if (parts.isNotEmpty()) {
|
||||||
@@ -96,8 +108,8 @@ class PackageParts(val packageFqName: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
operator fun plusAssign(other: PackageParts) {
|
operator fun plusAssign(other: PackageParts) {
|
||||||
parts.addAll(other.parts)
|
other.parts.forEach(this::addPart)
|
||||||
metadataParts.addAll(other.metadataParts)
|
other.metadataParts.forEach(this::addMetadataPart)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?) =
|
override fun equals(other: Any?) =
|
||||||
|
|||||||
+2
-2
@@ -42,8 +42,8 @@ object KotlinModuleMappingIndex : FileBasedIndexExtension<String, PackageParts>(
|
|||||||
private val VALUE_EXTERNALIZER = object : DataExternalizer<PackageParts> {
|
private val VALUE_EXTERNALIZER = object : DataExternalizer<PackageParts> {
|
||||||
override fun read(input: DataInput): PackageParts? =
|
override fun read(input: DataInput): PackageParts? =
|
||||||
PackageParts(IOUtil.readUTF(input)).apply {
|
PackageParts(IOUtil.readUTF(input)).apply {
|
||||||
parts.addAll(IOUtil.readStringList(input))
|
IOUtil.readStringList(input).forEach(this::addPart)
|
||||||
metadataParts.addAll(IOUtil.readStringList(input))
|
IOUtil.readStringList(input).forEach(this::addMetadataPart)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun save(out: DataOutput, value: PackageParts?) {
|
override fun save(out: DataOutput, value: PackageParts?) {
|
||||||
|
|||||||
Reference in New Issue
Block a user