Add running additional receiver checkers in new inference
That commit fix next diagnostics: * RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS * NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS (partially, see #KT-29367)
This commit is contained in:
+33
@@ -12,10 +12,12 @@ import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.*
|
||||
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
||||
import org.jetbrains.kotlin.resolve.calls.CallTransformer
|
||||
import org.jetbrains.kotlin.resolve.calls.DiagnosticReporterByTrackingStrategy
|
||||
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.getEffectiveExpectedType
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.isFakeElement
|
||||
import org.jetbrains.kotlin.resolve.calls.checkers.AdditionalTypeChecker
|
||||
import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker
|
||||
import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext
|
||||
import org.jetbrains.kotlin.resolve.calls.components.AdditionalDiagnosticReporter
|
||||
@@ -53,6 +55,7 @@ import java.util.*
|
||||
|
||||
class KotlinToResolvedCallTransformer(
|
||||
private val callCheckers: Iterable<CallChecker>,
|
||||
private val additionalTypeCheckers: Iterable<AdditionalTypeChecker>,
|
||||
private val dataFlowAnalyzer: DataFlowAnalyzer,
|
||||
private val argumentTypeResolver: ArgumentTypeResolver,
|
||||
private val constantExpressionEvaluator: ConstantExpressionEvaluator,
|
||||
@@ -202,6 +205,36 @@ class KotlinToResolvedCallTransformer(
|
||||
}
|
||||
}
|
||||
|
||||
fun runAdditionalReceiversCheckers(resolvedCall: ResolvedCall<*>, context: BasicCallResolutionContext) {
|
||||
context.checkReceiver(
|
||||
resolvedCall,
|
||||
resolvedCall.resultingDescriptor.extensionReceiverParameter,
|
||||
resolvedCall.extensionReceiver,
|
||||
resolvedCall.explicitReceiverKind.isExtensionReceiver,
|
||||
implicitInvokeCheck = false
|
||||
)
|
||||
context.checkReceiver(
|
||||
resolvedCall,
|
||||
resolvedCall.resultingDescriptor.dispatchReceiverParameter,
|
||||
resolvedCall.dispatchReceiver,
|
||||
resolvedCall.explicitReceiverKind.isDispatchReceiver,
|
||||
implicitInvokeCheck = context.call is CallTransformer.CallForImplicitInvoke
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
private fun BasicCallResolutionContext.checkReceiver(
|
||||
resolvedCall: ResolvedCall<*>,
|
||||
receiverParameter: ReceiverParameterDescriptor?,
|
||||
receiverArgument: ReceiverValue?,
|
||||
isExplicitReceiver: Boolean,
|
||||
implicitInvokeCheck: Boolean
|
||||
) {
|
||||
if (receiverParameter == null || receiverArgument == null) return
|
||||
val safeAccess = isExplicitReceiver && !implicitInvokeCheck && resolvedCall.call.isSemanticallyEquivalentToSafeCall
|
||||
additionalTypeCheckers.forEach { it.checkReceiver(receiverParameter, receiverArgument, safeAccess, this) }
|
||||
}
|
||||
|
||||
// todo very beginning code
|
||||
fun runArgumentsChecks(
|
||||
context: BasicCallResolutionContext,
|
||||
|
||||
+1
@@ -99,6 +99,7 @@ class ResolvedAtomCompleter(
|
||||
|
||||
kotlinToResolvedCallTransformer.runArgumentsChecks(topLevelCallContext, topLevelTrace, lastCall as NewResolvedCallImpl<*>)
|
||||
kotlinToResolvedCallTransformer.runCallCheckers(resolvedCall, callCheckerContext)
|
||||
kotlinToResolvedCallTransformer.runAdditionalReceiversCheckers(resolvedCall, topLevelCallContext)
|
||||
|
||||
return resolvedCall
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user