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 { open class DelegatePackageMemberDeclarationProvider(var delegate: PackageMemberDeclarationProvider) : PackageMemberDeclarationProvider {
// Can't use Kotlin delegate feature because of inability to change delegate object in runtime (KT-5870) // 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() override fun getPackageFiles() = delegate.getPackageFiles()
@@ -168,7 +168,7 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
if (packageDescriptor == null) { if (packageDescriptor == null) {
return Collections.emptyList(); 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 import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
public class CombinedPackageMemberDeclarationProvider(val providers: Collection<PackageMemberDeclarationProvider>) : PackageMemberDeclarationProvider { 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() } 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.psi.JetFile
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
public class FileBasedPackageMemberDeclarationProvider internal constructor( 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 override fun getPackageFiles() = packageFiles
@@ -19,9 +19,10 @@ package org.jetbrains.kotlin.resolve.lazy.declarations
import org.jetbrains.annotations.ReadOnly import org.jetbrains.annotations.ReadOnly
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
public trait PackageMemberDeclarationProvider : DeclarationProvider { public trait PackageMemberDeclarationProvider : DeclarationProvider {
public fun getAllDeclaredSubPackages(): Collection<FqName> public fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection<FqName>
public fun getPackageFiles(): Collection<JetFile> 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.BodyResolveMode;
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil;
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer; import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer;
import org.jetbrains.kotlin.resolve.scopes.JetScope;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
@@ -204,7 +205,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
@NotNull @NotNull
@Override @Override
public Collection<FqName> getSubPackages(@NotNull FqName fqn, @NotNull GlobalSearchScope scope) { 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 @Nullable
@@ -27,14 +27,16 @@ import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.CachedValueProvider.Result import com.intellij.psi.util.CachedValueProvider.Result
import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.util.PsiModificationTracker
import org.jetbrains.kotlin.name.Name
public object PackageIndexUtil { public object PackageIndexUtil {
platformStatic public fun getSubPackageFqNames( platformStatic public fun getSubPackageFqNames(
packageFqName: FqName, packageFqName: FqName,
scope: GlobalSearchScope, scope: GlobalSearchScope,
project: Project project: Project,
nameFilter: (Name) -> Boolean
): Collection<FqName> { ): Collection<FqName> {
return SubpackagesIndexService.getInstance(project).getSubpackages(packageFqName, scope) return SubpackagesIndexService.getInstance(project).getSubpackages(packageFqName, scope, nameFilter)
} }
platformStatic public fun findFilesWithExactPackage( 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 possibleFilesFqNames = fqNameByPrefix[fqName]
val existingSubPackagesShortNames = HashSet<Name>() val existingSubPackagesShortNames = HashSet<Name>()
val len = fqName.pathSegments().size() val len = fqName.pathSegments().size()
for (filesFqName in possibleFilesFqNames) { for (filesFqName in possibleFilesFqNames) {
val candidateSubPackageShortName = filesFqName.pathSegments()[len] val candidateSubPackageShortName = filesFqName.pathSegments()[len]
if (candidateSubPackageShortName in existingSubPackagesShortNames) { if (candidateSubPackageShortName in existingSubPackagesShortNames || !nameFilter(candidateSubPackageShortName)) continue
continue
}
val existsInThisScope = PackageIndexUtil.containsFilesWithExactPackage(filesFqName, scope, project) val existsInThisScope = PackageIndexUtil.containsFilesWithExactPackage(filesFqName, scope, project)
if (existsInThisScope) { if (existsInThisScope) {
existingSubPackagesShortNames.add(candidateSubPackageShortName) existingSubPackagesShortNames.add(candidateSubPackageShortName)
@@ -77,8 +77,8 @@ public class StubBasedPackageMemberDeclarationProvider(
return JetTopLevelPropertyFqnNameIndex.getInstance().get(childName(name), project, searchScope) return JetTopLevelPropertyFqnNameIndex.getInstance().get(childName(name), project, searchScope)
} }
override fun getAllDeclaredSubPackages(): Collection<FqName> { override fun getAllDeclaredSubPackages(nameFilter: (Name) -> Boolean): Collection<FqName> {
return PackageIndexUtil.getSubPackageFqNames(fqName, searchScope, project) return PackageIndexUtil.getSubPackageFqNames(fqName, searchScope, project, nameFilter)
} }
override fun getPackageFiles(): Collection<JetFile> { 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 // 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) { if (isNoQualifierContext() && (completionKind.descriptorKindFilter?.kindMask ?: 0).and(DescriptorKindFilter.PACKAGES_MASK) != 0) {
//TODO: move this code somewhere else //TODO: move this code somewhere else
//TODO: filter by prefix for better performance? val packageNames = PackageIndexUtil.getSubPackageFqNames(FqName.ROOT, originalSearchScope, project, prefixMatcher.asNameFilter())
val packageNames = PackageIndexUtil.getSubPackageFqNames(FqName.ROOT, originalSearchScope, project)
.map { it.shortName() } .map { it.shortName() }
.toMutableSet() .toMutableSet()