diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/SamConstructorDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/SamConstructorDescriptor.kt index aa76c4a5ac8..5d755f6c8fc 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/SamConstructorDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/SamConstructorDescriptor.kt @@ -35,4 +35,6 @@ public class SamConstructorDescriptor( public object SamConstructorDescriptorKindExclude : DescriptorKindExclude { override fun matches(descriptor: DeclarationDescriptor) = descriptor is SamConstructorDescriptor + + override val fullyExcludedDescriptorKinds: Int get() = 0 } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/JetScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/JetScope.kt index 102d79a2f7a..6e117e28ff2 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/JetScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/JetScope.kt @@ -110,7 +110,7 @@ public class DescriptorKindFilter( = kindMask and kinds != 0 public fun exclude(exclude: DescriptorKindExclude): DescriptorKindFilter - = DescriptorKindFilter(kindMask, excludes + listOf(exclude)) + = DescriptorKindFilter(kindMask and exclude.fullyExcludedDescriptorKinds.inv(), excludes + listOf(exclude)) public fun withoutKinds(kinds: Int): DescriptorKindFilter = DescriptorKindFilter(kindMask and kinds.inv(), excludes) @@ -196,20 +196,29 @@ public class DescriptorKindFilter( public trait DescriptorKindExclude { public fun matches(descriptor: DeclarationDescriptor): Boolean + public val fullyExcludedDescriptorKinds: Int + override fun toString() = this.javaClass.getSimpleName() public object Extensions : DescriptorKindExclude { override fun matches(descriptor: DeclarationDescriptor) = descriptor is CallableDescriptor && descriptor.getExtensionReceiverParameter() != null + + override val fullyExcludedDescriptorKinds: Int get() = 0 } public object NonExtensions : DescriptorKindExclude { override fun matches(descriptor: DeclarationDescriptor) = descriptor !is CallableDescriptor || descriptor.getExtensionReceiverParameter() == null + + override val fullyExcludedDescriptorKinds: Int + get() = DescriptorKindFilter.ALL_KINDS_MASK and (DescriptorKindFilter.FUNCTIONS_MASK or DescriptorKindFilter.VARIABLES_MASK).inv() } public object EnumEntry : DescriptorKindExclude { override fun matches(descriptor: DeclarationDescriptor) = descriptor is ClassDescriptor && descriptor.getKind() == ClassKind.ENUM_ENTRY + + override val fullyExcludedDescriptorKinds: Int get() = 0 } } diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt index 1d68a7b7fa9..b877da621df 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt @@ -221,9 +221,7 @@ public class ReferenceVariantsHelper( nameFilter: (Name) -> Boolean ) { if (kindFilter.excludes.contains(DescriptorKindExclude.Extensions)) return - val extensionsFilter = kindFilter - .restrictedToKinds(DescriptorKindFilter.FUNCTIONS_MASK or DescriptorKindFilter.VARIABLES_MASK) - .exclude(DescriptorKindExclude.NonExtensions) + val extensionsFilter = kindFilter.exclude(DescriptorKindExclude.NonExtensions) fun processExtension(descriptor: DeclarationDescriptor) { addAll((descriptor as CallableDescriptor).substituteExtensionIfCallable(receiver, callType, context, dataFlowInfo, resolutionScope.getContainingDeclaration())) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt index 7193af5162b..c653e5f406e 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicCompletionSession.kt @@ -233,11 +233,11 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, private companion object { object NonAnnotationClassifierExclude : DescriptorKindExclude { override fun matches(descriptor: DeclarationDescriptor): Boolean { - return if (descriptor is ClassDescriptor) - descriptor.getKind() != ClassKind.ANNOTATION_CLASS - else - descriptor !is ClassifierDescriptor + if (descriptor !is ClassifierDescriptor) return false + return descriptor !is ClassDescriptor || descriptor.getKind() != ClassKind.ANNOTATION_CLASS } + + override val fullyExcludedDescriptorKinds: Int get() = 0 } val ANNOTATION_TYPES_FILTER = DescriptorKindFilter(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK or DescriptorKindFilter.PACKAGES_MASK) exclude NonAnnotationClassifierExclude diff --git a/idea/idea-completion/testData/basic/common/TopLevelPackageInClassBody.kt b/idea/idea-completion/testData/basic/common/TopLevelPackageInClassBody.kt new file mode 100644 index 00000000000..adf75a918cf --- /dev/null +++ b/idea/idea-completion/testData/basic/common/TopLevelPackageInClassBody.kt @@ -0,0 +1,5 @@ +class A { + kot +} + +// EXIST: "kotlin" diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index 210106ae8d0..4873ed301ac 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -865,6 +865,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("TopLevelPackageInClassBody.kt") + public void testTopLevelPackageInClassBody() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TopLevelPackageInClassBody.kt"); + doTest(fileName); + } + @TestMetadata("TypeParameterFromOuterClass.kt") public void testTypeParameterFromOuterClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TypeParameterFromOuterClass.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index d149189acfa..2d1a2a7d9af 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -865,6 +865,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("TopLevelPackageInClassBody.kt") + public void testTopLevelPackageInClassBody() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TopLevelPackageInClassBody.kt"); + doTest(fileName); + } + @TestMetadata("TypeParameterFromOuterClass.kt") public void testTypeParameterFromOuterClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/TypeParameterFromOuterClass.kt");