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 86a43e6f6aa..dbe5acafa61 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 @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.load.kotlin.incremental import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.PackageFragmentProviderOptimized import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder @@ -49,7 +49,7 @@ class IncrementalPackageFragmentProvider( val incrementalCache: IncrementalCache, val target: TargetId, private val kotlinClassFinder: KotlinClassFinder -) : PackageFragmentProvider { +) : PackageFragmentProviderOptimized { private val fqNameToPackageFragment = PackagePartClassUtils.getFilesWithCallables(sourceFiles) .mapTo(hashSetOf()) { it.packageFqName } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/multiplatform/OptionalAnnotationPackageFragmentProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/multiplatform/OptionalAnnotationPackageFragmentProvider.kt index 0c63bf74b17..b766d67aa14 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/multiplatform/OptionalAnnotationPackageFragmentProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/multiplatform/OptionalAnnotationPackageFragmentProvider.kt @@ -33,7 +33,7 @@ class OptionalAnnotationPackageFragmentProvider( notFoundClasses: NotFoundClasses, languageVersionSettings: LanguageVersionSettings, packagePartProvider: PackagePartProvider, -) : PackageFragmentProvider { +) : PackageFragmentProviderOptimized { val packages: Map by storageManager.createLazyValue p@{ // We call getAllOptionalAnnotationClasses under lazy value only because IncrementalPackagePartProvider requires // deserializationConfiguration to be injected. diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt index 89b626ffefa..864bbef9735 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt @@ -8,9 +8,7 @@ package org.jetbrains.kotlin.analyzer import com.intellij.openapi.util.ModificationTracker import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.context.ProjectContext -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -238,7 +236,7 @@ private class DelegatingPackageFragmentProvider( private val module: ModuleDescriptor, moduleContent: ModuleContent, private val packageOracle: PackageOracle -) : PackageFragmentProvider { +) : PackageFragmentProviderOptimized { private val syntheticFilePackages = moduleContent.syntheticFiles.map { it.packageFqName }.toSet() override fun getPackageFragments(fqName: FqName): List { @@ -250,7 +248,7 @@ private class DelegatingPackageFragmentProvider( override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) { if (certainlyDoesNotExist(fqName)) return - resolverForProject.resolverForModuleDescriptor(module).packageFragmentProvider.collectPackageFragments(fqName, packageFragments) + resolverForProject.resolverForModuleDescriptor(module).packageFragmentProvider.collectPackageFragmentsOptimizedIfPossible(fqName, packageFragments) } override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java index 7f38d196fa5..a4ea5c5269f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java @@ -179,7 +179,7 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { this.declarationProviderFactory = declarationProviderFactory; - this.packageFragmentProvider = new PackageFragmentProvider() { + this.packageFragmentProvider = new PackageFragmentProviderOptimized() { @Override public void collectPackageFragments( @NotNull FqName fqName, @NotNull Collection packageFragments diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider.kt index d33fa57941f..7abdd88f83c 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.load.java.lazy import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.PackageFragmentProviderOptimized import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull class LazyJavaPackageFragmentProvider( components: JavaResolverComponents -) : PackageFragmentProvider { +) : PackageFragmentProviderOptimized { private val c = LazyJavaResolverContext(components, TypeParameterResolver.EMPTY, lazyOf(null)) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProvider.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProvider.kt index 64a15597ec7..49312860164 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProvider.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProvider.kt @@ -20,27 +20,35 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name interface PackageFragmentProvider { - fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) { - // default implementation is provided only for BWC - packageFragments.addAll(getPackageFragments(fqName)) - } - @Deprecated("for usages use #packageFragments(FqName) at final point, for impl use #collectPackageFragments(FqName, MutableCollection)") fun getPackageFragments(fqName: FqName): List fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection object Empty : PackageFragmentProvider { - override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) {} - override fun getPackageFragments(fqName: FqName) = emptyList() override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean) = emptySet() } } +interface PackageFragmentProviderOptimized : PackageFragmentProvider { + fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) +} + fun PackageFragmentProvider.packageFragments(fqName: FqName): List { val packageFragments = mutableListOf() - collectPackageFragments(fqName, packageFragments) + collectPackageFragmentsOptimizedIfPossible(fqName, packageFragments) return packageFragments } + +fun PackageFragmentProvider.collectPackageFragmentsOptimizedIfPossible( + fqName: FqName, + packageFragments: MutableCollection +) { + when (this) { + is PackageFragmentProviderOptimized -> collectPackageFragments(fqName, packageFragments) + else -> packageFragments.addAll(getPackageFragments(fqName)) + } +} + diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt index dc822c6b217..de18cfd7766 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.name.Name class PackageFragmentProviderImpl( private val packageFragments: Collection -) : PackageFragmentProvider { +) : PackageFragmentProviderOptimized { override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) { this.packageFragments.filterTo(packageFragments) { it.fqName == fqName } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/CompositePackageFragmentProvider.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/CompositePackageFragmentProvider.kt index b2cfc935b2d..3b2dab2ef0d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/CompositePackageFragmentProvider.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/CompositePackageFragmentProvider.kt @@ -18,13 +18,15 @@ package org.jetbrains.kotlin.descriptors.impl import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.PackageFragmentProviderOptimized +import org.jetbrains.kotlin.descriptors.collectPackageFragmentsOptimizedIfPossible import org.jetbrains.kotlin.name.FqName import java.util.* import org.jetbrains.kotlin.name.Name class CompositePackageFragmentProvider(// can be modified from outside private val providers: List -) : PackageFragmentProvider { +) : PackageFragmentProviderOptimized { init { assert(providers.size == providers.toSet().size) { @@ -35,14 +37,14 @@ class CompositePackageFragmentProvider(// can be modified from outside override fun getPackageFragments(fqName: FqName): List { val result = ArrayList() for (provider in providers) { - provider.collectPackageFragments(fqName, result) + provider.collectPackageFragmentsOptimizedIfPossible(fqName, result) } return result.toList() } override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) { for (provider in providers) { - provider.collectPackageFragments(fqName, packageFragments) + provider.collectPackageFragmentsOptimizedIfPossible(fqName, packageFragments) } } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt index 7780b4a1cce..48f3b14e273 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.PackageFragmentProviderOptimized import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.StorageManager @@ -28,7 +28,7 @@ abstract class AbstractDeserializedPackageFragmentProvider( protected val storageManager: StorageManager, protected val finder: KotlinMetadataFinder, protected val moduleDescriptor: ModuleDescriptor -) : PackageFragmentProvider { +) : PackageFragmentProviderOptimized { protected lateinit var components: DeserializationComponents private val fragments = storageManager.createMemoizedFunctionWithNullableValues { fqName -> diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompilerBase.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompilerBase.kt index f6e38226811..9a3b3d551c9 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompilerBase.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompilerBase.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.PackageFragmentProviderOptimized import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor import org.jetbrains.kotlin.name.ClassId @@ -28,7 +29,7 @@ abstract class DeserializerForDecompilerBase(val directoryPackageFqName: FqName) protected val moduleDescriptor: ModuleDescriptorImpl = createDummyModule("module for building decompiled sources") - protected val packageFragmentProvider: PackageFragmentProvider = object : PackageFragmentProvider { + protected val packageFragmentProvider: PackageFragmentProvider = object : PackageFragmentProviderOptimized { override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) { packageFragments.add(createDummyPackageFragment(fqName)) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedPackageFragmentProvider.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedPackageFragmentProvider.kt index c6be0379a67..1da0bb061d4 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedPackageFragmentProvider.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedPackageFragmentProvider.kt @@ -7,10 +7,11 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.PackageFragmentProviderOptimized import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -internal class CommonizedPackageFragmentProvider : PackageFragmentProvider { +internal class CommonizedPackageFragmentProvider : PackageFragmentProviderOptimized { private val packageFragments = ArrayList() operator fun plusAssign(packageFragment: PackageFragmentDescriptor) { diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt index 0be3714c4b3..13eef39532d 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.android.synthetic.forEachUntilLast import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.PackageFragmentProviderOptimized import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -132,7 +133,7 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider class AndroidSyntheticPackageFragmentProvider( val packages: Map PackageFragmentDescriptor> -) : PackageFragmentProvider { +) : PackageFragmentProviderOptimized { override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) = packageFragments.addIfNotNull(packages[fqName]?.invoke())