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