Drop QualifierReceiver::resultingDescriptor. Use REFERENCE_TARGET.

This commit is contained in:
Dmitry Petrov
2015-11-10 11:48:58 +03:00
parent eef8c7ae09
commit 49570ba1ea
5 changed files with 11 additions and 15 deletions
@@ -74,9 +74,8 @@ private fun resolveAndRecordReferenceTarget(
selector: DeclarationDescriptor?,
symbolUsageValidator: SymbolUsageValidator
) {
// TODO get rid of QualifierReceiver::resultingDescriptor. REFERENCE_TARGET should be enough.
qualifier.resultingDescriptor = resolveReferenceTarget(qualifier, context, selector, symbolUsageValidator)
context.trace.record(BindingContext.REFERENCE_TARGET, qualifier.referenceExpression, qualifier.resultingDescriptor)
val resultingDescriptor = resolveReferenceTarget(qualifier, context, selector, symbolUsageValidator)
context.trace.record(BindingContext.REFERENCE_TARGET, qualifier.referenceExpression, resultingDescriptor)
}
private fun resolveReferenceTarget(
@@ -44,26 +44,23 @@ public interface Qualifier: Receiver {
public val expression: KtExpression
public val referenceExpression: KtSimpleNameExpression
public val name: Name
get() = descriptor.name
public val descriptor: DeclarationDescriptor
// package, classifier or companion object descriptor
public val resultingDescriptor: DeclarationDescriptor
public val scope: MemberScope
}
abstract class QualifierReceiver(
val referenceExpression: KtSimpleNameExpression
override val referenceExpression: KtSimpleNameExpression
) : Qualifier {
override val expression: KtExpression
get() = referenceExpression.getTopmostParentQualifiedExpressionForSelector() ?: referenceExpression
override var resultingDescriptor: DeclarationDescriptor by Delegates.notNull()
abstract fun getNestedClassesAndPackageMembersScope(): MemberScope
override fun exists() = true
@@ -45,7 +45,7 @@ public object CreateClassFromConstructorCallActionFactory: CreateClassFromUsageF
val (context, moduleDescriptor) = element.analyzeFullyAndGetResult()
val file = element.containingFile as? KtFile ?: return emptyList()
val call = element.getCall(context) ?: return emptyList()
val targetParent = getTargetParentByCall(call, file) ?: return emptyList()
val targetParent = getTargetParentByCall(call, file, context) ?: return emptyList()
val classKind = if (inAnnotationEntry) ClassKind.ANNOTATION_CLASS else ClassKind.PLAIN_CLASS
val fullCallExpr = element.getQualifiedExpressionForSelectorOrThis()
@@ -77,7 +77,7 @@ public object CreateClassFromConstructorCallActionFactory: CreateClassFromUsageF
val (context, moduleDescriptor) = callExpr.analyzeFullyAndGetResult()
val call = callExpr.getCall(context) ?: return null
val targetParent = getTargetParentByCall(call, file) ?: return null
val targetParent = getTargetParentByCall(call, file, context) ?: return null
val inner = isInnerClassExpected(call)
val valueArguments = callExpr.valueArguments
@@ -96,7 +96,7 @@ public object CreateClassFromReferenceExpressionActionFactory : CreateClassFromU
if (fullCallExpr.getAssignmentByLHS() != null) return Collections.emptyList()
val call = element.getCall(context) ?: return Collections.emptyList()
val targetParent = getTargetParentByCall(call, file) ?: return Collections.emptyList()
val targetParent = getTargetParentByCall(call, file, context) ?: return Collections.emptyList()
if (isInnerClassExpected(call)) return Collections.emptyList()
val filter = fullCallExpr.getInheritableTypeInfo(context, moduleDescriptor, targetParent).second
@@ -136,7 +136,7 @@ public object CreateClassFromReferenceExpressionActionFactory : CreateClassFromU
}
val call = element.getCall(context) ?: return null
val targetParent = getTargetParentByCall(call, file) ?: return null
val targetParent = getTargetParentByCall(call, file, context) ?: return null
val expectedTypeInfo = fullCallExpr.getInheritableTypeInfo(context, moduleDescriptor, targetParent).first
@@ -68,11 +68,11 @@ internal fun getTargetParentByQualifier(
return if (targetParent.canRefactor()) return targetParent else null
}
internal fun getTargetParentByCall(call: Call, file: KtFile): PsiElement? {
internal fun getTargetParentByCall(call: Call, file: KtFile, context: BindingContext): PsiElement? {
val receiver = call.getExplicitReceiver()
return when (receiver) {
ReceiverValue.NO_RECEIVER -> getTargetParentByQualifier(file, false, null)
is Qualifier -> getTargetParentByQualifier(file, true, receiver.resultingDescriptor)
is Qualifier -> getTargetParentByQualifier(file, true, context[BindingContext.REFERENCE_TARGET, receiver.referenceExpression])
is ReceiverValue -> getTargetParentByQualifier(file, true, receiver.getType().getConstructor().getDeclarationDescriptor())
else -> throw AssertionError("Unexpected receiver: $receiver")
}