diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyImportScope.kt index 6365a57be68..51bff172569 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyImportScope.kt @@ -173,7 +173,8 @@ public class LazyImportScope(private val resolveSession: ResolveSession, override fun getDeclarationsByLabel(labelName: Name): Collection = listOf() - override fun getAllDescriptors() = collectFromImports(LookupMode.EVERYTHING, JetScopeSelectorUtil.ALL_DESCRIPTORS_SCOPE_SELECTOR) + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean) = collectFromImports(LookupMode.EVERYTHING, JetScopeSelectorUtil.ALL_DESCRIPTORS_SCOPE_SELECTOR) override fun getImplicitReceiversHierarchy() = listOf() diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.kt index 0646d2d603e..88ac15ac792 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.kt @@ -143,7 +143,8 @@ public abstract class AbstractLazyMemberScope() - override fun getAllDescriptors(): Collection { + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean): Collection { val result = LinkedHashSet(descriptorsFromDeclaredElements()) result.addAll(extraDescriptors()) return result diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.kt index ec9f1fb3c7f..3c858c5a9dd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.kt @@ -99,7 +99,8 @@ public class WritableScopeImpl(scope: JetScope, super.clearImports() } - override fun getAllDescriptors(): Collection { + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean): Collection { checkMayRead() if (!allDescriptorsDone) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.kt index a1d6f33bd61..01d3b3f23bd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.kt @@ -31,7 +31,7 @@ import org.jetbrains.jet.utils.Printer public class WriteThroughScope(outerScope: JetScope, private val writableWorker: WritableScope, redeclarationHandler: RedeclarationHandler, debugName: String) : WritableScopeWithImports(outerScope, redeclarationHandler, debugName) { - private var allDescriptors: MutableCollection? = null + private var _allDescriptors: MutableCollection? = null override fun getDeclarationsByLabel(labelName: Name): Collection { checkMayRead() @@ -164,18 +164,19 @@ public class WriteThroughScope(outerScope: JetScope, private val writableWorker: writableWorker.setImplicitReceiver(implicitReceiver) } - override fun getAllDescriptors(): Collection { + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean): Collection { checkMayRead() - if (allDescriptors == null) { - allDescriptors = Lists.newArrayList() - allDescriptors!!.addAll(workerScope.getAllDescriptors()) + if (_allDescriptors == null) { + _allDescriptors = Lists.newArrayList() + _allDescriptors!!.addAll(workerScope.getAllDescriptors()) for (imported in getImports()) { - allDescriptors!!.addAll(imported.getAllDescriptors()) + _allDescriptors!!.addAll(imported.getAllDescriptors()) } } - return allDescriptors!! + return _allDescriptors!! } override fun printAdditionalScopeStructure(p: Printer) { 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 789c3829b2b..00ae488e5cb 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 @@ -283,7 +283,9 @@ public abstract class LazyJavaMemberScope( override fun getDeclarationsByLabel(labelName: Name) = listOf() override fun getOwnDeclaredDescriptors() = getAllDescriptors() - override fun getAllDescriptors() = allDescriptors() + + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean) = allDescriptors() private fun computeAllDescriptors(): List { val result = LinkedHashSet() diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/EnumEntrySyntheticClassDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/EnumEntrySyntheticClassDescriptor.java index fa904a63704..a83325bd4f2 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/EnumEntrySyntheticClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/EnumEntrySyntheticClassDescriptor.java @@ -256,7 +256,10 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase { @NotNull @Override - public Collection getAllDescriptors() { + public Collection getDescriptors( + @NotNull Function1 kindFilter, + @NotNull Function1 nameFilter + ) { return allDescriptors.invoke(); } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SubpackagesScope.kt b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SubpackagesScope.kt index 00240eaf6bd..98e6c4329b4 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SubpackagesScope.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SubpackagesScope.kt @@ -18,13 +18,13 @@ package org.jetbrains.jet.lang.descriptors.impl import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor -import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl -import org.jetbrains.jet.utils.Printer import org.jetbrains.jet.utils.* import java.util.ArrayList +import org.jetbrains.jet.lang.resolve.scopes.JetScope +import org.jetbrains.jet.lang.resolve.scopes.JetScope.DescriptorKind public class SubpackagesScope(private val containingDeclaration: PackageViewDescriptor) : JetScopeImpl() { override fun getContainingDeclaration(): DeclarationDescriptor { @@ -35,7 +35,8 @@ public class SubpackagesScope(private val containingDeclaration: PackageViewDesc return if (name.isSpecial()) null else containingDeclaration.getModule().getPackage(containingDeclaration.getFqName().child(name)) } - override fun getAllDescriptors(): Collection { + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean): Collection { val subFqNames = containingDeclaration.getModule().getPackageFragmentProvider().getSubPackagesOf(containingDeclaration.getFqName()) val result = ArrayList(subFqNames.size()) for (subFqName in subFqNames) { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/AbstractScopeAdapter.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/AbstractScopeAdapter.kt index a55ac8c03be..1918b78dcd1 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/AbstractScopeAdapter.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/AbstractScopeAdapter.kt @@ -58,8 +58,9 @@ public abstract class AbstractScopeAdapter : JetScope { return workerScope.getDeclarationsByLabel(labelName) } - override fun getAllDescriptors(): Collection { - return workerScope.getAllDescriptors() + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean): Collection { + return workerScope.getDescriptors(kindFilter, nameFilter) } override fun getOwnDeclaredDescriptors(): Collection { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.kt index aedbdb7c2f0..227a9531f2b 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.kt @@ -31,7 +31,7 @@ public class ChainedScope(private val containingDeclaration: DeclarationDescript private val debugName: String, vararg scopes: JetScope) : JetScope { private val scopeChain = scopes.clone() - private var allDescriptors: MutableCollection? = null + private var _allDescriptors: MutableCollection? = null private var implicitReceiverHierarchy: List? = null override fun getClassifier(name: Name): ClassifierDescriptor? @@ -72,14 +72,15 @@ public class ChainedScope(private val containingDeclaration: DeclarationDescript return result } - override fun getAllDescriptors(): Collection { - if (allDescriptors == null) { - allDescriptors = HashSet() + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean): Collection { + if (_allDescriptors == null) { + _allDescriptors = HashSet() for (scope in scopeChain) { - allDescriptors!!.addAll(scope.getAllDescriptors()) + _allDescriptors!!.addAll(scope.getAllDescriptors()) } } - return allDescriptors!! + return _allDescriptors!! } override fun getOwnDeclaredDescriptors(): Collection { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/FilteringScope.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/FilteringScope.kt index eaecd57d95c..aac16d8b13c 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/FilteringScope.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/FilteringScope.kt @@ -37,7 +37,8 @@ public class FilteringScope(private val workerScope: JetScope, private val predi override fun getLocalVariable(name: Name) = filterDescriptor(workerScope.getLocalVariable(name)) - override fun getAllDescriptors() = workerScope.getAllDescriptors().filter(predicate) + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean) = workerScope.getDescriptors(kindFilter, nameFilter).filter(predicate) override fun getImplicitReceiversHierarchy() = workerScope.getImplicitReceiversHierarchy() diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.kt index 4d061d048a7..ff11f5c5522 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.kt @@ -29,7 +29,8 @@ public class InnerClassesScopeWrapper(override val workerScope: JetScope) : Abst override fun getDeclarationsByLabel(labelName: Name) = workerScope.getDeclarationsByLabel(labelName).filterIsInstance(javaClass()) - override fun getAllDescriptors() = workerScope.getAllDescriptors().filterIsInstance(javaClass()) + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean) = workerScope.getDescriptors(kindFilter, nameFilter).filterIsInstance(javaClass()) override fun getImplicitReceiversHierarchy(): List = listOf() diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.kt index 574461d9723..113d7b179d4 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.kt @@ -16,7 +16,6 @@ package org.jetbrains.jet.lang.resolve.scopes -import org.jetbrains.annotations.ReadOnly import org.jetbrains.jet.lang.descriptors.* import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.utils.Printer @@ -45,7 +44,14 @@ public trait JetScope { * * @return All visible descriptors from current scope. */ - public fun getAllDescriptors(): Collection + public fun getAllDescriptors(): Collection = getDescriptors(DescriptorKind.ALL, {true}) + + /** + * All visible descriptors from current scope possibly filtered by the given name and kind filters + * (that means that the implementation is not obliged to use the filters but may do so when it gives any performance advantage). + */ + public fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean = DescriptorKind.ALL, + nameFilter: (String) -> kotlin.Boolean = { true }): Collection /** * Adds receivers to the list in order of locality, so that the closest (the most local) receiver goes first @@ -70,5 +76,26 @@ public trait JetScope { p.println("Empty") } } + + public enum class DescriptorKind { + CLASSIFIER + PACKAGE + NON_EXTENSION_FUNCTION + EXTENSION_FUNCTION + NON_EXTENSION_PROPERTY + EXTENSION_PROPERTY + LOCAL_VARIABLE + + class object { + public val ALL: (DescriptorKind) -> Boolean = { true } + public val EXTENSIONS: (DescriptorKind) -> Boolean = { it == EXTENSION_FUNCTION || it == EXTENSION_PROPERTY } + public val FUNCTIONS: (DescriptorKind) -> Boolean = { it == NON_EXTENSION_FUNCTION || it == EXTENSION_FUNCTION } + public val NON_EXTENSION_CALLABLES: (DescriptorKind) -> Boolean = { it == NON_EXTENSION_FUNCTION || it == NON_EXTENSION_PROPERTY || it == LOCAL_VARIABLE } + } + } + + class object { + public val ALL_NAME_FILTER: (String) -> Boolean = { true } + } } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.kt index f4d27f41df5..23fffe6eeb9 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.kt @@ -34,7 +34,8 @@ public abstract class JetScopeImpl : JetScope { override fun getDeclarationsByLabel(labelName: Name): Collection = listOf() - override fun getAllDescriptors(): Collection = listOf() + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean): Collection = listOf() override fun getImplicitReceiversHierarchy(): List = listOf() diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/StaticScopeForKotlinClass.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/StaticScopeForKotlinClass.kt index 97c10e659bd..5cc5e976855 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/StaticScopeForKotlinClass.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/StaticScopeForKotlinClass.kt @@ -37,7 +37,8 @@ public class StaticScopeForKotlinClass( } } - override fun getAllDescriptors() = functions + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean) = functions override fun getOwnDeclaredDescriptors() = functions diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.kt index 1f304297232..b8b7be2dc0f 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.kt @@ -84,7 +84,8 @@ public class SubstitutingScope(private val workerScope: JetScope, private val su throw UnsupportedOperationException() // TODO } - override fun getAllDescriptors() = _allDescriptors + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean) = _allDescriptors override fun getOwnDeclaredDescriptors() = substitute(workerScope.getOwnDeclaredDescriptors()) diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java index ade6cdf10c0..c4b3b9d1c48 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -123,6 +123,15 @@ public class ErrorUtils { return Collections.emptyList(); } + @NotNull + @Override + public Collection getDescriptors( + @NotNull Function1 kindFilter, + @NotNull Function1 nameFilter + ) { + return Collections.emptyList(); + } + @NotNull @Override public Collection getAllDescriptors() { @@ -195,6 +204,15 @@ public class ErrorUtils { throw new IllegalStateException(); } + @NotNull + @Override + public Collection getDescriptors( + @NotNull Function1 kindFilter, + @NotNull Function1 nameFilter + ) { + throw new IllegalStateException(); + } + @NotNull @Override public Collection getAllDescriptors() { diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.kt index 5013b76d897..cf6f8d6a0d4 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.kt @@ -119,7 +119,8 @@ public abstract class DeserializedMemberScope protected( protected abstract fun addNonDeclaredDescriptors(result: MutableCollection) - override fun getAllDescriptors(): Collection = allDescriptors.invoke() + override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean, + nameFilter: (String) -> Boolean): Collection = allDescriptors.invoke() override fun getImplicitReceiversHierarchy(): List { val receiver = getImplicitReceiver()