Remake QualifierReceiver

This commit is contained in:
Stanislav Erokhin
2016-02-22 20:04:11 +03:00
parent 8c5339cccf
commit 4b3c6d52ef
7 changed files with 37 additions and 56 deletions
@@ -86,9 +86,9 @@ private fun resolveQualifierReferenceTarget(
if (qualifier is PackageQualifier && if (qualifier is PackageQualifier &&
(selectorContainer is PackageFragmentDescriptor || selectorContainer is PackageViewDescriptor) && (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 // TODO make decisions about short reference to companion object somewhere else
@@ -409,9 +409,9 @@ class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageValidator
val qualifierDescriptor = when (receiver) { val qualifierDescriptor = when (receiver) {
is PackageQualifier -> { is PackageQualifier -> {
val childPackageFQN = receiver.packageView.fqName.child(name) val childPackageFQN = receiver.descriptor.fqName.child(name)
receiver.packageView.module.getPackage(childPackageFQN).check { !it.isEmpty() } ?: receiver.descriptor.module.getPackage(childPackageFQN).check { !it.isEmpty() } ?:
receiver.packageView.memberScope.getContributedClassifier(name, KotlinLookupLocation(expression)) receiver.descriptor.memberScope.getContributedClassifier(name, KotlinLookupLocation(expression))
} }
is ClassQualifier -> receiver.scope.getContributedClassifier(name, KotlinLookupLocation(expression)) is ClassQualifier -> receiver.scope.getContributedClassifier(name, KotlinLookupLocation(expression))
null -> context.scope.findClassifier(name, KotlinLookupLocation(expression)) ?: null -> context.scope.findClassifier(name, KotlinLookupLocation(expression)) ?:
@@ -313,7 +313,7 @@ class CallExpressionResolver(
val selector = element.selector val selector = element.selector
var selectorTypeInfo = getUnsafeSelectorTypeInfo(receiver, element.node, selector, context, initialDataFlowInfoForArguments) var selectorTypeInfo = getUnsafeSelectorTypeInfo(receiver, element.node, selector, context, initialDataFlowInfoForArguments)
if (receiver is QualifierReceiver) { if (receiver is Qualifier) {
resolveDeferredReceiverInQualifiedExpression(receiver, selector, context) resolveDeferredReceiverInQualifiedExpression(receiver, selector, context)
} }
@@ -383,7 +383,7 @@ class CallExpressionResolver(
for (element in elementChain) { for (element in elementChain) {
val receiverType = receiverTypeInfo.type ?: ErrorUtils.createErrorType("Type for " + element.receiver.text) 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) ?: ExpressionReceiver.create(element.receiver, receiverType, trace.bindingContext)
val qualifiedExpression = element.qualified val qualifiedExpression = element.qualified
@@ -419,7 +419,7 @@ class CallExpressionResolver(
} }
private fun resolveDeferredReceiverInQualifiedExpression( private fun resolveDeferredReceiverInQualifiedExpression(
qualifierReceiver: QualifierReceiver, qualifier: Qualifier,
selectorExpression: KtExpression?, selectorExpression: KtExpression?,
context: ExpressionTypingContext context: ExpressionTypingContext
) { ) {
@@ -428,7 +428,7 @@ class CallExpressionResolver(
context.trace.get(BindingContext.REFERENCE_TARGET, it) context.trace.get(BindingContext.REFERENCE_TARGET, it)
} }
resolveQualifierAsReceiverInExpression(qualifierReceiver, selectorDescriptor, context, symbolUsageValidator) resolveQualifierAsReceiverInExpression(qualifier, selectorDescriptor, context, symbolUsageValidator)
} }
companion object { companion object {
@@ -161,7 +161,7 @@ class NewResolveOldInference(
explicitReceiver: Receiver?, explicitReceiver: Receiver?,
create: (ReceiverValue?) -> ScopeTowerProcessor<Candidate> create: (ReceiverValue?) -> ScopeTowerProcessor<Candidate>
): ScopeTowerProcessor<Candidate> { ): ScopeTowerProcessor<Candidate> {
return if (explicitReceiver is Qualifier) { return if (explicitReceiver is QualifierReceiver) {
(explicitReceiver as? ClassQualifier)?.classValueReceiver?.let(create) (explicitReceiver as? ClassQualifier)?.classValueReceiver?.let(create)
?: KnownResultProcessor<Candidate>(listOf()) ?: KnownResultProcessor<Candidate>(listOf())
} }
@@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.name.Name
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind 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.QualifierReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
@@ -120,7 +119,7 @@ private fun <C> createSimpleProcessor(
val qualifierProcessor = QualifierScopeTowerProcessor(context, explicitReceiver, collectCandidates) val qualifierProcessor = QualifierScopeTowerProcessor(context, explicitReceiver, collectCandidates)
// todo enum entry, object. // todo enum entry, object.
val classValue = (explicitReceiver as? ClassQualifier)?.classValueReceiver ?: return qualifierProcessor val classValue = explicitReceiver.classValueReceiver ?: return qualifierProcessor
return CompositeScopeTowerProcessor( return CompositeScopeTowerProcessor(
qualifierProcessor, qualifierProcessor,
ExplicitReceiverScopeTowerProcessor(context, classValue, collectCandidates) ExplicitReceiverScopeTowerProcessor(context, classValue, collectCandidates)
@@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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) { 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 { .getContributedVariablesAndObjects(name, location).map {
createCandidateDescriptor(it, dispatchReceiver = null) 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 { .getContributedFunctionsAndConstructors(name, location).map {
createCandidateDescriptor(it, dispatchReceiver = null) createCandidateDescriptor(it, dispatchReceiver = null)
} }
@@ -16,10 +16,7 @@
package org.jetbrains.kotlin.resolve.scopes.receivers package org.jetbrains.kotlin.resolve.scopes.receivers
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
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
@@ -32,64 +29,53 @@ import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import java.util.* import java.util.*
interface Qualifier: Receiver { interface QualifierReceiver : Receiver {
val staticScope: MemberScope
val expression: KtExpression val classValueReceiver: ReceiverValue?
val referenceExpression: KtSimpleNameExpression
val descriptor: DeclarationDescriptor
val scope: MemberScope
} }
abstract class QualifierReceiver( abstract class Qualifier(val referenceExpression: KtSimpleNameExpression) : QualifierReceiver {
override val referenceExpression: KtSimpleNameExpression val expression: KtExpression
) : Qualifier {
override val expression: KtExpression
get() = referenceExpression.getTopmostParentQualifiedExpressionForSelector() ?: referenceExpression get() = referenceExpression.getTopmostParentQualifiedExpressionForSelector() ?: referenceExpression
abstract fun getNestedClassesAndPackageMembersScope(): MemberScope abstract val descriptor: DeclarationDescriptor
abstract val scope: MemberScope
} }
class PackageQualifier( class PackageQualifier(
referenceExpression: KtSimpleNameExpression, referenceExpression: KtSimpleNameExpression,
val packageView: PackageViewDescriptor override val descriptor: PackageViewDescriptor
) : QualifierReceiver(referenceExpression) { ) : Qualifier(referenceExpression) {
override val descriptor: DeclarationDescriptor override val scope: MemberScope get() = descriptor.memberScope
get() = packageView
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( class TypeParameterQualifier(
referenceExpression: KtSimpleNameExpression, referenceExpression: KtSimpleNameExpression,
override val descriptor: DeclarationDescriptor override val descriptor: TypeParameterDescriptor
) : QualifierReceiver(referenceExpression) { ) : Qualifier(referenceExpression) {
override fun getNestedClassesAndPackageMembersScope(): MemberScope = MemberScope.Empty
override val scope: MemberScope get() = MemberScope.Empty override val scope: MemberScope get() = MemberScope.Empty
override val staticScope: MemberScope get() = MemberScope.Empty
override val classValueReceiver: ReceiverValue? get() = null
} }
class ClassQualifier( class ClassQualifier(
referenceExpression: KtSimpleNameExpression, referenceExpression: KtSimpleNameExpression,
override val descriptor: ClassDescriptor override val descriptor: ClassDescriptor
) : QualifierReceiver(referenceExpression) { ) : Qualifier(referenceExpression) {
val classValueReceiver: ClassValueReceiver? = descriptor.classValueType?.let { override val classValueReceiver: ClassValueReceiver? = descriptor.classValueType?.let {
ClassValueReceiver(this, it) ClassValueReceiver(this, it)
} }
override val scope: MemberScope get() { override val scope: MemberScope get() {
if (descriptor !is ClassDescriptor) {
return MemberScope.Empty
}
val scopes = ArrayList<MemberScope>(3) val scopes = ArrayList<MemberScope>(3)
val classObjectTypeScope = descriptor.classValueType?.memberScope?.let { val classObjectTypeScope = descriptor.classValueType?.memberScope?.let {
@@ -106,11 +92,7 @@ class ClassQualifier(
return ChainedMemberScope("Member scope for ${descriptor.name} as class or object", scopes) return ChainedMemberScope("Member scope for ${descriptor.name} as class or object", scopes)
} }
override fun getNestedClassesAndPackageMembersScope(): MemberScope { override val staticScope: MemberScope get() {
if (descriptor !is ClassDescriptor) {
return MemberScope.Empty
}
val scopes = ArrayList<MemberScope>(2) val scopes = ArrayList<MemberScope>(2)
scopes.add(descriptor.staticScope) scopes.add(descriptor.staticScope)