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 a32b50bb5e6..623a52937a3 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 @@ -41,4 +41,6 @@ open class DelegatePackageMemberDeclarationProvider(var delegate: PackageMemberD override fun getClassOrObjectDeclarations(name: Name) = delegate.getClassOrObjectDeclarations(name) override fun getTypeAliasDeclarations(name: Name) = delegate.getTypeAliasDeclarations(name) + + override fun getDeclarationNames() = delegate.getDeclarationNames() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt index a567600436d..b1383c458dd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt @@ -131,6 +131,7 @@ class SyntheticClassOrObjectDescriptor( override fun getDestructuringDeclarationsEntries(name: Name): Collection = emptyList() override fun getClassOrObjectDeclarations(name: Name): Collection = emptyList() override fun getTypeAliasDeclarations(name: Name): Collection = emptyList() + override fun getDeclarationNames() = emptySet() } internal inner class SyntheticDeclaration( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt index e68a698bd30..4d0e1c5c7c0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.lazy.declarations import com.google.common.collect.ArrayListMultimap +import com.google.common.collect.Sets import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve @@ -37,6 +38,7 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage val classesAndObjects = ArrayListMultimap.create() // order matters here val typeAliases = ArrayListMultimap.create() val destructuringDeclarationsEntries = ArrayListMultimap.create() + val names = Sets.newHashSet() fun putToIndex(declaration: KtDeclaration) { if (declaration is KtAnonymousInitializer || declaration is KtSecondaryConstructor) return @@ -57,7 +59,9 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage } is KtDestructuringDeclaration -> { 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 -> { @@ -65,11 +69,17 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage } else -> throw IllegalArgumentException("Unknown declaration: " + declaration) } + + when (declaration) { + is KtNamedDeclaration -> names.add(safeNameForLazyResolve(declaration)) + } } override fun toString() = "allDeclarations: " + allDeclarations.mapNotNull { it.name } } + override fun getDeclarationNames() = index().names + private val index = storageManager.createLazyValue { val index = Index() doCreateIndex(index) 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 c457578d570..f3851057a73 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 @@ -41,4 +41,6 @@ class CombinedPackageMemberDeclarationProvider( override fun getClassOrObjectDeclarations(name: Name) = providers.flatMap { it.getClassOrObjectDeclarations(name) } override fun getTypeAliasDeclarations(name: Name) = providers.flatMap { it.getTypeAliasDeclarations(name) } + + override fun getDeclarationNames(): Set = providers.flatMapTo(HashSet()) { it.getDeclarationNames() } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt index 4957527f3ed..cf484b2588e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt @@ -33,4 +33,6 @@ interface DeclarationProvider { fun getClassOrObjectDeclarations(name: Name): Collection fun getTypeAliasDeclarations(name: Name): Collection + + fun getDeclarationNames(): Set } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt index 98932bdde9c..3b86bcc1d2e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt @@ -58,6 +58,9 @@ class LazyPackageMemberScope( 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 override fun toString() = "lazy scope for package " + thisDescriptor.name } 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 f2e8ecfc168..e4eef941c4d 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 @@ -61,6 +61,10 @@ class StubBasedPackageMemberDeclarationProvider( return result } + override fun getDeclarationNames() = + getDeclarations(DescriptorKindFilter.ALL, { true }) + .mapTo(mutableSetOf()) { ResolveSessionUtils.safeNameForLazyResolve(it as KtNamedDeclaration) } + override fun getClassOrObjectDeclarations(name: Name): Collection { val result = ArrayList() runReadAction {