diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt index b1845be08c6..a08312d4309 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -89,6 +89,13 @@ class DiagnosticReporterByTrackingStrategy( val implicitInvokeCheck = (callReceiver as? ReceiverExpressionKotlinCallArgument)?.isVariableReceiverForInvoke ?: false tracingStrategy.unsafeCall(trace, callReceiver.receiver.receiverValue.type, implicitInvokeCheck) } + + SuperAsExtensionReceiver::class.java -> { + val psiExpression = callReceiver.psiExpression + if (psiExpression is KtSuperExpression) { + trace.report(SUPER_CANT_BE_EXTENSION_RECEIVER.on(psiExpression, psiExpression.text)) + } + } } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt index e973967ca3c..08e5090f1d9 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt @@ -291,7 +291,7 @@ internal object CheckOperatorResolutionPart : ResolutionPart() { } } -internal object CheckAbstractSuperCallPart : ResolutionPart() { +internal object CheckSuperExpressionCallPart : ResolutionPart() { override fun KotlinResolutionCandidate.process(workIndex: Int) { val candidateDescriptor = resolvedCall.candidateDescriptor @@ -300,6 +300,11 @@ internal object CheckAbstractSuperCallPart : ResolutionPart() { addDiagnostic(AbstractSuperCall) } } + + val extensionReceiver = resolvedCall.extensionReceiverArgument + if (extensionReceiver != null && callComponents.statelessCallbacks.isSuperExpression(extensionReceiver)) { + addDiagnostic(SuperAsExtensionReceiver(extensionReceiver)) + } } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt index d140ba683f5..0b2a761c50b 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt @@ -156,6 +156,12 @@ object AbstractSuperCall : KotlinCallDiagnostic(RUNTIME_ERROR) { } } +class SuperAsExtensionReceiver(val receiver: SimpleKotlinCallArgument) : KotlinCallDiagnostic(RUNTIME_ERROR) { + override fun report(reporter: DiagnosticReporter) { + reporter.onCallReceiver(receiver, this) + } +} + class SpreadArgumentToNonVarargParameter(val argument: KotlinCallArgument) : KotlinCallDiagnostic(RUNTIME_ERROR) { override fun report(reporter: DiagnosticReporter) { reporter.onCallArgument(argument, this) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt index fa29c143bba..25860fc4d70 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt @@ -162,7 +162,7 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) { CheckVisibility, CheckInfixResolutionPart, CheckOperatorResolutionPart, - CheckAbstractSuperCallPart, + CheckSuperExpressionCallPart, NoTypeArguments, NoArguments, CreateFreshVariablesSubstitutor, @@ -173,7 +173,7 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) { CheckInstantiationOfAbstractClass, CheckVisibility, CheckInfixResolutionPart, - CheckAbstractSuperCallPart, + CheckSuperExpressionCallPart, MapTypeArguments, MapArguments, ArgumentsToCandidateParameterDescriptor,