Remake QualifierReceiver
This commit is contained in:
+2
-2
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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())
|
||||
}
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user