[NI] Report diagnostic on abstract class instantiation.

This commit is contained in:
Dmitry Petrov
2016-10-20 17:44:12 +03:00
committed by Stanislav Erokhin
parent b012681a53
commit 5afd3e72d6
7 changed files with 28 additions and 4 deletions
@@ -157,6 +157,9 @@ fun isInfixCall(call: Call): Boolean {
return binaryExpression.operationReference === operationRefExpression && operationRefExpression.operationSignTokenType == null
}
fun isSupertypeConstructorCall(call: Call): Boolean =
call.calleeExpression is KtConstructorCalleeExpression
fun isInvokeCallOnVariable(call: Call): Boolean {
if (call.callType !== Call.CallType.INVOKE) return false
val dispatchReceiver = call.dispatchReceiver
@@ -50,6 +50,7 @@ class DiagnosticReporterByTrackingStrategy(
when (diagnostic.javaClass) {
VisibilityError::class.java -> tracingStrategy.invisibleMember(trace, (diagnostic as VisibilityError).invisibleMember)
NoValueForParameter::class.java -> tracingStrategy.noValueForParameter(trace, (diagnostic as NoValueForParameter).parameterDescriptor)
InstantiationOfAbstractClass::class.java -> tracingStrategy.instantiationOfAbstractClass(trace)
}
}
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.resolve.calls.model.KotlinCallKind
import org.jetbrains.kotlin.resolve.calls.CallTransformer
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isConventionCall
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isInfixCall
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isSupertypeConstructorCall
import org.jetbrains.kotlin.resolve.calls.model.*
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
@@ -59,6 +60,7 @@ class PSIKotlinCallImpl(
) : PSIKotlinCall() {
override val isInfixCall: Boolean get() = isInfixCall(psiCall)
override val isOperatorCall: Boolean get() = isConventionCall(psiCall)
override val isSupertypeConstructorCall: Boolean get() = isSupertypeConstructorCall(psiCall)
}
class PSIKotlinCallForVariable(
@@ -81,6 +83,7 @@ class PSIKotlinCallForVariable(
override val isInfixCall: Boolean get() = false
override val isOperatorCall: Boolean get() = false
override val isSupertypeConstructorCall: Boolean get() = false
}
class PSIKotlinCallForInvoke(
@@ -101,6 +104,7 @@ class PSIKotlinCallForInvoke(
override val isInfixCall: Boolean get() = false
override val isOperatorCall: Boolean get() = true
override val isSupertypeConstructorCall: Boolean get() = false
init {
val variableReceiver = dispatchReceiverForInvokeExtension ?: explicitReceiver