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 &&
(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
@@ -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)) ?:
@@ -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 {
@@ -161,7 +161,7 @@ class NewResolveOldInference(
explicitReceiver: Receiver?,
create: (ReceiverValue?) -> ScopeTowerProcessor<Candidate>
): ScopeTowerProcessor<Candidate> {
return if (explicitReceiver is Qualifier) {
return if (explicitReceiver is QualifierReceiver) {
(explicitReceiver as? ClassQualifier)?.classValueReceiver?.let(create)
?: 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");
* 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 <C> 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)
@@ -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)
}
@@ -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<MemberScope>(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<MemberScope>(2)
scopes.add(descriptor.staticScope)