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 dbe5acafa61..9424cc30b9b 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 @@ -60,6 +60,8 @@ class IncrementalPackageFragmentProvider( override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) = packageFragments.addIfNotNull(fqNameToPackageFragment[fqName]) + override fun isEmpty(fqName: FqName): Boolean = !fqNameToPackageFragment.containsKey(fqName) + override fun getPackageFragments(fqName: FqName): List { return listOfNotNull(fqNameToPackageFragment[fqName]) } 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 b766d67aa14..e871bc16971 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 @@ -83,6 +83,9 @@ class OptionalAnnotationPackageFragmentProvider( override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) = packageFragments.addIfNotNull(packages[fqName]) + override fun isEmpty(fqName: FqName): Boolean = + !packages.containsKey(fqName) + override fun getPackageFragments(fqName: FqName): List = packages[fqName]?.let(::listOf).orEmpty() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt index 9067ec4f15e..ec1c7f5240f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt @@ -252,6 +252,12 @@ private class DelegatingPackageFragmentProvider( resolverForProject.resolverForModuleDescriptor(module).packageFragmentProvider.collectPackageFragmentsOptimizedIfPossible(fqName, packageFragments) } + override fun isEmpty(fqName: FqName): Boolean { + if (certainlyDoesNotExist(fqName)) return true + + return resolverForProject.resolverForModuleDescriptor(module).packageFragmentProvider.isEmpty(fqName) + } + override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection { if (certainlyDoesNotExist(fqName)) return emptyList() 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 0f714ca4918..79b1f37cab7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java @@ -204,6 +204,12 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { } } + @Override + public boolean isEmpty(@NotNull FqName fqName) { + PackageMemberDeclarationProvider provider = declarationProviderFactory.getPackageMemberDeclarationProvider(fqName); + return provider == null; + } + @NotNull @Override public List getPackageFragments(@NotNull FqName fqName) { 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 7abdd88f83c..ef6b4dd97e5 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 @@ -46,6 +46,10 @@ class LazyJavaPackageFragmentProvider( override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) = packageFragments.addIfNotNull(getPackageFragment(fqName)) + override fun isEmpty(fqName: FqName): Boolean { + return c.components.finder.findPackage(fqName) == null + } + override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean) = getPackageFragment(fqName)?.getSubPackageFqNames().orEmpty() } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProvider.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProvider.kt index a0644a36db6..aa73a1f330e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProvider.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProvider.kt @@ -34,6 +34,7 @@ interface PackageFragmentProvider { interface PackageFragmentProviderOptimized : PackageFragmentProvider { fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) + fun isEmpty(fqName: FqName): Boolean } fun PackageFragmentProvider.packageFragments(fqName: FqName): List { @@ -42,6 +43,13 @@ fun PackageFragmentProvider.packageFragments(fqName: FqName): List isEmpty(fqName) + else -> packageFragments(fqName).isEmpty() + } +} + fun PackageFragmentProvider.collectPackageFragmentsOptimizedIfPossible( fqName: FqName, packageFragments: MutableCollection diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt index de18cfd7766..0c6632e8469 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl.kt @@ -26,6 +26,9 @@ class PackageFragmentProviderImpl( this.packageFragments.filterTo(packageFragments) { it.fqName == fqName } } + override fun isEmpty(fqName: FqName): Boolean = + this.packageFragments.none { it.fqName == fqName } + override fun getPackageFragments(fqName: FqName): List = packageFragments.filter { 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 3b2dab2ef0d..7dc148fd8fe 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/CompositePackageFragmentProvider.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/CompositePackageFragmentProvider.kt @@ -16,10 +16,7 @@ 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.descriptors.* import org.jetbrains.kotlin.name.FqName import java.util.* import org.jetbrains.kotlin.name.Name @@ -48,6 +45,9 @@ class CompositePackageFragmentProvider(// can be modified from outside } } + override fun isEmpty(fqName: FqName): Boolean = + providers.all { it.isEmpty(fqName) } + override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection { val result = HashSet() for (provider in providers) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt index 8732dec07fe..7afa5144a0a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt @@ -16,11 +16,8 @@ package org.jetbrains.kotlin.descriptors.impl -import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.PackageViewDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.descriptors.packageFragments import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope import org.jetbrains.kotlin.resolve.scopes.LazyScopeAdapter @@ -38,8 +35,14 @@ open class LazyPackageViewDescriptorImpl( module.packageFragmentProvider.packageFragments(fqName) } + protected val empty: Boolean by storageManager.createLazyValue { + module.packageFragmentProvider.isEmpty(fqName) + } + + override fun isEmpty(): Boolean = empty + override val memberScope: MemberScope = LazyScopeAdapter(storageManager) { - if (fragments.isEmpty()) { + if (isEmpty()) { MemberScope.Empty } else { // Packages from SubpackagesScope are got via getContributedDescriptors(DescriptorKindFilter.PACKAGES, MemberScope.ALL_NAME_FILTER) 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 48f3b14e273..417e561e27c 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt @@ -43,6 +43,15 @@ abstract class AbstractDeserializedPackageFragmentProvider( packageFragments.addIfNotNull(fragments(fqName)) } + override fun isEmpty(fqName: FqName): Boolean { + val descriptor = if (fragments.isComputed(fqName)) { + fragments.invoke(fqName) + } else { + findPackage(fqName) + } + return descriptor == null + } + override fun getPackageFragments(fqName: FqName): List = listOfNotNull(fragments(fqName)) override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection = emptySet() 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 9a3b3d551c9..3fe4393d027 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 @@ -34,6 +34,8 @@ abstract class DeserializerForDecompilerBase(val directoryPackageFqName: FqName) packageFragments.add(createDummyPackageFragment(fqName)) } + override fun isEmpty(fqName: FqName): Boolean = false + override fun getPackageFragments(fqName: FqName): List { return listOf(createDummyPackageFragment(fqName)) } 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 13eef39532d..cab7bdcd224 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 @@ -137,6 +137,8 @@ class AndroidSyntheticPackageFragmentProvider( override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) = packageFragments.addIfNotNull(packages[fqName]?.invoke()) + override fun isEmpty(fqName: FqName): Boolean = !packages.containsKey(fqName) + override fun getPackageFragments(fqName: FqName) = listOfNotNull(packages[fqName]?.invoke()) override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): List {