From 7c6352a9f2424a165ef6156a712a3f0a18480916 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 3 Oct 2016 18:02:33 +0300 Subject: [PATCH] Refactor IncrementalPackageFragmentProvider --- .../kotlin/codegen/MultifileClassCodegen.kt | 7 +- .../IncrementalPackageFragmentProvider.kt | 86 +++++++------------ 2 files changed, 33 insertions(+), 60 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index f990c59cebe..a61c30dbe33 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -91,7 +91,7 @@ class MultifileClassCodegen( } } compiledPackageFragment?.let { - partInternalNamesSet.addAll(it.partsNames) + partInternalNamesSet.addAll(it.partsInternalNames) } partInternalNamesSet.sorted() } @@ -382,8 +382,9 @@ class MultifileClassCodegen( private fun FqName.toAsmType() = AsmUtil.asmTypeByFqNameWithoutInnerClasses(this) - private fun getCompiledPackageFragment(facadeFqName: FqName, state: GenerationState): - IncrementalPackageFragmentProvider.IncrementalPackageFragment.IncrementalMultifileClassPackageFragment? { + private fun getCompiledPackageFragment( + facadeFqName: FqName, state: GenerationState + ): IncrementalPackageFragmentProvider.IncrementalMultifileClassPackageFragment? { if (!IncrementalCompilation.isEnabled()) return null val packageFqName = facadeFqName.parent() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt index 8d800ffda16..e841d12b09f 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.load.kotlin.incremental -import com.intellij.util.containers.MultiMap import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider @@ -24,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache -import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -37,7 +35,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList -import java.util.* +import org.jetbrains.kotlin.utils.keysToMap class IncrementalPackageFragmentProvider( sourceFiles: Collection, @@ -47,31 +45,12 @@ class IncrementalPackageFragmentProvider( val incrementalCache: IncrementalCache, val target: TargetId ) : PackageFragmentProvider { - val fqNameToSubFqNames = MultiMap() - val fqNameToPackageFragment = HashMap() - val fqNamesToLoad: Set = PackagePartClassUtils.getFilesWithCallables(sourceFiles).map { it.packageFqName }.toSet() + val fqNameToPackageFragment = + PackagePartClassUtils.getFilesWithCallables(sourceFiles) + .mapTo(hashSetOf()) { it.packageFqName } + .keysToMap(this::IncrementalPackageFragment) - init { - fun createPackageFragment(fqName: FqName) { - if (fqNameToPackageFragment.containsKey(fqName)) { - return - } - - if (!fqName.isRoot) { - val parent = fqName.parent() - createPackageFragment(parent) - fqNameToSubFqNames.putValue(parent, fqName) - } - - fqNameToPackageFragment[fqName] = IncrementalPackageFragment(fqName) - } - - fqNamesToLoad.forEach(::createPackageFragment) - } - - override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection { - return fqNameToSubFqNames[fqName].orEmpty() - } + override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection = emptySet() override fun getPackageFragments(fqName: FqName): List { return fqNameToPackageFragment[fqName].singletonOrEmptyList() @@ -89,38 +68,31 @@ class IncrementalPackageFragmentProvider( } override fun getMemberScope(): MemberScope = MemberScope.Empty + } - inner class IncrementalMultifileClassPackageFragment( - val multifileClassFqName: FqName, - val partsNames: Collection - ) : PackageFragmentDescriptorImpl(moduleDescriptor, multifileClassFqName.parent()) { - val memberScope = storageManager.createLazyValue { - val partsData = partsNames.mapNotNull { internalName -> - incrementalCache.getPackagePartData(internalName)?.let { internalName to it } - } - if (partsData.isEmpty()) - MemberScope.Empty - else { - ChainedMemberScope( - "Member scope for incremental compilation: union of multifile class parts data for $multifileClassFqName", - partsData.map { createPackageScope(it.first, it.second, multifileClassFqName.asString()) } - ) - } - } - - override fun getMemberScope(): MemberScope = memberScope() - } - - fun createPackageScope(internalName: String, part: JvmPackagePartProto, facadeFqName: String?): DeserializedPackageMemberScope { - val packageData = JvmProtoBufUtil.readPackageDataFrom(part.data, part.strings) - return DeserializedPackageMemberScope( - this, packageData.packageProto, packageData.nameResolver, - JvmPackagePartSource( - JvmClassName.byInternalName(internalName), - facadeFqName?.let(JvmClassName::byFqNameWithoutInnerClasses) - ), - deserializationComponents, { listOf() } + inner class IncrementalMultifileClassPackageFragment( + private val multifileClassFqName: FqName, + val partsInternalNames: Collection + ) : PackageFragmentDescriptorImpl(moduleDescriptor, multifileClassFqName.parent()) { + private val memberScope = storageManager.createLazyValue { + ChainedMemberScope.create( + "Member scope for incremental compilation: union of multifile class parts data for $multifileClassFqName", + partsInternalNames.mapNotNull { internalName -> + incrementalCache.getPackagePartData(internalName)?.let { proto -> + val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(proto.data, proto.strings) + DeserializedPackageMemberScope( + this, packageProto, nameResolver, + JvmPackagePartSource( + JvmClassName.byInternalName(internalName), + JvmClassName.byFqNameWithoutInnerClasses(multifileClassFqName.asString()) + ), + deserializationComponents, classNames = { emptyList() } + ) + } + } ) } + + override fun getMemberScope() = memberScope() } }