Implement LazyPackageMemberScope::getFunctions/VariableNames

It's necessary for future optimizations
Although current implementation is rather conservative,
it should be enough for current needs
This commit is contained in:
Denis Zharkov
2017-08-15 17:31:32 +07:00
parent 688a359985
commit 1b255b4ed0
7 changed files with 25 additions and 1 deletions
@@ -41,4 +41,6 @@ open class DelegatePackageMemberDeclarationProvider(var delegate: PackageMemberD
override fun getClassOrObjectDeclarations(name: Name) = delegate.getClassOrObjectDeclarations(name) override fun getClassOrObjectDeclarations(name: Name) = delegate.getClassOrObjectDeclarations(name)
override fun getTypeAliasDeclarations(name: Name) = delegate.getTypeAliasDeclarations(name) override fun getTypeAliasDeclarations(name: Name) = delegate.getTypeAliasDeclarations(name)
override fun getDeclarationNames() = delegate.getDeclarationNames()
} }
@@ -131,6 +131,7 @@ class SyntheticClassOrObjectDescriptor(
override fun getDestructuringDeclarationsEntries(name: Name): Collection<KtDestructuringDeclarationEntry> = emptyList() override fun getDestructuringDeclarationsEntries(name: Name): Collection<KtDestructuringDeclarationEntry> = emptyList()
override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo> = emptyList() override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo> = emptyList()
override fun getTypeAliasDeclarations(name: Name): Collection<KtTypeAlias> = emptyList() override fun getTypeAliasDeclarations(name: Name): Collection<KtTypeAlias> = emptyList()
override fun getDeclarationNames() = emptySet<Name>()
} }
internal inner class SyntheticDeclaration( internal inner class SyntheticDeclaration(
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.resolve.lazy.declarations package org.jetbrains.kotlin.resolve.lazy.declarations
import com.google.common.collect.ArrayListMultimap import com.google.common.collect.ArrayListMultimap
import com.google.common.collect.Sets
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve
@@ -37,6 +38,7 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage
val classesAndObjects = ArrayListMultimap.create<Name, KtClassLikeInfo>() // order matters here val classesAndObjects = ArrayListMultimap.create<Name, KtClassLikeInfo>() // order matters here
val typeAliases = ArrayListMultimap.create<Name, KtTypeAlias>() val typeAliases = ArrayListMultimap.create<Name, KtTypeAlias>()
val destructuringDeclarationsEntries = ArrayListMultimap.create<Name, KtDestructuringDeclarationEntry>() val destructuringDeclarationsEntries = ArrayListMultimap.create<Name, KtDestructuringDeclarationEntry>()
val names = Sets.newHashSet<Name>()
fun putToIndex(declaration: KtDeclaration) { fun putToIndex(declaration: KtDeclaration) {
if (declaration is KtAnonymousInitializer || declaration is KtSecondaryConstructor) return if (declaration is KtAnonymousInitializer || declaration is KtSecondaryConstructor) return
@@ -57,7 +59,9 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage
} }
is KtDestructuringDeclaration -> { is KtDestructuringDeclaration -> {
for (entry in declaration.entries) { for (entry in declaration.entries) {
destructuringDeclarationsEntries.put(safeNameForLazyResolve(entry.nameAsName), entry) val name = safeNameForLazyResolve(entry.nameAsName)
destructuringDeclarationsEntries.put(name, entry)
names.add(name)
} }
} }
is KtParameter -> { is KtParameter -> {
@@ -65,11 +69,17 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage
} }
else -> throw IllegalArgumentException("Unknown declaration: " + declaration) else -> throw IllegalArgumentException("Unknown declaration: " + declaration)
} }
when (declaration) {
is KtNamedDeclaration -> names.add(safeNameForLazyResolve(declaration))
}
} }
override fun toString() = "allDeclarations: " + allDeclarations.mapNotNull { it.name } override fun toString() = "allDeclarations: " + allDeclarations.mapNotNull { it.name }
} }
override fun getDeclarationNames() = index().names
private val index = storageManager.createLazyValue<Index> { private val index = storageManager.createLazyValue<Index> {
val index = Index() val index = Index()
doCreateIndex(index) doCreateIndex(index)
@@ -41,4 +41,6 @@ class CombinedPackageMemberDeclarationProvider(
override fun getClassOrObjectDeclarations(name: Name) = providers.flatMap { it.getClassOrObjectDeclarations(name) } override fun getClassOrObjectDeclarations(name: Name) = providers.flatMap { it.getClassOrObjectDeclarations(name) }
override fun getTypeAliasDeclarations(name: Name) = providers.flatMap { it.getTypeAliasDeclarations(name) } override fun getTypeAliasDeclarations(name: Name) = providers.flatMap { it.getTypeAliasDeclarations(name) }
override fun getDeclarationNames(): Set<Name> = providers.flatMapTo(HashSet()) { it.getDeclarationNames() }
} }
@@ -33,4 +33,6 @@ interface DeclarationProvider {
fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo> fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo>
fun getTypeAliasDeclarations(name: Name): Collection<KtTypeAlias> fun getTypeAliasDeclarations(name: Name): Collection<KtTypeAlias>
fun getDeclarationNames(): Set<Name>
} }
@@ -58,6 +58,9 @@ class LazyPackageMemberScope(
c.lookupTracker.record(from, thisDescriptor, name) c.lookupTracker.record(from, thisDescriptor, name)
} }
override fun getFunctionNames() = declarationProvider.getDeclarationNames()
override fun getVariableNames() = declarationProvider.getDeclarationNames()
// Do not add details here, they may compromise the laziness during debugging // Do not add details here, they may compromise the laziness during debugging
override fun toString() = "lazy scope for package " + thisDescriptor.name override fun toString() = "lazy scope for package " + thisDescriptor.name
} }
@@ -61,6 +61,10 @@ class StubBasedPackageMemberDeclarationProvider(
return result return result
} }
override fun getDeclarationNames() =
getDeclarations(DescriptorKindFilter.ALL, { true })
.mapTo(mutableSetOf()) { ResolveSessionUtils.safeNameForLazyResolve(it as KtNamedDeclaration) }
override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo> { override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo> {
val result = ArrayList<KtClassLikeInfo>() val result = ArrayList<KtClassLikeInfo>()
runReadAction { runReadAction {