Minor. Removed usage of ExpressionReceiver constructor from Qualifier.kt

This commit is contained in:
Stanislav Erokhin
2015-11-15 22:11:15 +03:00
parent 1c9136a8cd
commit 512bcbe7b9
3 changed files with 24 additions and 12 deletions
@@ -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.ClassifierQualifier
import org.jetbrains.kotlin.resolve.scopes.receivers.PackageQualifier import org.jetbrains.kotlin.resolve.scopes.receivers.PackageQualifier
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue 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.scopes.utils.findClassifier
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
import org.jetbrains.kotlin.resolve.validation.SymbolUsageValidator import org.jetbrains.kotlin.resolve.validation.SymbolUsageValidator
@@ -442,7 +443,7 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
val qualifier = val qualifier =
when (descriptor) { when (descriptor) {
is PackageViewDescriptor -> PackageQualifier(referenceExpression, descriptor) is PackageViewDescriptor -> PackageQualifier(referenceExpression, descriptor)
is ClassifierDescriptor -> ClassifierQualifier(referenceExpression, descriptor) is ClassifierDescriptor -> createClassifierQualifier(referenceExpression, descriptor, trace.bindingContext)
else -> return else -> return
} }
@@ -99,12 +99,9 @@ public class TaskPrioritizer(
qualifierReceiver: QualifierReceiver, qualifierReceiver: QualifierReceiver,
taskPrioritizerContext: TaskPrioritizerContext<D, F> taskPrioritizerContext: TaskPrioritizerContext<D, F>
) { ) {
val classObjectReceiver = qualifierReceiver.getClassObjectReceiver() val companionObject = qualifierReceiver.companionObjectReceiver ?: return
if (!classObjectReceiver.exists()) {
return
}
val classifierDescriptor = qualifierReceiver.classifier val classifierDescriptor = qualifierReceiver.classifier
doComputeTasks(classObjectReceiver, taskPrioritizerContext.filterCollectors { doComputeTasks(companionObject, taskPrioritizerContext.filterCollectors {
when { when {
classifierDescriptor is ClassDescriptor && classifierDescriptor.getCompanionObjectDescriptor() != null -> { classifierDescriptor is ClassDescriptor && classifierDescriptor.getCompanionObjectDescriptor() != null -> {
// nested classes and objects should not be accessible via short reference to companion object // nested classes and objects should not be accessible via short reference to companion object
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression
import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentQualifiedExpressionForSelector import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentQualifiedExpressionForSelector
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingContext.* import org.jetbrains.kotlin.resolve.BindingContext.*
import org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName import org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName
import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope
@@ -70,9 +71,7 @@ abstract class QualifierReceiver(
override var resultingDescriptor: DeclarationDescriptor by Delegates.notNull() override var resultingDescriptor: DeclarationDescriptor by Delegates.notNull()
fun getClassObjectReceiver(): ReceiverValue = abstract val companionObjectReceiver: ReceiverValue?
(classifier as? ClassDescriptor)?.classObjectType?.let { ExpressionReceiver(referenceExpression, it) }
?: ReceiverValue.NO_RECEIVER
abstract fun getNestedClassesAndPackageMembersScope(): MemberScope abstract fun getNestedClassesAndPackageMembersScope(): MemberScope
@@ -93,11 +92,15 @@ class PackageQualifier(
override fun getNestedClassesAndPackageMembersScope(): MemberScope = packageView.memberScope override fun getNestedClassesAndPackageMembersScope(): MemberScope = packageView.memberScope
override fun toString() = "Package{$packageView}" override fun toString() = "Package{$packageView}"
override val companionObjectReceiver: ReceiverValue?
get() = null
} }
class ClassifierQualifier( class ClassifierQualifier(
referenceExpression: KtSimpleNameExpression, referenceExpression: KtSimpleNameExpression,
override val classifier: ClassifierDescriptor override val classifier: ClassifierDescriptor,
override val companionObjectReceiver: ReceiverValue?
) : QualifierReceiver(referenceExpression) { ) : QualifierReceiver(referenceExpression) {
override val packageView: PackageViewDescriptor? get() = null override val packageView: PackageViewDescriptor? get() = null
@@ -142,6 +145,17 @@ class ClassifierQualifier(
override fun toString() = "Classifier{$classifier}" 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( fun createQualifier(
expression: KtSimpleNameExpression, expression: KtSimpleNameExpression,
@@ -167,10 +181,10 @@ fun createQualifier(
if (packageViewDescriptor != null) if (packageViewDescriptor != null)
PackageQualifier(expression, packageViewDescriptor) PackageQualifier(expression, packageViewDescriptor)
else else
ClassifierQualifier(expression, classifierDescriptor!!) createClassifierQualifier(expression, classifierDescriptor!!, context.trace.bindingContext)
else else
if (classifierDescriptor != null) if (classifierDescriptor != null)
ClassifierQualifier(expression, classifierDescriptor) createClassifierQualifier(expression, classifierDescriptor, context.trace.bindingContext)
else else
PackageQualifier(expression, packageViewDescriptor!!) PackageQualifier(expression, packageViewDescriptor!!)