diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt index 80af978819be5..997d931a82a49 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt @@ -19,23 +19,27 @@ package org.jetbrains.kotlin.descriptors import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -class PackageFragmentProviderImpl( - private val packageFragments: Collection +class PackageFragmentProviderImpl private constructor( + private val packageFragmentsByFqName: HashMap> ) : PackageFragmentProviderOptimized { + constructor(packageFragments: Collection) : this( + packageFragmentsByFqName = packageFragments.groupBy { it.fqName } as HashMap> + ) + override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) { - this.packageFragments.filterTo(packageFragments) { it.fqName == fqName } + packageFragments.addAll(packageFragmentsByFqName.getOrDefault(fqName, listOf())) } override fun isEmpty(fqName: FqName): Boolean = - this.packageFragments.none { it.fqName == fqName } + packageFragmentsByFqName.getOrDefault(fqName, null) != null @Deprecated("for usages use #packageFragments(FqName) at final point, for impl use #collectPackageFragments(FqName, MutableCollection)") override fun getPackageFragments(fqName: FqName): List = - packageFragments.filter { it.fqName == fqName } + packageFragmentsByFqName.getOrDefault(fqName, emptyList()) override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection = - packageFragments.asSequence() - .map { it.fqName } + packageFragmentsByFqName.values + .flatMap { collection -> collection.map { it.fqName } } .filter { !it.isRoot && it.parent() == fqName } .toList() }