From 512bcbe7b9d812de8817c2aebdefa036675e8fc7 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Sun, 15 Nov 2015 22:11:15 +0300 Subject: [PATCH] Minor. Removed usage of ExpressionReceiver constructor from Qualifier.kt --- .../resolve/QualifiedExpressionResolver.kt | 3 ++- .../resolve/calls/tasks/TaskPrioritizer.kt | 7 ++--- .../resolve/scopes/receivers/Qualifier.kt | 26 ++++++++++++++----- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt index 28b980dbf8e..949459ef0f5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.receivers.ClassifierQualifier import org.jetbrains.kotlin.resolve.scopes.receivers.PackageQualifier import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue +import org.jetbrains.kotlin.resolve.scopes.receivers.createClassifierQualifier import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.resolve.source.KotlinSourceElement import org.jetbrains.kotlin.resolve.validation.SymbolUsageValidator @@ -442,7 +443,7 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa val qualifier = when (descriptor) { is PackageViewDescriptor -> PackageQualifier(referenceExpression, descriptor) - is ClassifierDescriptor -> ClassifierQualifier(referenceExpression, descriptor) + is ClassifierDescriptor -> createClassifierQualifier(referenceExpression, descriptor, trace.bindingContext) else -> return } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/TaskPrioritizer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/TaskPrioritizer.kt index 334d58962d8..2ba65ac074c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/TaskPrioritizer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/TaskPrioritizer.kt @@ -99,12 +99,9 @@ public class TaskPrioritizer( qualifierReceiver: QualifierReceiver, taskPrioritizerContext: TaskPrioritizerContext ) { - val classObjectReceiver = qualifierReceiver.getClassObjectReceiver() - if (!classObjectReceiver.exists()) { - return - } + val companionObject = qualifierReceiver.companionObjectReceiver ?: return val classifierDescriptor = qualifierReceiver.classifier - doComputeTasks(classObjectReceiver, taskPrioritizerContext.filterCollectors { + doComputeTasks(companionObject, taskPrioritizerContext.filterCollectors { when { classifierDescriptor is ClassDescriptor && classifierDescriptor.getCompanionObjectDescriptor() != null -> { // nested classes and objects should not be accessible via short reference to companion object 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 d958d34c27a..ff986b5eb47 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 @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentQualifiedExpressionForSelector +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext.* import org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope @@ -70,9 +71,7 @@ abstract class QualifierReceiver( override var resultingDescriptor: DeclarationDescriptor by Delegates.notNull() - fun getClassObjectReceiver(): ReceiverValue = - (classifier as? ClassDescriptor)?.classObjectType?.let { ExpressionReceiver(referenceExpression, it) } - ?: ReceiverValue.NO_RECEIVER + abstract val companionObjectReceiver: ReceiverValue? abstract fun getNestedClassesAndPackageMembersScope(): MemberScope @@ -93,11 +92,15 @@ class PackageQualifier( override fun getNestedClassesAndPackageMembersScope(): MemberScope = packageView.memberScope override fun toString() = "Package{$packageView}" + + override val companionObjectReceiver: ReceiverValue? + get() = null } class ClassifierQualifier( referenceExpression: KtSimpleNameExpression, - override val classifier: ClassifierDescriptor + override val classifier: ClassifierDescriptor, + override val companionObjectReceiver: ReceiverValue? ) : QualifierReceiver(referenceExpression) { override val packageView: PackageViewDescriptor? get() = null @@ -142,6 +145,17 @@ class ClassifierQualifier( override fun toString() = "Classifier{$classifier}" } +fun createClassifierQualifier( + referenceExpression: KtSimpleNameExpression, + classifier: ClassifierDescriptor, + bindingContext: BindingContext +): ClassifierQualifier { + val companionObjectReceiver = (classifier as? ClassDescriptor)?.classObjectType?.let { + ExpressionReceiver.create(referenceExpression, it, bindingContext) + } + return ClassifierQualifier(referenceExpression, classifier, companionObjectReceiver) +} + fun createQualifier( expression: KtSimpleNameExpression, @@ -167,10 +181,10 @@ fun createQualifier( if (packageViewDescriptor != null) PackageQualifier(expression, packageViewDescriptor) else - ClassifierQualifier(expression, classifierDescriptor!!) + createClassifierQualifier(expression, classifierDescriptor!!, context.trace.bindingContext) else if (classifierDescriptor != null) - ClassifierQualifier(expression, classifierDescriptor) + createClassifierQualifier(expression, classifierDescriptor, context.trace.bindingContext) else PackageQualifier(expression, packageViewDescriptor!!)