From 4b3c6d52efe498242dce90c15c25d99879b4f70b Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Mon, 22 Feb 2016 20:04:11 +0300 Subject: [PATCH] Remake QualifierReceiver --- .../resolve/QualifiedExpressionResolveUtil.kt | 4 +- .../resolve/QualifiedExpressionResolver.kt | 6 +- .../resolve/calls/CallExpressionResolver.kt | 8 +-- .../calls/tower/NewResolveOldInference.kt | 2 +- .../calls/tower/ScopeTowerProcessors.kt | 5 +- .../kotlin/resolve/calls/tower/TowerLevels.kt | 6 +- .../resolve/scopes/receivers/Qualifier.kt | 62 +++++++------------ 7 files changed, 37 insertions(+), 56 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolveUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolveUtil.kt index 3d94df4bf42..c08f5c98039 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolveUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolveUtil.kt @@ -86,9 +86,9 @@ private fun resolveQualifierReferenceTarget( if (qualifier is PackageQualifier && (selectorContainer is PackageFragmentDescriptor || selectorContainer is PackageViewDescriptor) && - DescriptorUtils.getFqName(qualifier.packageView) == DescriptorUtils.getFqName(selectorContainer) + DescriptorUtils.getFqName(qualifier.descriptor) == DescriptorUtils.getFqName(selectorContainer) ) { - return qualifier.packageView + return qualifier.descriptor } // TODO make decisions about short reference to companion object somewhere else diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt index 239d2c8dd04..ec8c1d0c0f1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt @@ -409,9 +409,9 @@ class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageValidator val qualifierDescriptor = when (receiver) { is PackageQualifier -> { - val childPackageFQN = receiver.packageView.fqName.child(name) - receiver.packageView.module.getPackage(childPackageFQN).check { !it.isEmpty() } ?: - receiver.packageView.memberScope.getContributedClassifier(name, KotlinLookupLocation(expression)) + val childPackageFQN = receiver.descriptor.fqName.child(name) + receiver.descriptor.module.getPackage(childPackageFQN).check { !it.isEmpty() } ?: + receiver.descriptor.memberScope.getContributedClassifier(name, KotlinLookupLocation(expression)) } is ClassQualifier -> receiver.scope.getContributedClassifier(name, KotlinLookupLocation(expression)) null -> context.scope.findClassifier(name, KotlinLookupLocation(expression)) ?: diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt index a01a94b2092..226893b806f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt @@ -313,7 +313,7 @@ class CallExpressionResolver( val selector = element.selector var selectorTypeInfo = getUnsafeSelectorTypeInfo(receiver, element.node, selector, context, initialDataFlowInfoForArguments) - if (receiver is QualifierReceiver) { + if (receiver is Qualifier) { resolveDeferredReceiverInQualifiedExpression(receiver, selector, context) } @@ -383,7 +383,7 @@ class CallExpressionResolver( for (element in elementChain) { val receiverType = receiverTypeInfo.type ?: ErrorUtils.createErrorType("Type for " + element.receiver.text) - val receiver = trace.get(BindingContext.QUALIFIER, element.receiver) as QualifierReceiver? + val receiver = trace.get(BindingContext.QUALIFIER, element.receiver) ?: ExpressionReceiver.create(element.receiver, receiverType, trace.bindingContext) val qualifiedExpression = element.qualified @@ -419,7 +419,7 @@ class CallExpressionResolver( } private fun resolveDeferredReceiverInQualifiedExpression( - qualifierReceiver: QualifierReceiver, + qualifier: Qualifier, selectorExpression: KtExpression?, context: ExpressionTypingContext ) { @@ -428,7 +428,7 @@ class CallExpressionResolver( context.trace.get(BindingContext.REFERENCE_TARGET, it) } - resolveQualifierAsReceiverInExpression(qualifierReceiver, selectorDescriptor, context, symbolUsageValidator) + resolveQualifierAsReceiverInExpression(qualifier, selectorDescriptor, context, symbolUsageValidator) } companion object { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolveOldInference.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolveOldInference.kt index e816574fff4..a769c4d5c1b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolveOldInference.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewResolveOldInference.kt @@ -161,7 +161,7 @@ class NewResolveOldInference( explicitReceiver: Receiver?, create: (ReceiverValue?) -> ScopeTowerProcessor ): ScopeTowerProcessor { - return if (explicitReceiver is Qualifier) { + return if (explicitReceiver is QualifierReceiver) { (explicitReceiver as? ClassQualifier)?.classValueReceiver?.let(create) ?: KnownResultProcessor(listOf()) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt index 5d9c2577c75..61528c59154 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessors.kt @@ -1,5 +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. @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.resolve.calls.tower import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind -import org.jetbrains.kotlin.resolve.scopes.receivers.ClassQualifier import org.jetbrains.kotlin.resolve.scopes.receivers.QualifierReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue @@ -120,7 +119,7 @@ private fun createSimpleProcessor( val qualifierProcessor = QualifierScopeTowerProcessor(context, explicitReceiver, collectCandidates) // todo enum entry, object. - val classValue = (explicitReceiver as? ClassQualifier)?.classValueReceiver ?: return qualifierProcessor + val classValue = explicitReceiver.classValueReceiver ?: return qualifierProcessor return CompositeScopeTowerProcessor( qualifierProcessor, ExplicitReceiverScopeTowerProcessor(context, classValue, collectCandidates) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index cc191549c2b..87307beb699 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -1,5 +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. @@ -133,12 +133,12 @@ internal class ReceiverScopeTowerLevel( } internal class QualifierScopeTowerLevel(scopeTower: ScopeTower, val qualifier: QualifierReceiver) : AbstractScopeTowerLevel(scopeTower) { - override fun getVariables(name: Name, extensionReceiver: ReceiverValue?) = qualifier.getNestedClassesAndPackageMembersScope() + override fun getVariables(name: Name, extensionReceiver: ReceiverValue?) = qualifier.staticScope .getContributedVariablesAndObjects(name, location).map { createCandidateDescriptor(it, dispatchReceiver = null) } - override fun getFunctions(name: Name, extensionReceiver: ReceiverValue?) = qualifier.getNestedClassesAndPackageMembersScope() + override fun getFunctions(name: Name, extensionReceiver: ReceiverValue?) = qualifier.staticScope .getContributedFunctionsAndConstructors(name, location).map { createCandidateDescriptor(it, dispatchReceiver = 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 aeef7fdad2a..c091f8bf16f 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 @@ -16,10 +16,7 @@ package org.jetbrains.kotlin.resolve.scopes.receivers -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.PackageViewDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentQualifiedExpressionForSelector @@ -32,64 +29,53 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* -interface Qualifier: Receiver { +interface QualifierReceiver : Receiver { + val staticScope: MemberScope - val expression: KtExpression - - val referenceExpression: KtSimpleNameExpression - - val descriptor: DeclarationDescriptor - - val scope: MemberScope + val classValueReceiver: ReceiverValue? } -abstract class QualifierReceiver( - override val referenceExpression: KtSimpleNameExpression -) : Qualifier { - - override val expression: KtExpression +abstract class Qualifier(val referenceExpression: KtSimpleNameExpression) : QualifierReceiver { + val expression: KtExpression get() = referenceExpression.getTopmostParentQualifiedExpressionForSelector() ?: referenceExpression - abstract fun getNestedClassesAndPackageMembersScope(): MemberScope + abstract val descriptor: DeclarationDescriptor + + abstract val scope: MemberScope } class PackageQualifier( referenceExpression: KtSimpleNameExpression, - val packageView: PackageViewDescriptor -) : QualifierReceiver(referenceExpression) { + override val descriptor: PackageViewDescriptor +) : Qualifier(referenceExpression) { - override val descriptor: DeclarationDescriptor - get() = packageView + override val scope: MemberScope get() = descriptor.memberScope - override val scope: MemberScope get() = packageView.memberScope + override val staticScope: MemberScope get() = descriptor.memberScope - override fun getNestedClassesAndPackageMembersScope(): MemberScope = packageView.memberScope + override val classValueReceiver: ReceiverValue? get() = null - override fun toString() = "Package{$packageView}" + override fun toString() = "Package{$descriptor}" } class TypeParameterQualifier( referenceExpression: KtSimpleNameExpression, - override val descriptor: DeclarationDescriptor -) : QualifierReceiver(referenceExpression) { - override fun getNestedClassesAndPackageMembersScope(): MemberScope = MemberScope.Empty - + 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 } class ClassQualifier( referenceExpression: KtSimpleNameExpression, override val descriptor: ClassDescriptor -) : QualifierReceiver(referenceExpression) { - val classValueReceiver: ClassValueReceiver? = descriptor.classValueType?.let { +) : Qualifier(referenceExpression) { + override val classValueReceiver: ClassValueReceiver? = descriptor.classValueType?.let { ClassValueReceiver(this, it) } override val scope: MemberScope get() { - if (descriptor !is ClassDescriptor) { - return MemberScope.Empty - } - val scopes = ArrayList(3) val classObjectTypeScope = descriptor.classValueType?.memberScope?.let { @@ -106,11 +92,7 @@ class ClassQualifier( return ChainedMemberScope("Member scope for ${descriptor.name} as class or object", scopes) } - override fun getNestedClassesAndPackageMembersScope(): MemberScope { - if (descriptor !is ClassDescriptor) { - return MemberScope.Empty - } - + override val staticScope: MemberScope get() { val scopes = ArrayList(2) scopes.add(descriptor.staticScope)