From f130de24689213008545e730bcd45272c8245327 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Mon, 22 Feb 2016 20:53:06 +0300 Subject: [PATCH] Remove scope from Qualifier --- .../resolve/QualifiedExpressionResolver.kt | 9 ++++--- .../resolve/scopes/receivers/Qualifier.kt | 27 +------------------ .../codeInsight/ReferenceVariantsHelper.kt | 15 +++++++---- .../staticMembers/ImportsFromEnumEntry.kt | 13 +++++++++ .../staticMembers/ImportsFromNonObject.kt | 17 ++++++++++++ .../test/JSBasicCompletionTestGenerated.java | 12 +++++++++ .../test/JvmBasicCompletionTestGenerated.java | 12 +++++++++ 7 files changed, 70 insertions(+), 35 deletions(-) create mode 100644 idea/idea-completion/testData/basic/common/staticMembers/ImportsFromEnumEntry.kt create mode 100644 idea/idea-completion/testData/basic/common/staticMembers/ImportsFromNonObject.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt index ec8c1d0c0f1..a72278e21d9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt @@ -407,16 +407,17 @@ class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageValidator ): Qualifier? { val name = expression.getReferencedNameAsName() + val location = KotlinLookupLocation(expression) val qualifierDescriptor = when (receiver) { is PackageQualifier -> { val childPackageFQN = receiver.descriptor.fqName.child(name) receiver.descriptor.module.getPackage(childPackageFQN).check { !it.isEmpty() } ?: - receiver.descriptor.memberScope.getContributedClassifier(name, KotlinLookupLocation(expression)) + receiver.descriptor.memberScope.getContributedClassifier(name, location) } - is ClassQualifier -> receiver.scope.getContributedClassifier(name, KotlinLookupLocation(expression)) - null -> context.scope.findClassifier(name, KotlinLookupLocation(expression)) ?: + is ClassQualifier -> receiver.staticScope.getContributedClassifier(name, location) + null -> context.scope.findClassifier(name, location) ?: context.scope.ownerDescriptor.module.getPackage(FqName.ROOT.child(name)).check { !it.isEmpty() } - is ReceiverValue -> receiver.type.memberScope.memberScopeAsImportingScope().findClassifier(name, KotlinLookupLocation(expression)) + is ReceiverValue -> receiver.type.memberScope.memberScopeAsImportingScope().findClassifier(name, location) else -> null } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt index c091f8bf16f..53b14ae672b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt @@ -22,11 +22,8 @@ import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentQualifiedExpressionForSelector import org.jetbrains.kotlin.resolve.descriptorUtil.classValueType import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope -import org.jetbrains.kotlin.resolve.scopes.FilteringScope import org.jetbrains.kotlin.resolve.scopes.MemberScope -import org.jetbrains.kotlin.resolve.scopes.ScopeUtils import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* interface QualifierReceiver : Receiver { @@ -40,8 +37,6 @@ abstract class Qualifier(val referenceExpression: KtSimpleNameExpression) : Qual get() = referenceExpression.getTopmostParentQualifiedExpressionForSelector() ?: referenceExpression abstract val descriptor: DeclarationDescriptor - - abstract val scope: MemberScope } class PackageQualifier( @@ -49,8 +44,6 @@ class PackageQualifier( override val descriptor: PackageViewDescriptor ) : Qualifier(referenceExpression) { - override val scope: MemberScope get() = descriptor.memberScope - override val staticScope: MemberScope get() = descriptor.memberScope override val classValueReceiver: ReceiverValue? get() = null @@ -62,7 +55,6 @@ class TypeParameterQualifier( referenceExpression: KtSimpleNameExpression, override val descriptor: TypeParameterDescriptor ) : Qualifier(referenceExpression) { - override val scope: MemberScope get() = MemberScope.Empty override val staticScope: MemberScope get() = MemberScope.Empty override val classValueReceiver: ReceiverValue? get() = null } @@ -75,30 +67,13 @@ class ClassQualifier( ClassValueReceiver(this, it) } - override val scope: MemberScope get() { - val scopes = ArrayList(3) - - val classObjectTypeScope = descriptor.classValueType?.memberScope?.let { - FilteringScope(it) { it !is ClassDescriptor } - } - scopes.addIfNotNull(classObjectTypeScope) - - scopes.add(descriptor.staticScope) - - if (descriptor.kind != ClassKind.ENUM_ENTRY) { - scopes.add(descriptor.unsubstitutedInnerClassesScope) - } - - return ChainedMemberScope("Member scope for ${descriptor.name} as class or object", scopes) - } - override val staticScope: MemberScope get() { val scopes = ArrayList(2) scopes.add(descriptor.staticScope) if (descriptor.kind != ClassKind.ENUM_ENTRY) { - scopes.add(ScopeUtils.getStaticNestedClassesScope(descriptor)) + scopes.add(descriptor.unsubstitutedInnerClassesScope) } return ChainedMemberScope("Static scope for ${descriptor.name} as class or object", scopes) 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 5209f34de0b..66dde28492a 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 @@ -1,6 +1,5 @@ /* - - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 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. @@ -31,11 +30,13 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager import org.jetbrains.kotlin.resolve.isHiddenInResolution import org.jetbrains.kotlin.resolve.scopes.* +import org.jetbrains.kotlin.resolve.scopes.receivers.ClassQualifier import org.jetbrains.kotlin.resolve.scopes.utils.collectDescriptorsFiltered import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.isUnit +import org.jetbrains.kotlin.utils.addToStdlib.check import java.util.* class ReferenceVariantsHelper( @@ -175,7 +176,7 @@ class ReferenceVariantsHelper( if (receiverExpression != null) { val qualifier = bindingContext[BindingContext.QUALIFIER, receiverExpression] if (qualifier != null) { - descriptors.addAll(qualifier.scope.getDescriptorsFiltered(kindFilter exclude DescriptorKindExclude.Extensions, nameFilter)) + descriptors.addAll(qualifier.staticScope.getDescriptorsFiltered(kindFilter exclude DescriptorKindExclude.Extensions, nameFilter)) } val explicitReceiverTypes = if (useReceiverType != null) { @@ -213,7 +214,7 @@ class ReferenceVariantsHelper( ): Collection { if (receiverExpression != null) { val qualifier = bindingContext[BindingContext.QUALIFIER, receiverExpression] ?: return emptyList() - return qualifier.scope.getDescriptorsFiltered(kindFilter, nameFilter) + return qualifier.staticScope.getDescriptorsFiltered(kindFilter, nameFilter) } else { val scope = contextElement.getResolutionScope(bindingContext, resolutionFacade) @@ -249,7 +250,11 @@ class ReferenceVariantsHelper( ): Collection { if (receiverExpression != null) { val qualifier = bindingContext[BindingContext.QUALIFIER, receiverExpression] ?: return emptyList() - return qualifier.scope.getDescriptorsFiltered(kindFilter, nameFilter) + val staticDescriptors = qualifier.staticScope.getDescriptorsFiltered(kindFilter, nameFilter) + + val objectDescriptor = (qualifier as? ClassQualifier)?.descriptor?.check { it.kind == ClassKind.OBJECT } ?: return staticDescriptors + + return staticDescriptors + objectDescriptor.defaultType.memberScope.getDescriptorsFiltered(kindFilter, nameFilter) } else { val rootPackage = resolutionFacade.moduleDescriptor.getPackage(FqName.ROOT) diff --git a/idea/idea-completion/testData/basic/common/staticMembers/ImportsFromEnumEntry.kt b/idea/idea-completion/testData/basic/common/staticMembers/ImportsFromEnumEntry.kt new file mode 100644 index 00000000000..6a4bf901045 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/staticMembers/ImportsFromEnumEntry.kt @@ -0,0 +1,13 @@ +package b + +import b.Bar.A. + + +enum class Bar { + A; + + fun foo() {} +} + +// INVOCATION_COUNT: 2 +// ABSENT: foo \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/common/staticMembers/ImportsFromNonObject.kt b/idea/idea-completion/testData/basic/common/staticMembers/ImportsFromNonObject.kt new file mode 100644 index 00000000000..a21912a3b9a --- /dev/null +++ b/idea/idea-completion/testData/basic/common/staticMembers/ImportsFromNonObject.kt @@ -0,0 +1,17 @@ +package b + +import b.A. + +class A { + fun bar() {} + + companion object { + fun foo() {} + } +} + +// INVOCATION_COUNT: 2 +// EXIST: Companion +// ABSENT: bar +// ABSENT: foo + 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 7de36a27e20..f588c8effc2 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 @@ -2250,6 +2250,18 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/basic/common/staticMembers"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("ImportsFromEnumEntry.kt") + public void testImportsFromEnumEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/staticMembers/ImportsFromEnumEntry.kt"); + doTest(fileName); + } + + @TestMetadata("ImportsFromNonObject.kt") + public void testImportsFromNonObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/staticMembers/ImportsFromNonObject.kt"); + doTest(fileName); + } + @TestMetadata("ImportsFromObjectNoDuplicates.kt") public void testImportsFromObjectNoDuplicates() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/staticMembers/ImportsFromObjectNoDuplicates.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 73c27065da4..51fb431b7cf 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 @@ -2250,6 +2250,18 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/basic/common/staticMembers"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("ImportsFromEnumEntry.kt") + public void testImportsFromEnumEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/staticMembers/ImportsFromEnumEntry.kt"); + doTest(fileName); + } + + @TestMetadata("ImportsFromNonObject.kt") + public void testImportsFromNonObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/staticMembers/ImportsFromNonObject.kt"); + doTest(fileName); + } + @TestMetadata("ImportsFromObjectNoDuplicates.kt") public void testImportsFromObjectNoDuplicates() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/staticMembers/ImportsFromObjectNoDuplicates.kt");