diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt index e4ca5b9f3f1..5d8772cdb5f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt @@ -125,8 +125,10 @@ class KotlinToResolvedCallTransformer( doubleColonExpressionResolver, builtIns, deprecationResolver, moduleDescriptor, dataFlowValueFactory ) - for (subKtPrimitive in candidate.subResolvedAtoms) { - ktPrimitiveCompleter.completeAll(subKtPrimitive) + if (!ErrorUtils.isError(candidate.candidateDescriptor)) { + for (subKtPrimitive in candidate.subResolvedAtoms) { + ktPrimitiveCompleter.completeAll(subKtPrimitive) + } } val resolvedCall = ktPrimitiveCompleter.completeResolvedCall(candidate, baseResolvedCall.diagnostics) as ResolvedCall diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt index c0f8bb19f1d..1cd74f79919 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt @@ -202,7 +202,7 @@ class PSICallResolver( val trace = context.trace - handleErrorResolutionResult(trace, result, tracingStrategy)?.let { errorResult -> + handleErrorResolutionResult(context, trace, result, tracingStrategy)?.let { errorResult -> context.inferenceSession.addErrorCallInfo(PSIErrorCallInfo(result, errorResult)) return errorResult } @@ -217,6 +217,7 @@ class PSICallResolver( } private fun handleErrorResolutionResult( + context: BasicCallResolutionContext, trace: BindingTrace, result: CallResolutionResult, tracingStrategy: TracingStrategy @@ -224,6 +225,8 @@ class PSICallResolver( val diagnostics = result.diagnostics diagnostics.firstIsInstanceOrNull()?.let { + kotlinToResolvedCallTransformer.transformAndReport(result, context, tracingStrategy) + tracingStrategy.unresolvedReference(trace) return OverloadResolutionResultsImpl.nameNotFound() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt index 03e01cd5277..e822d288e77 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter.kt @@ -84,6 +84,12 @@ class ResolvedAtomCompleter( diagnostics ) + val lastCall = if (resolvedCall is VariableAsFunctionResolvedCall) resolvedCall.functionCall else resolvedCall + if (ErrorUtils.isError(resolvedCall.candidateDescriptor)) { + kotlinToResolvedCallTransformer.runArgumentsChecks(topLevelCallContext, topLevelTrace, lastCall as NewResolvedCallImpl<*>) + return resolvedCall + } + val resolutionContextForPartialCall = topLevelCallContext.trace[BindingContext.PARTIAL_CALL_RESOLUTION_CONTEXT, resolvedCallAtom.atom.psiKotlinCall.psiCall] @@ -98,8 +104,6 @@ class ResolvedAtomCompleter( kotlinToResolvedCallTransformer.bindAndReport(topLevelCallContext, topLevelTrace, resolvedCall, diagnostics) - val lastCall = if (resolvedCall is VariableAsFunctionResolvedCall) resolvedCall.functionCall else resolvedCall - kotlinToResolvedCallTransformer.runArgumentsChecks(topLevelCallContext, topLevelTrace, lastCall as NewResolvedCallImpl<*>) kotlinToResolvedCallTransformer.runCallCheckers(resolvedCall, callCheckerContext) kotlinToResolvedCallTransformer.runAdditionalReceiversCheckers(resolvedCall, topLevelCallContext) diff --git a/compiler/testData/diagnostics/tests/InvokeAndRecursiveResolve.kt b/compiler/testData/diagnostics/tests/InvokeAndRecursiveResolve.kt index f0552332703..408a6caef2d 100644 --- a/compiler/testData/diagnostics/tests/InvokeAndRecursiveResolve.kt +++ b/compiler/testData/diagnostics/tests/InvokeAndRecursiveResolve.kt @@ -14,6 +14,6 @@ class B { } class C { - val bar = test() + val bar = test() val test = bar() } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/qualifiedExpression/calleeExpressionAsCallExpression.kt b/compiler/testData/diagnostics/tests/qualifiedExpression/calleeExpressionAsCallExpression.kt index c7c903b26f5..31bea1ed20a 100644 --- a/compiler/testData/diagnostics/tests/qualifiedExpression/calleeExpressionAsCallExpression.kt +++ b/compiler/testData/diagnostics/tests/qualifiedExpression/calleeExpressionAsCallExpression.kt @@ -1,2 +1,2 @@ // !WITH_NEW_INFERENCE -val unwrapped = some<sdf()()Any>::unwrap \ No newline at end of file +val unwrapped = some<sdf()()Any>::unwrap \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/qualifiedExpression/nullCalleeExpression.kt b/compiler/testData/diagnostics/tests/qualifiedExpression/nullCalleeExpression.kt index 790ef459c28..c8c78926ca4 100644 --- a/compiler/testData/diagnostics/tests/qualifiedExpression/nullCalleeExpression.kt +++ b/compiler/testData/diagnostics/tests/qualifiedExpression/nullCalleeExpression.kt @@ -1,4 +1,4 @@ // !WITH_NEW_INFERENCE // NI_EXPECTED_FILE -val unwrapped = some.<cabc$WrapperAny>::unwrap \ No newline at end of file +val unwrapped = some.<cabc$WrapperAny>::unwrap \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/kt13685.kt b/compiler/testData/diagnostics/tests/regressions/kt13685.kt index 1287502f6c1..3d3772577f7 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt13685.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt13685.kt @@ -3,5 +3,5 @@ fun foo() { val text: List = null!! - text.map Any?::toString + text.map Any?::toString }