diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt index 0253d888110..18eff93dde9 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter open class DelegatePackageMemberDeclarationProvider(var delegate: PackageMemberDeclarationProvider) : PackageMemberDeclarationProvider { // Can't use Kotlin delegate feature because of inability to change delegate object in runtime (KT-5870) - override fun getAllDeclaredSubPackages() = delegate.getAllDeclaredSubPackages() + override fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean) = delegate.getAllDeclaredSubPackages(nameFilter) override fun getPackageFiles() = delegate.getPackageFiles() 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 bfe286bb530..eac97c6719c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java @@ -168,7 +168,7 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { if (packageDescriptor == null) { return Collections.emptyList(); } - return packageDescriptor.getDeclarationProvider().getAllDeclaredSubPackages(); + return packageDescriptor.getDeclarationProvider().getAllDeclaredSubPackages(nameFilter); } }; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt index 8b56cd67db2..a70311559be 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter public class CombinedPackageMemberDeclarationProvider(val providers: Collection) : PackageMemberDeclarationProvider { - override fun getAllDeclaredSubPackages() = providers.flatMap { it.getAllDeclaredSubPackages() } + override fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean) = providers.flatMap { it.getAllDeclaredSubPackages(nameFilter) } override fun getPackageFiles() = providers.flatMap { it.getPackageFiles() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedPackageMemberDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedPackageMemberDeclarationProvider.kt index e2b899946bf..c9d9eb272f7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedPackageMemberDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedPackageMemberDeclarationProvider.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.resolve.lazy.declarations import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.StorageManager public class FileBasedPackageMemberDeclarationProvider internal constructor( @@ -40,7 +41,7 @@ public class FileBasedPackageMemberDeclarationProvider internal constructor( } } - override fun getAllDeclaredSubPackages(): Collection = allDeclaredSubPackages() + override fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection = allDeclaredSubPackages() override fun getPackageFiles() = packageFiles diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/PackageMemberDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/PackageMemberDeclarationProvider.kt index fdd4170e82a..7f200b7b119 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/PackageMemberDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/PackageMemberDeclarationProvider.kt @@ -19,9 +19,10 @@ package org.jetbrains.kotlin.resolve.lazy.declarations import org.jetbrains.annotations.ReadOnly import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name public trait PackageMemberDeclarationProvider : DeclarationProvider { - public fun getAllDeclaredSubPackages(): Collection + public fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection public fun getPackageFiles(): Collection } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.java index cb1b09ccf46..d88993b8072 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDELightClassGenerationSupport.java @@ -59,6 +59,7 @@ import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode; import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer; +import org.jetbrains.kotlin.resolve.scopes.JetScope; import java.io.IOException; import java.util.*; @@ -204,7 +205,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport @NotNull @Override public Collection getSubPackages(@NotNull FqName fqn, @NotNull GlobalSearchScope scope) { - return PackageIndexUtil.getSubPackageFqNames(fqn, kotlinSourceAndClassFiles(scope, project), project); + return PackageIndexUtil.getSubPackageFqNames(fqn, kotlinSourceAndClassFiles(scope, project), project, JetScope.ALL_NAME_FILTER); } @Nullable diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/PackageIndexUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/PackageIndexUtil.kt index 77c83de0381..556258abbbb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/PackageIndexUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/PackageIndexUtil.kt @@ -27,14 +27,16 @@ import org.jetbrains.kotlin.load.kotlin.PackageClassUtils import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.CachedValueProvider.Result import com.intellij.psi.util.PsiModificationTracker +import org.jetbrains.kotlin.name.Name public object PackageIndexUtil { platformStatic public fun getSubPackageFqNames( packageFqName: FqName, scope: GlobalSearchScope, - project: Project + project: Project, + nameFilter: (Name) -> Boolean ): Collection { - return SubpackagesIndexService.getInstance(project).getSubpackages(packageFqName, scope) + return SubpackagesIndexService.getInstance(project).getSubpackages(packageFqName, scope, nameFilter) } platformStatic public fun findFilesWithExactPackage( diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt index 5da45903c66..4669e5f2b5c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt @@ -59,15 +59,14 @@ public class SubpackagesIndexService(private val project: Project) { } } - public fun getSubpackages(fqName: FqName, scope: GlobalSearchScope): Collection { + public fun getSubpackages(fqName: FqName, scope: GlobalSearchScope, nameFilter: (Name) -> Boolean): Collection { val possibleFilesFqNames = fqNameByPrefix[fqName] val existingSubPackagesShortNames = HashSet() val len = fqName.pathSegments().size() for (filesFqName in possibleFilesFqNames) { val candidateSubPackageShortName = filesFqName.pathSegments()[len] - if (candidateSubPackageShortName in existingSubPackagesShortNames) { - continue - } + if (candidateSubPackageShortName in existingSubPackagesShortNames || !nameFilter(candidateSubPackageShortName)) continue + val existsInThisScope = PackageIndexUtil.containsFilesWithExactPackage(filesFqName, scope, project) if (existsInThisScope) { existingSubPackagesShortNames.add(candidateSubPackageShortName) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt index 1c8af0c3552..c9372752aa6 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt @@ -77,8 +77,8 @@ public class StubBasedPackageMemberDeclarationProvider( return JetTopLevelPropertyFqnNameIndex.getInstance().get(childName(name), project, searchScope) } - override fun getAllDeclaredSubPackages(): Collection { - return PackageIndexUtil.getSubPackageFqNames(fqName, searchScope, project) + override fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection { + return PackageIndexUtil.getSubPackageFqNames(fqName, searchScope, project, nameFilter) } override fun getPackageFiles(): Collection { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index 78b43a12356..52e3314746c 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -204,8 +204,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, // getting root packages from scope is very slow so we do this in alternative way if (isNoQualifierContext() && (completionKind.descriptorKindFilter?.kindMask ?: 0).and(DescriptorKindFilter.PACKAGES_MASK) != 0) { //TODO: move this code somewhere else - //TODO: filter by prefix for better performance? - val packageNames = PackageIndexUtil.getSubPackageFqNames(FqName.ROOT, originalSearchScope, project) + val packageNames = PackageIndexUtil.getSubPackageFqNames(FqName.ROOT, originalSearchScope, project, prefixMatcher.asNameFilter()) .map { it.shortName() } .toMutableSet()