Even faster completion of root packages

This commit is contained in:
Valentin Kipyatkov
2015-07-15 22:06:33 +03:00
parent 136af1cd60
commit 16d503aed0
10 changed files with 19 additions and 16 deletions
@@ -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()
@@ -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);
}
};
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
public class CombinedPackageMemberDeclarationProvider(val providers: Collection<PackageMemberDeclarationProvider>) : 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() }
@@ -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<FqName> = allDeclaredSubPackages()
override fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection<FqName> = allDeclaredSubPackages()
override fun getPackageFiles() = packageFiles
@@ -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<FqName>
public fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection<FqName>
public fun getPackageFiles(): Collection<JetFile>
}
@@ -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<FqName> 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
@@ -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<FqName> {
return SubpackagesIndexService.getInstance(project).getSubpackages(packageFqName, scope)
return SubpackagesIndexService.getInstance(project).getSubpackages(packageFqName, scope, nameFilter)
}
platformStatic public fun findFilesWithExactPackage(
@@ -59,15 +59,14 @@ public class SubpackagesIndexService(private val project: Project) {
}
}
public fun getSubpackages(fqName: FqName, scope: GlobalSearchScope): Collection<FqName> {
public fun getSubpackages(fqName: FqName, scope: GlobalSearchScope, nameFilter: (Name) -> Boolean): Collection<FqName> {
val possibleFilesFqNames = fqNameByPrefix[fqName]
val existingSubPackagesShortNames = HashSet<Name>()
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)
@@ -77,8 +77,8 @@ public class StubBasedPackageMemberDeclarationProvider(
return JetTopLevelPropertyFqnNameIndex.getInstance().get(childName(name), project, searchScope)
}
override fun getAllDeclaredSubPackages(): Collection<FqName> {
return PackageIndexUtil.getSubPackageFqNames(fqName, searchScope, project)
override fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection<FqName> {
return PackageIndexUtil.getSubPackageFqNames(fqName, searchScope, project, nameFilter)
}
override fun getPackageFiles(): Collection<JetFile> {
@@ -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()