From 95b3885aa5e89177a69f9a14d85593f40412bcae Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 11 Nov 2014 23:21:49 +0300 Subject: [PATCH] Refactored filtering by descriptor kind so that no knowledge about SAM-constructors required in core --- .../jet/codegen/ExpressionCodegen.java | 3 +- .../jetbrains/jet/codegen/PackageCodegen.java | 2 +- .../src/BuiltInsSerializer.kt | 2 +- .../CliLightClassGenerationSupport.java | 2 +- .../java/sam/SingleAbstractMethodUtils.java | 2 +- .../jet/lang/resolve/lazy/LazyImportScope.kt | 4 +- .../AbstractPsiBasedDeclarationProvider.kt | 2 +- .../lazy/declarations/DeclarationProvider.kt | 2 +- .../descriptors/AbstractLazyMemberScope.kt | 4 +- .../lazy/descriptors/LazyClassMemberScope.kt | 4 +- .../descriptors/LazyPackageMemberScope.kt | 4 +- .../lang/resolve/scopes/WritableScopeImpl.kt | 6 +- .../lang/resolve/scopes/WriteThroughScope.kt | 2 +- .../descriptor/SamConstructorDescriptor.kt | 39 ++++++ .../SamConstructorDescriptorImpl.java | 29 ----- .../lazy/descriptors/LazyJavaMemberScope.kt | 18 +-- .../lazy/descriptors/LazyJavaStaticScope.kt | 2 +- .../LazyPackageFragmentScopeForJavaPackage.kt | 8 +- .../descriptors/SamConstructorDescriptor.java | 20 --- .../EnumEntrySyntheticClassDescriptor.java | 2 +- .../lang/descriptors/impl/SubpackagesScope.kt | 4 +- .../resolve/scopes/AbstractScopeAdapter.kt | 4 +- .../jet/lang/resolve/scopes/ChainedScope.kt | 4 +- .../jet/lang/resolve/scopes/FilteringScope.kt | 4 +- .../scopes/InnerClassesScopeWrapper.kt | 6 +- .../jet/lang/resolve/scopes/JetScope.kt | 122 +++++++++++------- .../jet/lang/resolve/scopes/JetScopeImpl.kt | 2 +- .../scopes/StaticScopeForKotlinClass.kt | 2 +- .../lang/resolve/scopes/SubstitutingScope.kt | 2 +- .../jetbrains/jet/lang/types/ErrorUtils.java | 4 +- .../DeserializedClassDescriptor.kt | 4 +- .../descriptors/DeserializedMemberScope.kt | 8 +- .../DeserializedPackageMemberScope.kt | 4 +- ...ombinedPackageMemberDeclarationProvider.kt | 4 +- ...ubBasedPackageMemberDeclarationProvider.kt | 8 +- .../jet/plugin/codeInsight/TipsManager.kt | 32 ++--- .../plugin/completion/CompletionSession.kt | 22 ++-- .../completion/smart/SmartCompletion.kt | 2 +- .../smart/TypeInstantiationItems.kt | 2 +- .../macro/BaseJetVariableMacro.java | 7 +- .../macro/JetAnonymousSuperMacro.java | 7 +- .../JetFunctionParameterInfoHandler.java | 2 +- .../k2js/translate/utils/ManglingUtils.java | 2 +- 43 files changed, 215 insertions(+), 200 deletions(-) create mode 100644 core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptor.kt delete mode 100644 core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptorImpl.java delete mode 100644 core/descriptors/src/org/jetbrains/jet/lang/descriptors/SamConstructorDescriptor.java diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index da73cad2412..699a5f7d4c4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -18,9 +18,7 @@ package org.jetbrains.jet.codegen; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import com.intellij.util.ArrayUtil; @@ -58,6 +56,7 @@ import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor; +import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor; import org.jetbrains.jet.lang.resolve.java.jvmSignature.JvmMethodSignature; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.receivers.*; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java index 2af00d1b2a9..8fb313f7f5f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java @@ -151,7 +151,7 @@ public class PackageCodegen { return Collections.emptyList(); } List callables = Lists.newArrayList(); - for (DeclarationDescriptor member : packageFragment.getMemberScope().getDescriptors(JetScope.CALLABLES_MASK, JetScope.ALL_NAME_FILTER)) { + for (DeclarationDescriptor member : packageFragment.getMemberScope().getDescriptors(JetScope.KindFilter.CALLABLES, JetScope.ALL_NAME_FILTER)) { if (member instanceof DeserializedCallableMemberDescriptor) { callables.add((DeserializedCallableMemberDescriptor) member); } diff --git a/compiler/builtins-serializer/src/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/BuiltInsSerializer.kt index 2f42fda265e..4c51eb24e90 100644 --- a/compiler/builtins-serializer/src/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/BuiltInsSerializer.kt @@ -117,7 +117,7 @@ public class BuiltInsSerializer(val out: PrintStream?) { }) val classNames = ArrayList() - val classifierDescriptors = DescriptorSerializer.sort(packageView.getMemberScope().getDescriptors(JetScope.CLASSIFIERS_MASK)) + val classifierDescriptors = DescriptorSerializer.sort(packageView.getMemberScope().getDescriptors(JetScope.KindFilter.CLASSIFIERS)) ClassSerializationUtil.serializeClasses(classifierDescriptors, serializer, object : ClassSerializationUtil.Sink { override fun writeClass(classDescriptor: ClassDescriptor, classProto: ProtoBuf.Class) { diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java index 2129587fb86..1b708fe60d5 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java @@ -216,7 +216,7 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport PackageViewDescriptor packageView = getModule().getPackage(fqn); if (packageView == null) return Collections.emptyList(); - Collection members = packageView.getMemberScope().getDescriptors(JetScope.PACKAGE, JetScope.ALL_NAME_FILTER); + Collection members = packageView.getMemberScope().getDescriptors(JetScope.KindFilter.PACKAGES, JetScope.ALL_NAME_FILTER); return ContainerUtil.mapNotNull(members, new Function() { @Override public FqName fun(DeclarationDescriptor member) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java index cf073088013..67c702eafc1 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java @@ -147,7 +147,7 @@ public class SingleAbstractMethodUtils { ) { assert isSamInterface(samInterface) : samInterface; - SamConstructorDescriptorImpl result = new SamConstructorDescriptorImpl(owner, samInterface); + SamConstructorDescriptor result = new SamConstructorDescriptor(owner, samInterface); TypeParameters typeParameters = recreateAndInitializeTypeParameters(samInterface.getTypeConstructor().getParameters(), result); 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 8db6019d055..156d3df3bc9 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 @@ -158,7 +158,7 @@ public class LazyImportScope(private val resolveSession: ResolveSession, override fun getDeclarationsByLabel(labelName: Name): Collection = listOf() - override fun getDescriptors(kindFilterMask: Int, nameFilter: (Name) -> Boolean): Collection { + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { return resolveSession.getStorageManager().compute { val descriptors = LinkedHashSet() for (directive in importsProvider.getAllImports()) { @@ -170,7 +170,7 @@ public class LazyImportScope(private val resolveSession: ResolveSession, val importPath = directive.getImportPath() ?: continue val importedName = importPath.getImportedName() if (importedName == null || nameFilter(importedName)) { - descriptors.addAll(getImportScope(directive, LookupMode.EVERYTHING).getDescriptors(kindFilterMask, nameFilter)) + descriptors.addAll(getImportScope(directive, LookupMode.EVERYTHING).getDescriptors(kindFilter, nameFilter)) } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt index bb474e83073..058ce8c0a5a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt @@ -73,7 +73,7 @@ public abstract class AbstractPsiBasedDeclarationProvider(storageManager: Storag protected abstract fun doCreateIndex(index: Index) - override fun getDeclarations(kindFilterMask: Int, nameFilter: (Name) -> Boolean): List + override fun getDeclarations(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): List = index().allDeclarations override fun getFunctionDeclarations(name: Name): List diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/DeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/DeclarationProvider.kt index 575a7b95fb5..c36345a73c9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/DeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/DeclarationProvider.kt @@ -24,7 +24,7 @@ import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.scopes.JetScope public trait DeclarationProvider { - public fun getDeclarations(kindFilterMask: Int, nameFilter: (Name) -> Boolean): List + public fun getDeclarations(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): List public fun getFunctionDeclarations(name: Name): Collection 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 1e49f87c8db..f2367d93f35 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 @@ -118,9 +118,9 @@ public abstract class AbstractLazyMemberScope() - protected fun computeDescriptorsFromDeclaredElements(kindFilterMask: Int, + protected fun computeDescriptorsFromDeclaredElements(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): List { - val declarations = declarationProvider.getDeclarations(kindFilterMask, nameFilter) + val declarations = declarationProvider.getDeclarations(kindFilter, nameFilter) val result = ArrayList(declarations.size()) for (declaration in declarations) { if (declaration is JetClassOrObject) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.kt index 72a413f982a..8198c27f3a6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.kt @@ -46,13 +46,13 @@ public open class LazyClassMemberScope(resolveSession: ResolveSession, : AbstractLazyMemberScope(resolveSession, declarationProvider, thisClass, trace) { private val descriptorsFromDeclaredElements = storageManager.createLazyValue { - computeDescriptorsFromDeclaredElements(JetScope.ALL_KINDS_MASK, JetScope.ALL_NAME_FILTER) + computeDescriptorsFromDeclaredElements(JetScope.KindFilter.ALL, JetScope.ALL_NAME_FILTER) } private val extraDescriptors: NotNullLazyValue> = storageManager.createLazyValue { computeExtraDescriptors() } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { val result = LinkedHashSet(descriptorsFromDeclaredElements()) result.addAll(extraDescriptors()) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.kt index a47c565c575..0768b65f567 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.kt @@ -29,8 +29,8 @@ public class LazyPackageMemberScope( thisPackage: PackageFragmentDescriptor) : AbstractLazyMemberScope(resolveSession, declarationProvider, thisPackage, resolveSession.getTrace()) { - override fun getDescriptors(kindFilterMask: Int, nameFilter: (Name) -> Boolean): Collection { - return computeDescriptorsFromDeclaredElements(kindFilterMask, nameFilter) + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { + return computeDescriptorsFromDeclaredElements(kindFilter, nameFilter) } override fun getPackage(name: Name): PackageViewDescriptor? = null 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 a1f4e98cdd3..a7c1f1cd05f 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 @@ -95,15 +95,15 @@ public class WritableScopeImpl(scope: JetScope, super.clearImports() } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { checkMayRead() changeLockLevel(WritableScope.LockLevel.READING) val result = ArrayList() result.addAll(explicitlyAddedDescriptors) - result.addAll(workerScope.getDescriptors(kindFilterMask, nameFilter)) - getImports().flatMapTo(result) { it.getDescriptors(kindFilterMask, nameFilter) } + result.addAll(workerScope.getDescriptors(kindFilter, nameFilter)) + getImports().flatMapTo(result) { it.getDescriptors(kindFilter, nameFilter) } return result } 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 c7d11533d3a..54f48cb59a7 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 @@ -164,7 +164,7 @@ public class WriteThroughScope(outerScope: JetScope, private val writableWorker: writableWorker.setImplicitReceiver(implicitReceiver) } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { checkMayRead() diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptor.kt new file mode 100644 index 00000000000..9f8c3146a05 --- /dev/null +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptor.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.descriptor + +import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor +import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl +import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor +import org.jetbrains.jet.lang.resolve.scopes.JetScope +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor + +public class SamConstructorDescriptor( + containingDeclaration: DeclarationDescriptor, + samInterface: JavaClassDescriptor +) : SimpleFunctionDescriptorImpl( + containingDeclaration, + null, + samInterface.getAnnotations(), + samInterface.getName(), + CallableMemberDescriptor.Kind.SYNTHESIZED, + samInterface.getSource() +) + +public object SamConstructorDescriptorKindExclude : JetScope.DescriptorKindExclude { + override fun matches(descriptor: DeclarationDescriptor) = descriptor is SamConstructorDescriptor +} diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptorImpl.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptorImpl.java deleted file mode 100644 index 258b5009120..00000000000 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamConstructorDescriptorImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2010-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.lang.resolve.java.descriptor; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.SamConstructorDescriptor; -import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; - -public class SamConstructorDescriptorImpl extends SimpleFunctionDescriptorImpl implements SamConstructorDescriptor { - public SamConstructorDescriptorImpl(@NotNull DeclarationDescriptor containingDeclaration, @NotNull JavaClassDescriptor samInterface) { - super(containingDeclaration, null, samInterface.getAnnotations(), samInterface.getName(), - Kind.SYNTHESIZED, samInterface.getSource()); - } -} 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 b6585ab7057..b1e7a44835c 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 @@ -52,7 +52,7 @@ public abstract class LazyJavaMemberScope( // this lazy value is not used at all in LazyPackageFragmentScopeForJavaPackage because we do not use caching there // but is placed in the base class to not duplicate code private val allDescriptors = c.storageManager.createRecursionTolerantLazyValue>( - { computeDescriptors(JetScope.ALL_KINDS_MASK, JetScope.ALL_NAME_FILTER) }, + { computeDescriptors(JetScope.KindFilter.ALL, JetScope.ALL_NAME_FILTER) }, // 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 @@ -291,14 +291,15 @@ public abstract class LazyJavaMemberScope( override fun getOwnDeclaredDescriptors() = getDescriptors() - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean) = allDescriptors() - protected fun computeDescriptors(kindFilterMask: Int, + protected fun computeDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): List { val result = LinkedHashSet() - if (kindFilterMask and JetScope.TYPE != 0) { + //TODO: only non-singleton classifiers in package! + if (kindFilter.acceptsKind(JetScope.CLASSIFIERS_MASK)) { for (name in getClassNames(nameFilter)) { if (nameFilter(name)) { // Null signifies that a class found in Java is not present in Kotlin (e.g. package class) @@ -307,7 +308,8 @@ public abstract class LazyJavaMemberScope( } } - if (kindFilterMask and (JetScope.ORDINARY_FUNCTION or JetScope.SAM_CONSTRUCTOR) != 0) { + //TODO: SAM-constructors only in package! + if (kindFilter.acceptsKind(JetScope.FUNCTION) && !kindFilter.excludes.contains(JetScope.DescriptorKindExclude.NonExtensions)) { for (name in getFunctionNames(nameFilter)) { if (nameFilter(name)) { result.addAll(getFunctions(name)) @@ -315,7 +317,7 @@ public abstract class LazyJavaMemberScope( } } - if (kindFilterMask and JetScope.NON_EXTENSION_PROPERTY != 0) { + if (kindFilter.acceptsKind(JetScope.VARIABLE) && !kindFilter.excludes.contains(JetScope.DescriptorKindExclude.NonExtensions)) { for (name in getAllPropertyNames()) { if (nameFilter(name)) { result.addAll(getProperties(name)) @@ -323,13 +325,13 @@ public abstract class LazyJavaMemberScope( } } - addExtraDescriptors(result, kindFilterMask, nameFilter) + addExtraDescriptors(result, kindFilter, nameFilter) return result.toReadOnlyList() } protected open fun addExtraDescriptors(result: MutableSet, - kindFilterMask: Int, + kindFilter: JetScope.KindFilter, nameFilter: (Name) -> 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 7ffef1576f4..c77002ef687 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 @@ -22,7 +22,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext import org.jetbrains.jet.lang.resolve.java.lazy.withTypes import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod import org.jetbrains.jet.lang.types.JetType -import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptorImpl +import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor public abstract class LazyJavaStaticScope( c: LazyJavaResolverContext, diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyPackageFragmentScopeForJavaPackage.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyPackageFragmentScopeForJavaPackage.kt index 25726fe7c4c..0cce851428f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyPackageFragmentScopeForJavaPackage.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyPackageFragmentScopeForJavaPackage.kt @@ -68,9 +68,9 @@ public class LazyPackageFragmentScopeForJavaPackage( override fun getFunctions(name: Name) = deserializedPackageScope().getFunctions(name) + super.getFunctions(name) override fun addExtraDescriptors(result: MutableSet, - kindFilterMask: Int, + kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean) { - result.addAll(deserializedPackageScope().getDescriptors(kindFilterMask, nameFilter)) + result.addAll(deserializedPackageScope().getDescriptors(kindFilter, nameFilter)) } override fun computeMemberIndex(): MemberIndex = object : MemberIndex by EMPTY_MEMBER_INDEX { @@ -101,7 +101,7 @@ public class LazyPackageFragmentScopeForJavaPackage( override fun getAllPropertyNames() = listOf() // we don't use implementation from super which caches all descriptors and does not use filters - override fun getDescriptors(kindFilterMask: Int, nameFilter: (Name) -> Boolean): Collection { - return computeDescriptors(kindFilterMask, nameFilter) + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { + return computeDescriptors(kindFilter, nameFilter) } } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/SamConstructorDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/SamConstructorDescriptor.java deleted file mode 100644 index aefbe089338..00000000000 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/SamConstructorDescriptor.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2010-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.lang.descriptors; - -public interface SamConstructorDescriptor extends SimpleFunctionDescriptor { -} 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 d22420088f1..3544449d801 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 @@ -257,7 +257,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase { @NotNull @Override public Collection getDescriptors( - int kindFilterMask, + @NotNull JetScope.KindFilter 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 75dafdfae96..606ed4f325d 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 @@ -34,9 +34,9 @@ public class SubpackagesScope(private val containingDeclaration: PackageViewDesc return if (name.isSpecial()) null else containingDeclaration.getModule().getPackage(containingDeclaration.getFqName().child(name)) } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { - if (kindFilterMask and JetScope.PACKAGE == 0) return listOf() + if (!kindFilter.acceptsKind(JetScope.PACKAGE)) return listOf() val subFqNames = containingDeclaration.getModule().getPackageFragmentProvider().getSubPackagesOf(containingDeclaration.getFqName(), nameFilter) val result = ArrayList(subFqNames.size()) 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 6aa650f2aee..8bc753eca2d 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,9 +58,9 @@ public abstract class AbstractScopeAdapter : JetScope { return workerScope.getDeclarationsByLabel(labelName) } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { - return workerScope.getDescriptors(kindFilterMask, nameFilter) + 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 e42f2b2aaa4..16744d3af21 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 @@ -59,10 +59,10 @@ public class ChainedScope(private val containingDeclaration: DeclarationDescript override fun getDeclarationsByLabel(labelName: Name) = scopeChain.flatMap { it.getDeclarationsByLabel(labelName) } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { val result = LinkedHashSet() - scopeChain.flatMapTo(result) { it.getDescriptors(kindFilterMask, nameFilter) } + scopeChain.flatMapTo(result) { it.getDescriptors(kindFilter, nameFilter) } return result } 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 bb1fe5bb0e9..9e12c6ea245 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,8 +37,8 @@ public class FilteringScope(private val workerScope: JetScope, private val predi override fun getLocalVariable(name: Name) = filterDescriptor(workerScope.getLocalVariable(name)) - override fun getDescriptors(kindFilterMask: Int, - nameFilter: (Name) -> Boolean) = workerScope.getDescriptors(kindFilterMask, nameFilter).filter(predicate) + override fun getDescriptors(kindFilter: JetScope.KindFilter, + nameFilter: (Name) -> 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 cf28b9a1a14..7a3786f369c 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 @@ -25,10 +25,10 @@ public class InnerClassesScopeWrapper(override val workerScope: JetScope) : Abst override fun getDeclarationsByLabel(labelName: Name) = workerScope.getDeclarationsByLabel(labelName).filterIsInstance(javaClass()) - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): List { - if (kindFilterMask and JetScope.CLASSIFIERS_MASK == 0) return listOf() - return workerScope.getDescriptors(JetScope.CLASSIFIERS_MASK, nameFilter).filterIsInstance(javaClass()) + val restrictedFilter = kindFilter.restrictedToKinds(JetScope.CLASSIFIERS_MASK) ?: return listOf() + return workerScope.getDescriptors(restrictedFilter, 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 35f870cf208..3d8fc18106f 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 @@ -50,7 +50,7 @@ public trait JetScope { * 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(kindFilterMask: Int = ALL_KINDS_MASK, + public fun getDescriptors(kindFilter: JetScope.KindFilter = KindFilter(ALL_KINDS_MASK), nameFilter: (Name) -> Boolean = ALL_NAME_FILTER): Collection /** @@ -77,62 +77,92 @@ public trait JetScope { } } + public trait DescriptorKindExclude { + public fun matches(descriptor: DeclarationDescriptor): Boolean + + public object Extensions : DescriptorKindExclude { + override fun matches(descriptor: DeclarationDescriptor) + = descriptor is CallableDescriptor && descriptor.getExtensionReceiverParameter() != null + } + + public object NonExtensions : DescriptorKindExclude { + override fun matches(descriptor: DeclarationDescriptor) + = descriptor !is CallableDescriptor || descriptor.getExtensionReceiverParameter() == null + } + } + + public data class KindFilter( + public val kindMask: Int, + public val excludes: List = listOf() + ) { + public fun accepts(descriptor: DeclarationDescriptor): Boolean + = kindMask and descriptor.kind() != 0 && excludes.all { !it.matches(descriptor) } + + public fun acceptsKind(kinds: Int): Boolean + = kindMask and kinds != 0 + + public fun exclude(exclude: DescriptorKindExclude): KindFilter + = KindFilter(kindMask, excludes + listOf(exclude)) + + public fun withoutKind(kinds: Int): KindFilter + = KindFilter(kindMask and kinds.inv(), excludes) + + public fun restrictedToKinds(kinds: Int): KindFilter? { + val mask = kindMask and kinds + if (mask == 0) return null + return KindFilter(mask, excludes) + } + + public val isEmpty: Boolean + get() = kindMask == 0 + + class object { + public val ALL: KindFilter = KindFilter(ALL_KINDS_MASK) + public val CALLABLES: KindFilter = KindFilter(FUNCTION or VARIABLE) + public val NON_SINGLETON_CLASSIFIERS: KindFilter = KindFilter(NON_SINGLETON_CLASSIFIER) + public val SINGLETON_CLASSIFIERS: KindFilter = KindFilter(SINGLETON_CLASSIFIER) + public val CLASSIFIERS: KindFilter = KindFilter(CLASSIFIERS_MASK) + public val PACKAGES: KindFilter = KindFilter(PACKAGE) + public val FUNCTIONS: KindFilter = KindFilter(FUNCTION) + public val VARIABLES: KindFilter = KindFilter(VARIABLE) + public val VALUES: KindFilter = KindFilter(VALUES_MASK) + } + } + class object { - public val TYPE: Int = 0x001 // class, trait ot type parameter - public val ENUM_ENTRY: Int = 0x002 - public val OBJECT: Int = 0x004 - public val PACKAGE: Int = 0x008 - public val ORDINARY_FUNCTION: Int = 0x010 // not extension and not SAM-constructor - public val EXTENSION_FUNCTION: Int = 0x020 - public val SAM_CONSTRUCTOR: Int = 0x040 - public val NON_EXTENSION_PROPERTY: Int = 0x080 - public val EXTENSION_PROPERTY: Int = 0x100 - public val LOCAL_VARIABLE: Int = 0x200 + public val NON_SINGLETON_CLASSIFIER: Int = 0x01 + public val SINGLETON_CLASSIFIER: Int = 0x02 + public val PACKAGE: Int = 0x04 + public val FUNCTION: Int = 0x08 + public val VARIABLE: Int = 0x10 - public val ALL_KINDS_MASK: Int = 0xFFFF - - public val EXTENSIONS_MASK: Int = EXTENSION_FUNCTION or EXTENSION_PROPERTY - public val FUNCTIONS_MASK: Int = ORDINARY_FUNCTION or EXTENSION_FUNCTION or SAM_CONSTRUCTOR - public val PROPERTIES_MASK: Int = NON_EXTENSION_PROPERTY or EXTENSION_PROPERTY - public val CALLABLES_MASK: Int = ORDINARY_FUNCTION or EXTENSION_FUNCTION or SAM_CONSTRUCTOR or NON_EXTENSION_PROPERTY or EXTENSION_PROPERTY or LOCAL_VARIABLE - public val NON_EXTENSIONS_MASK: Int = ALL_KINDS_MASK and (EXTENSION_FUNCTION or EXTENSION_PROPERTY).inv() - public val CLASSIFIERS_MASK: Int = TYPE or ENUM_ENTRY or OBJECT - public val VARIABLES_AND_PROPERTIES_MASK: Int = LOCAL_VARIABLE or NON_EXTENSION_PROPERTY or EXTENSION_PROPERTY - - public val ALL_NAME_FILTER: (Name) -> Boolean = { true } - - public fun descriptorKind(descriptor: DeclarationDescriptor): Int { - return when (descriptor) { - is ClassDescriptor -> when (descriptor.getKind()) { - ClassKind.OBJECT, ClassKind.CLASS_OBJECT -> OBJECT - ClassKind.ENUM_ENTRY -> ENUM_ENTRY - else -> TYPE - } + public val ALL_KINDS_MASK: Int = 0x1F + public val CLASSIFIERS_MASK: Int = NON_SINGLETON_CLASSIFIER or SINGLETON_CLASSIFIER + public val VALUES_MASK: Int = SINGLETON_CLASSIFIER or FUNCTION or VARIABLE + public fun DeclarationDescriptor.kind(): Int { + return when (this) { + is ClassDescriptor -> if (this.getKind().isSingleton()) SINGLETON_CLASSIFIER else NON_SINGLETON_CLASSIFIER + is ClassifierDescriptor -> NON_SINGLETON_CLASSIFIER is PackageFragmentDescriptor, is PackageViewDescriptor -> PACKAGE - - is SamConstructorDescriptor -> SAM_CONSTRUCTOR - - is FunctionDescriptor -> if (descriptor.getExtensionReceiverParameter() != null) EXTENSION_FUNCTION else ORDINARY_FUNCTION - - is PropertyDescriptor -> if (descriptor.getExtensionReceiverParameter() != null) EXTENSION_PROPERTY else NON_EXTENSION_PROPERTY - - is VariableDescriptor -> LOCAL_VARIABLE - - else -> 0 /* unknown */ + is FunctionDescriptor -> FUNCTION + is VariableDescriptor -> VARIABLE + else -> 0 } } + + public val ALL_NAME_FILTER: (Name) -> Boolean = { true } } } /** - * The same as getDescriptors(kindFilterMask, nameFilter) but the result is guaranteed to be filtered by kind and name. + * The same as getDescriptors(kindFilter, nameFilter) but the result is guaranteed to be filtered by kind and name. */ -public fun JetScope.getDescriptorsFiltered(kindFilterMask: Int, - nameFilter: (Name) -> Boolean): Collection { - return getDescriptors(kindFilterMask, nameFilter).filter { - (JetScope.descriptorKind(it) and kindFilterMask) != 0 && nameFilter(it.getName()) - } +public fun JetScope.getDescriptorsFiltered( + kindFilter: JetScope.KindFilter, + nameFilter: (Name) -> Boolean +): Collection { + return getDescriptors(kindFilter, nameFilter).filter { kindFilter.accepts(it) && nameFilter(it.getName()) } } 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 93ec421bbc6..a9fcebbb27f 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,7 @@ public abstract class JetScopeImpl : JetScope { override fun getDeclarationsByLabel(labelName: Name): Collection = listOf() - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> 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 026b5225dcc..a451f640572 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,7 @@ public class StaticScopeForKotlinClass( } } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> 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 f4052857f49..73c311b293e 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,7 @@ public class SubstitutingScope(private val workerScope: JetScope, private val su throw UnsupportedOperationException() // TODO } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> 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 424c60f2316..4e15add4162 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -126,7 +126,7 @@ public class ErrorUtils { @NotNull @Override public Collection getDescriptors( - int kindFilterMask, @NotNull Function1 nameFilter + @NotNull JetScope.KindFilter kindFilter, @NotNull Function1 nameFilter ) { return Collections.emptyList(); } @@ -206,7 +206,7 @@ public class ErrorUtils { @NotNull @Override public Collection getDescriptors( - int kindFilterMask, @NotNull Function1 nameFilter + @NotNull JetScope.KindFilter kindFilter, @NotNull Function1 nameFilter ) { throw new IllegalStateException(); } diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt index a72fddb654e..cc535133287 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt @@ -181,9 +181,9 @@ public class DeserializedClassDescriptor(outerContext: DeserializationContext, p private inner class DeserializedClassMemberScope : DeserializedMemberScope(context, this@DeserializedClassDescriptor.classProto.getMemberList()) { private val classDescriptor: DeserializedClassDescriptor = this@DeserializedClassDescriptor - private val allDescriptors = context.storageManager.createLazyValue { computeDescriptors(JetScope.ALL_KINDS_MASK, JetScope.ALL_NAME_FILTER) } + private val allDescriptors = context.storageManager.createLazyValue { computeDescriptors(JetScope.KindFilter.ALL, JetScope.ALL_NAME_FILTER) } - override fun getDescriptors(kindFilterMask: Int, + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection = allDescriptors() override fun computeNonDeclaredFunctions(name: Name, functions: MutableCollection) { 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 fb2542bc796..ab8e8f76d99 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 @@ -101,16 +101,16 @@ public abstract class DeserializedMemberScope protected( override fun getDeclarationsByLabel(labelName: Name): Collection = listOf() - protected fun computeDescriptors(kindFilterMask: Int, + protected fun computeDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { val result = LinkedHashSet(0) for (name in membersProtos().keySet()) { if (nameFilter(name)) { - if (kindFilterMask and JetScope.FUNCTIONS_MASK != 0) { + if (kindFilter.acceptsKind(JetScope.FUNCTION)) { result.addAll(getFunctions(name)) } - if (kindFilterMask and JetScope.PROPERTIES_MASK != 0) { + if (kindFilter.acceptsKind(JetScope.VARIABLE)) { result.addAll(getProperties(name)) } } @@ -118,7 +118,7 @@ public abstract class DeserializedMemberScope protected( addNonDeclaredDescriptors(result) - if (kindFilterMask and JetScope.CLASSIFIERS_MASK != 0) { + if (kindFilter.acceptsKind(JetScope.CLASSIFIERS_MASK)) { addClassDescriptors(result, nameFilter) } diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPackageMemberScope.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPackageMemberScope.kt index 4a590936a39..ea27a7446d8 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPackageMemberScope.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedPackageMemberScope.kt @@ -44,8 +44,8 @@ public open class DeserializedPackageMemberScope( private val packageFqName = packageDescriptor.fqName private val classNames = context.storageManager.createLazyValue(classNames) - override fun getDescriptors(kindFilterMask: Int, nameFilter: (Name) -> Boolean) - = computeDescriptors(kindFilterMask, nameFilter) + override fun getDescriptors(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean) + = computeDescriptors(kindFilter, nameFilter) override fun getClassDescriptor(name: Name) = context.deserializeClass(ClassId(packageFqName, name)) diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/CombinedPackageMemberDeclarationProvider.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/CombinedPackageMemberDeclarationProvider.kt index 378ac7bf316..a70d43c6bca 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/CombinedPackageMemberDeclarationProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/CombinedPackageMemberDeclarationProvider.kt @@ -25,8 +25,8 @@ public class CombinedPackageMemberDeclarationProvider(val providers: Collection< override fun getPackageFiles() = providers.flatMap { it.getPackageFiles() } - override fun getDeclarations(kindFilterMask: Int, nameFilter: (Name) -> Boolean) - = providers.flatMap { it.getDeclarations(kindFilterMask, nameFilter) } + override fun getDeclarations(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean) + = providers.flatMap { it.getDeclarations(kindFilter, nameFilter) } override fun getFunctionDeclarations(name: Name) = providers.flatMap { it.getFunctionDeclarations(name) } diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt index 24b4e3f9399..16076f83bd4 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt @@ -39,18 +39,18 @@ public class StubBasedPackageMemberDeclarationProvider( private val searchScope: GlobalSearchScope ) : PackageMemberDeclarationProvider { - override fun getDeclarations(kindFilterMask: Int, nameFilter: (Name) -> Boolean): List { + override fun getDeclarations(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): List { val result = ArrayList() - if (kindFilterMask and (JetScope.TYPE or JetScope.OBJECT) != 0) { + if (kindFilter.acceptsKind(JetScope.CLASSIFIERS_MASK)) { result.addDeclarations(JetFullClassNameIndex.getInstance(), nameFilter) } - if (kindFilterMask and JetScope.FUNCTIONS_MASK != 0) { + if (kindFilter.acceptsKind(JetScope.FUNCTION)) { result.addDeclarations(JetTopLevelFunctionsFqnNameIndex.getInstance(), nameFilter) } - if (kindFilterMask and JetScope.PROPERTIES_MASK != 0) { + if (kindFilter.acceptsKind(JetScope.VARIABLE)) { result.addDeclarations(JetTopLevelPropertiesFqnNameIndex.getInstance(), nameFilter) } diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/TipsManager.kt b/idea/src/org/jetbrains/jet/plugin/codeInsight/TipsManager.kt index 9739a517c2c..9f35df844d4 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/TipsManager.kt +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/TipsManager.kt @@ -36,15 +36,15 @@ public object TipsManager{ public fun getReferenceVariants(expression: JetSimpleNameExpression, context: BindingContext, - kindFilterMask: Int, + kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean, visibilityFilter: (DeclarationDescriptor) -> Boolean): Collection { - return getReferenceVariants(expression, context, kindFilterMask, nameFilter).filter(visibilityFilter) + return getReferenceVariants(expression, context, kindFilter, nameFilter).filter(visibilityFilter) } private fun getReferenceVariants(expression: JetSimpleNameExpression, context: BindingContext, - kindFilterMask: Int, + kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection { val receiverExpression = expression.getReceiverExpression() val parent = expression.getParent() @@ -65,7 +65,7 @@ public object TipsManager{ val qualifier = context[BindingContext.QUALIFIER, receiverExpression] if (qualifier != null) { // It's impossible to add extension function for package or class (if it's class object, expression type is not null) - qualifier.scope.getDescriptorsFiltered(kindFilterMask and JetScope.NON_EXTENSIONS_MASK, nameFilter).filterTo(descriptors, ::filterIfInfix) + qualifier.scope.getDescriptorsFiltered(kindFilter exclude JetScope.DescriptorKindExclude.Extensions, nameFilter).filterTo(descriptors, ::filterIfInfix) } val expressionType = context[BindingContext.EXPRESSION_TYPE, receiverExpression] @@ -73,12 +73,12 @@ public object TipsManager{ val receiverValue = ExpressionReceiver(receiverExpression, expressionType) val dataFlowInfo = context.getDataFlowInfo(expression) - val mask = kindFilterMask and JetScope.NON_EXTENSIONS_MASK and JetScope.TYPE.inv() + val mask = kindFilter.withoutKind(JetScope.NON_SINGLETON_CLASSIFIER).exclude(JetScope.DescriptorKindExclude.Extensions) for (variant in SmartCastUtils.getSmartCastVariants(receiverValue, context, dataFlowInfo)) { variant.getMemberScope().getDescriptorsFiltered(mask, nameFilter).filterTo(descriptors, ::filterIfInfix) } - descriptors.addCallableExtensions(resolutionScope, receiverValue, context, dataFlowInfo, isInfixCall, kindFilterMask, nameFilter) + descriptors.addCallableExtensions(resolutionScope, receiverValue, context, dataFlowInfo, isInfixCall, kindFilter, nameFilter) } return descriptors @@ -86,21 +86,21 @@ public object TipsManager{ } if (parent is JetImportDirective || parent is JetPackageDirective) { - if (kindFilterMask and JetScope.PACKAGE == 0) return listOf() - return resolutionScope.getDescriptorsFiltered(JetScope.PACKAGE, nameFilter) + val restrictedFilter = kindFilter.restrictedToKinds(JetScope.PACKAGE) ?: return listOf() + return resolutionScope.getDescriptorsFiltered(restrictedFilter, nameFilter) } else { val descriptorsSet = HashSet() val receivers = resolutionScope.getImplicitReceiversHierarchy() receivers.flatMapTo(descriptorsSet) { - it.getType().getMemberScope().getDescriptorsFiltered(kindFilterMask and JetScope.NON_EXTENSIONS_MASK, nameFilter) + it.getType().getMemberScope().getDescriptorsFiltered(kindFilter exclude JetScope.DescriptorKindExclude.Extensions, nameFilter) } val dataFlowInfo = context.getDataFlowInfo(expression) val receiverValues = receivers.map { it.getValue() } - resolutionScope.getDescriptorsFiltered(kindFilterMask, nameFilter).filterTo(descriptorsSet) { + resolutionScope.getDescriptorsFiltered(kindFilter, nameFilter).filterTo(descriptorsSet) { if (it is CallableDescriptor && it.getExtensionReceiverParameter() != null) { it.isExtensionCallable(receiverValues, context, dataFlowInfo, false) } @@ -118,11 +118,11 @@ public object TipsManager{ context: BindingContext, dataFlowInfo: DataFlowInfo, isInfixCall: Boolean, - kindFilterMask: Int, - nameFilter: (Name) -> Boolean) { - val mask = kindFilterMask and JetScope.EXTENSIONS_MASK - if (mask != 0) { - resolutionScope.getDescriptorsFiltered(mask, nameFilter) + kindFilter: JetScope.KindFilter, + nameFilter: (Name) -> Boolean + ) { + if (!kindFilter.excludes.contains(JetScope.DescriptorKindExclude.Extensions)) { + resolutionScope.getDescriptorsFiltered(kindFilter, nameFilter) .stream() .filterIsInstance(javaClass()) .filterTo(this) { ExpressionTypingUtils.checkIsExtensionCallable(receiver, it, isInfixCall, context, dataFlowInfo) } @@ -142,6 +142,6 @@ public object TipsManager{ context: BindingContext, nameFilter: (Name) -> Boolean): Collection { val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression] ?: return listOf() - return resolutionScope.getDescriptorsFiltered(JetScope.PACKAGE, nameFilter) + return resolutionScope.getDescriptorsFiltered(JetScope.KindFilter.PACKAGES, nameFilter) } } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt index 6b4882396f9..97fa6f9a85a 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt @@ -24,7 +24,6 @@ import org.jetbrains.jet.lang.descriptors.* import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns -import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.plugin.caches.resolve.* import org.jetbrains.jet.plugin.codeInsight.TipsManager import org.jetbrains.jet.plugin.completion.smart.SmartCompletion @@ -33,9 +32,9 @@ import org.jetbrains.jet.plugin.project.ResolveSessionForBodies import org.jetbrains.jet.plugin.caches.KotlinIndicesHelper import com.intellij.openapi.project.Project import com.intellij.psi.search.DelegatingGlobalSearchScope -import java.util.HashSet import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.jet.lang.resolve.scopes.JetScope +import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptorKindExclude class CompletionSessionConfiguration( val completeNonImportedDeclarations: Boolean, @@ -95,10 +94,10 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess protected abstract fun doComplete() - protected fun getReferenceVariants(kindFilterMask: Int): Collection { + protected fun getReferenceVariants(kindFilter: JetScope.KindFilter): Collection { return TipsManager.getReferenceVariants(jetReference!!.expression, bindingContext!!, - kindFilterMask, + kindFilter, prefixMatcher.asNameFilter(), { isVisibleDescriptor(it) }) } @@ -141,7 +140,11 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, val onlyTypes = shouldRunOnlyTypeCompletion() if (completeReference) { - addReferenceVariants(if (onlyTypes) JetScope.TYPE or JetScope.PACKAGE else JetScope.ALL_KINDS_MASK) + val kindMask = if (onlyTypes) + JetScope.NON_SINGLETON_CLASSIFIER or JetScope.PACKAGE + else + JetScope.ALL_KINDS_MASK + addReferenceVariants(JetScope.KindFilter(kindMask)) if (onlyTypes) { collector.addDescriptorElements(listOf(KotlinBuiltIns.getInstance().getUnit()), false) @@ -192,8 +195,8 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, return false } - private fun addReferenceVariants(kindFilterMask: Int) { - collector.addDescriptorElements(getReferenceVariants(kindFilterMask), suppressAutoInsertion = false) + private fun addReferenceVariants(kindFilter: JetScope.KindFilter) { + collector.addDescriptorElements(getReferenceVariants(kindFilter), suppressAutoInsertion = false) } } @@ -201,10 +204,7 @@ class SmartCompletionSession(configuration: CompletionSessionConfiguration, para : CompletionSessionBase(configuration, parameters, resultSet) { // we do not include SAM-constructors because they are handled separately and adding them requires iterating of java classes - private val DESCRIPTOR_KIND_MASK = JetScope.ORDINARY_FUNCTION or - JetScope.EXTENSION_FUNCTION or - JetScope.VARIABLES_AND_PROPERTIES_MASK or - JetScope.ENUM_ENTRY + private val DESCRIPTOR_KIND_MASK = JetScope.KindFilter.VALUES exclude SamConstructorDescriptorKindExclude override fun doComplete() { if (jetReference != null) { diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt index e86fc9396a6..f6188ba399d 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt @@ -34,7 +34,7 @@ import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession import org.jetbrains.jet.renderer.DescriptorRenderer import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers -import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptorImpl +import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor class SmartCompletion(val expression: JetSimpleNameExpression, val resolveSession: ResolveSessionForBodies, diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/TypeInstantiationItems.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/TypeInstantiationItems.kt index 23038f7c1f8..6ad48ca08b4 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/TypeInstantiationItems.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/TypeInstantiationItems.kt @@ -38,7 +38,7 @@ import org.jetbrains.jet.plugin.util.makeNotNullable import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor -import org.jetbrains.jet.lang.descriptors.SamConstructorDescriptor +import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val bindingContext: BindingContext, val visibilityFilter: (DeclarationDescriptor) -> Boolean) { public fun addToCollection(collection: MutableCollection, expectedInfos: Collection) { diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/BaseJetVariableMacro.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/BaseJetVariableMacro.java index 9655681b630..52d025c7845 100644 --- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/BaseJetVariableMacro.java +++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/BaseJetVariableMacro.java @@ -42,10 +42,7 @@ import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import org.jetbrains.jet.plugin.codeInsight.TipsManager; import org.jetbrains.jet.plugin.project.ResolveSessionForBodies; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import static org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage.getDataFlowInfo; @@ -77,7 +74,7 @@ public abstract class BaseJetVariableMacro extends Macro { DataFlowInfo dataFlowInfo = getDataFlowInfo(bindingContext, contextExpression); List filteredDescriptors = new ArrayList(); - for (DeclarationDescriptor declarationDescriptor : scope.getDescriptors(JetScope.VARIABLES_AND_PROPERTIES_MASK, JetScope.ALL_NAME_FILTER)) { + for (DeclarationDescriptor declarationDescriptor : scope.getDescriptors(JetScope.KindFilter.VARIABLES, JetScope.ALL_NAME_FILTER)) { if (declarationDescriptor instanceof VariableDescriptor) { VariableDescriptor variableDescriptor = (VariableDescriptor) declarationDescriptor; diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetAnonymousSuperMacro.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetAnonymousSuperMacro.java index 5d1db1f7e64..568eb79064b 100644 --- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetAnonymousSuperMacro.java +++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetAnonymousSuperMacro.java @@ -41,10 +41,7 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class JetAnonymousSuperMacro extends Macro { @Override @@ -96,7 +93,7 @@ public class JetAnonymousSuperMacro extends Macro { List result = new ArrayList(); - for (DeclarationDescriptor descriptor : scope.getDescriptors(JetScope.TYPE, JetScope.ALL_NAME_FILTER)) { + for (DeclarationDescriptor descriptor : scope.getDescriptors(JetScope.KindFilter.NON_SINGLETON_CLASSIFIERS, JetScope.ALL_NAME_FILTER)) { if (!(descriptor instanceof ClassDescriptor)) continue; ClassDescriptor classDescriptor = (ClassDescriptor) descriptor; if (!classDescriptor.getModality().isOverridable()) continue; diff --git a/idea/src/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoHandler.java b/idea/src/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoHandler.java index 1d5ec90ea78..72cb3ba2bd6 100644 --- a/idea/src/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoHandler.java @@ -408,7 +408,7 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith } }; Collection variants = TipsManager.INSTANCE$.getReferenceVariants( - callNameExpression, bindingContext, JetScope.FUNCTIONS_MASK | JetScope.TYPE, nameFilter, visibilityFilter); + callNameExpression, bindingContext, new JetScope.KindFilter(JetScope.FUNCTION | JetScope.CLASSIFIERS_MASK, Collections.emptyList()), nameFilter, visibilityFilter); Collection> itemsToShow = new ArrayList>(); for (DeclarationDescriptor variant : variants) { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/ManglingUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/ManglingUtils.java index 68e01ef191e..d1941287b10 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/ManglingUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/ManglingUtils.java @@ -144,7 +144,7 @@ public class ManglingUtils { int counter = 0; if (jetScope != null) { - Collection declarations = jetScope.getDescriptors(JetScope.CALLABLES_MASK, JetScope.ALL_NAME_FILTER); + Collection declarations = jetScope.getDescriptors(JetScope.KindFilter.CALLABLES, JetScope.ALL_NAME_FILTER); List overloadedFunctions = ContainerUtil.mapNotNull(declarations, new Function() { @Override