diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt index 3eb9cc1c0f4..5fff0609bef 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -50,7 +50,7 @@ public abstract class LazyJavaMemberScope( private val containingDeclaration: DeclarationDescriptor ) : JetScope { private val allDescriptors = c.storageManager.createRecursionTolerantLazyValue>( - {computeAllDescriptors()}, + { computeDescriptors({ true }, { true }) }, // This is to avoid the following recursive case: // when computing getAllPackageNames() we ask the JavaPsiFacade for all subpackages of foo // it, in turn, asks JavaElementFinder for subpackages of Kotlin package foo, which calls getAllPackageNames() recursively @@ -290,28 +290,38 @@ public abstract class LazyJavaMemberScope( override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, nameFilter: (String) -> Boolean) = allDescriptors() - private fun computeAllDescriptors(): List { + //TODO: use nameFilter + protected fun computeDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> kotlin.Boolean): List { val result = LinkedHashSet() - for (name in getAllClassNames()) { - // Null signifies that a class found in Java is not present in Kotlin (e.g. package class) - result.addIfNotNull(getClassifier(name)) + if (kindFilter(JetScope.DescriptorKind.CLASSIFIER)) { + for (name in getAllClassNames()) { + // Null signifies that a class found in Java is not present in Kotlin (e.g. package class) + result.addIfNotNull(getClassifier(name)) + } } - for (name in getAllFunctionNames()) { - result.addAll(getFunctions(name)) + if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_FUNCTION)) { + for (name in getAllFunctionNames()) { + result.addAll(getFunctions(name)) + } } - for (name in getAllPropertyNames()) { - result.addAll(getProperties(name)) + if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_PROPERTY)) { + for (name in getAllPropertyNames()) { + result.addAll(getProperties(name)) + } } - addExtraDescriptors(result) + addExtraDescriptors(result, kindFilter, nameFilter) return result.toReadOnlyList() } - protected open fun addExtraDescriptors(result: MutableSet) { + protected open fun addExtraDescriptors(result: MutableSet, + kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> kotlin.Boolean) { // Do nothing } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaStaticScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaStaticScope.kt index 99bca640fd0..4f9ed827d9c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaStaticScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaStaticScope.kt @@ -100,8 +100,10 @@ public class LazyPackageFragmentScopeForJavaPackage( override fun getProperties(name: Name) = deserializedPackageScope().getProperties(name) override fun getFunctions(name: Name) = deserializedPackageScope().getFunctions(name) + super.getFunctions(name) - override fun addExtraDescriptors(result: MutableSet) { - result.addAll(deserializedPackageScope().getDescriptors()) + override fun addExtraDescriptors(result: MutableSet, + kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> kotlin.Boolean) { + result.addAll(deserializedPackageScope().getDescriptors(kindFilter, nameFilter)) } override fun computeMemberIndex(): MemberIndex = object : MemberIndex by EMPTY_MEMBER_INDEX { @@ -130,6 +132,11 @@ public class LazyPackageFragmentScopeForJavaPackage( override fun getSubPackages() = subPackages() override fun getAllPropertyNames() = Collections.emptyList() + + // we don't use implementation from super which caches all descriptors and does not use filters + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, nameFilter: (String) -> Boolean): Collection { + return computeDescriptors(kindFilter, nameFilter) + } } public class LazyJavaStaticClassScope(