diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolveUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolveUtil.kt index e6fe2ba52cb..78615d6066f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolveUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolveUtil.kt @@ -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( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt index e8c47910811..4f3c5f7d531 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt @@ -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 diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromConstructorCallActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromConstructorCallActionFactory.kt index e9caef32271..a1c77ec0cea 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromConstructorCallActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromConstructorCallActionFactory.kt @@ -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 diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromReferenceExpressionActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromReferenceExpressionActionFactory.kt index 74c2b7b63d3..7edc7bc694d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromReferenceExpressionActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromReferenceExpressionActionFactory.kt @@ -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 diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/createClassUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/createClassUtils.kt index f152a9a85b5..e135d41aab5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/createClassUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/createClassUtils.kt @@ -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") }