diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirOverloadByLambdaReturnTypeResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirOverloadByLambdaReturnTypeResolver.kt index 2d9ac6d2766..536f1a9e888 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirOverloadByLambdaReturnTypeResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirOverloadByLambdaReturnTypeResolver.kt @@ -158,7 +158,7 @@ class FirOverloadByLambdaReturnTypeResolver( val successfulCandidates = mutableSetOf() for (candidate in candidates) { - if (candidate.isSuccessful()) { + if (candidate.isSuccessful) { successfulCandidates += candidate } else { errorCandidates += candidate diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt index a8587b470c1..5ba2bb7383f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt @@ -109,17 +109,22 @@ class Candidate( lateinit var typeArgumentMapping: TypeArgumentMapping val postponedAtoms = mutableListOf() - val diagnostics: MutableList = mutableListOf() + var currentApplicability = CandidateApplicability.RESOLVED + private set + + private val _diagnostics: MutableList = mutableListOf() + val diagnostics: List + get() = _diagnostics fun addDiagnostic(diagnostic: ResolutionDiagnostic) { - diagnostics += diagnostic + _diagnostics += diagnostic + if (diagnostic.applicability < currentApplicability) { + currentApplicability = diagnostic.applicability + } } - fun isSuccessful(): Boolean { - if (system.hasContradiction) return false - val currentApplicability = diagnostics.map { it.applicability }.minOrNull() ?: CandidateApplicability.RESOLVED - return currentApplicability.isSuccess - } + val isSuccessful: Boolean + get() = currentApplicability.isSuccess && (!systemInitialized || !system.hasContradiction) var passedStages: Int = 0 diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CheckerSink.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CheckerSink.kt index a7df41f8a59..fd0f9f3d006 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CheckerSink.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CheckerSink.kt @@ -32,20 +32,12 @@ suspend inline fun CheckerSink.yieldDiagnostic(diagnostic: ResolutionDiagnostic) } class CheckerSinkImpl( + private val candidate: Candidate, var continuation: Continuation? = null, - val stopOnFirstError: Boolean = true + val stopOnFirstError: Boolean = true, ) : CheckerSink() { - var currentApplicability = CandidateApplicability.RESOLVED - private set - - private val _diagnostics: MutableList = mutableListOf() - - val diagnostics: List - get() = _diagnostics - override fun reportDiagnostic(diagnostic: ResolutionDiagnostic) { - _diagnostics += diagnostic - if (diagnostic.applicability < currentApplicability) currentApplicability = diagnostic.applicability + candidate.addDiagnostic(diagnostic) } @PrivateForInline @@ -55,6 +47,5 @@ class CheckerSinkImpl( } override val needYielding: Boolean - get() = stopOnFirstError && !currentApplicability.isSuccess - + get() = stopOnFirstError && !candidate.isSuccessful } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStageRunner.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStageRunner.kt index cd60d63f7a4..2fda86facfc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStageRunner.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStageRunner.kt @@ -15,7 +15,7 @@ import kotlin.coroutines.resume class ResolutionStageRunner { fun processCandidate(candidate: Candidate, context: ResolutionContext, stopOnFirstError: Boolean = true): CandidateApplicability { - val sink = CheckerSinkImpl(stopOnFirstError = stopOnFirstError) + val sink = CheckerSinkImpl(candidate, stopOnFirstError = stopOnFirstError) var finished = false sink.continuation = suspend { candidate.callInfo.callKind.resolutionSequence.forEachIndexed { index, stage -> @@ -35,11 +35,10 @@ class ResolutionStageRunner { while (!finished) { sink.continuation!!.resume(Unit) - if (!sink.currentApplicability.isSuccess) { + if (!candidate.isSuccessful) { break } } - candidate.diagnostics += sink.diagnostics - return sink.currentApplicability + return candidate.currentApplicability } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedArgumentsAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedArgumentsAnalyzer.kt index 51576967e7a..314f0cc7d58 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedArgumentsAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedArgumentsAnalyzer.kt @@ -162,7 +162,7 @@ class PostponedArgumentsAnalyzer( returnArguments.forEach { c.addSubsystemFromExpression(it) } - val checkerSink: CheckerSink = CheckerSinkImpl() + val checkerSink: CheckerSink = CheckerSinkImpl(candidate) var hasExpressionInReturnArguments = false val lambdaReturnType = lambda.returnType.let(substitute).takeUnless { it.isUnit } diff --git a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt index aadaa644da0..947ed35dc4a 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt @@ -11,10 +11,10 @@ fun test() { const val a3 = 0 lateinit val a4 = 0 val a5 by Delegate() - val a6 by Delegate<T>() + val a6 by Delegate<T>() } class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String = "" operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {} -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt index e805b1b2abc..7665acd5aff 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt @@ -11,10 +11,10 @@ fun test() { const val a3 = 0 lateinit val a4 = 0 val a5 by Delegate() - val a6 by Delegate<T>() + val a6 by Delegate<T>() } class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String = "" operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {} -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/propertyDefferedType.fir.kt b/compiler/testData/diagnostics/tests/delegatedProperty/propertyDefferedType.fir.kt index 7ad8d8e86df..ebe6e435f98 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/propertyDefferedType.fir.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/propertyDefferedType.fir.kt @@ -5,7 +5,7 @@ import kotlin.reflect.KProperty class B { - val c by Delegate(ag) + val c by Delegate(ag) } class Delegate(val init: T) { diff --git a/compiler/testData/diagnostics/tests/funInterface/funInterfaceConversionOnReceiver.fir.kt b/compiler/testData/diagnostics/tests/funInterface/funInterfaceConversionOnReceiver.fir.kt index 2c88e4dfe66..78f2420bb8e 100644 --- a/compiler/testData/diagnostics/tests/funInterface/funInterfaceConversionOnReceiver.fir.kt +++ b/compiler/testData/diagnostics/tests/funInterface/funInterfaceConversionOnReceiver.fir.kt @@ -5,5 +5,5 @@ fun interface Bar { operator fun Bar.plus(b: Bar): String = invoke() + b.invoke() fun box(): String { - return { "O" } + { "K" } + return { "O" } + { "K" } } diff --git a/compiler/testData/diagnostics/tests/generics/projectionsScope/typeParameterBounds.fir.kt b/compiler/testData/diagnostics/tests/generics/projectionsScope/typeParameterBounds.fir.kt index b7ec4f2145a..61d58b38e35 100644 --- a/compiler/testData/diagnostics/tests/generics/projectionsScope/typeParameterBounds.fir.kt +++ b/compiler/testData/diagnostics/tests/generics/projectionsScope/typeParameterBounds.fir.kt @@ -14,14 +14,14 @@ class A { fun foo2(a: A, b: A) { a.foo1(Out()) - a.foo1>(Out()) + a.foo1<Out>(Out()) a.foo1(Out()) a.foo1(Out()) a.foo2(Inv()) a.foo2(Inv()) - a.foo2>(Inv()) + a.foo2<Inv>(Inv()) a.foo3(In()) a.foo3(In()) @@ -33,11 +33,11 @@ fun foo2(a: A, b: A) { b.foo2(Inv()) b.foo2(Inv()) - b.foo2>(Inv()) + b.foo2<Inv>(Inv()) b.foo3(In()) - b.foo3>(In()) + b.foo3<In>(In()) b.foo3(In()) b.foo3(In())