Even faster completion of root packages
This commit is contained in:
+1
-1
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+1
-1
@@ -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() }
|
||||
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
|
||||
+2
-1
@@ -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>
|
||||
}
|
||||
|
||||
+2
-1
@@ -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(
|
||||
|
||||
+3
-4
@@ -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)
|
||||
|
||||
+2
-2
@@ -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> {
|
||||
|
||||
+1
-2
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user