Stop tower resolve in K2 in more similar manner with K1

This commit is contained in:
Mikhail Glukhikh
2022-07-19 08:43:51 +02:00
committed by Space
parent 26ed21ec96
commit 32a73968de
21 changed files with 36 additions and 37 deletions
@@ -835,7 +835,7 @@ class AllCandidatesCollector(
}
// We want to get candidates at all tower levels.
override fun shouldStopAtTheLevel(group: TowerGroup): Boolean = false
override fun shouldStopAtTheGroup(group: TowerGroup): Boolean = false
val allCandidates: List<Candidate>
get() = allCandidatesSet.toList()
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isSuspend
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -24,8 +24,6 @@ import org.jetbrains.kotlin.fir.resolve.inference.extractInputOutputTypesFromCal
import org.jetbrains.kotlin.fir.types.isSuspendFunctionType
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.unwrapFakeOverrides
import org.jetbrains.kotlin.fir.visibilityChecker
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.StandardClassIds
@@ -53,7 +51,9 @@ internal object CheckCallableReferenceExpectedType : CheckerStage() {
val resultingType = candidate.substitutor.substituteOrSelf(rawResultingType)
if (callableReferenceAdaptation.needCompatibilityResolveForCallableReference()) {
sink.reportDiagnostic(LowerPriorityToPreserveCompatibilityDiagnostic)
if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.DisableCompatibilityModeForNewInference)) {
sink.reportDiagnostic(LowerPriorityToPreserveCompatibilityDiagnostic)
}
}
candidate.resultingTypeForCallableReference = resultingType
@@ -8,8 +8,9 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.calls.tower.TowerGroup
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability.DSL_SCOPE_VIOLATION
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability.K2_SYNTHETIC_RESOLVED
import org.jetbrains.kotlin.resolve.calls.tower.isSuccess
import org.jetbrains.kotlin.resolve.calls.tower.shouldStopResolve
open class CandidateCollector(
val components: BodyResolveComponents,
@@ -48,10 +49,12 @@ open class CandidateCollector(
fun bestCandidates(): List<Candidate> = candidates
open fun shouldStopAtTheLevel(group: TowerGroup): Boolean =
currentApplicability.shouldStopResolve && bestGroup < group
open fun shouldStopAtTheGroup(group: TowerGroup): Boolean =
shouldStopResolve && bestGroup < group
fun isSuccess(): Boolean {
return currentApplicability.isSuccess
}
private val shouldStopResolve: Boolean
get() = currentApplicability == DSL_SCOPE_VIOLATION || currentApplicability >= K2_SYNTHETIC_RESOLVED
val isSuccess: Boolean
get() = currentApplicability.isSuccess
}
@@ -504,7 +504,7 @@ internal object EagerResolveOfCallableReferences : CheckerStage() {
internal object DiscriminateSynthetics : CheckerStage() {
override suspend fun check(candidate: Candidate, callInfo: CallInfo, sink: CheckerSink, context: ResolutionContext) {
if (candidate.symbol is SyntheticSymbol) {
sink.reportDiagnostic(ResolvedWithLowPriority)
sink.reportDiagnostic(ResolvedWithSynthetic)
}
}
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.resolve.calls.tower
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
@@ -316,7 +315,7 @@ private fun BodyResolveComponents.createExplicitReceiverForInvokeByCallable(
explicitReceiver = info.explicitReceiver
}
if (candidate.currentApplicability == CandidateApplicability.PROPERTY_AS_OPERATOR) {
if (candidate.currentApplicability == CandidateApplicability.K2_PROPERTY_AS_OPERATOR) {
nonFatalDiagnostics.add(ConePropertyAsOperator(candidate.symbol as FirPropertySymbol))
}
}.build().let(::transformQualifiedAccessUsingSmartcastInfo)
@@ -164,7 +164,7 @@ internal abstract class FirBaseTowerResolveTask(
finalGroup,
towerLevel
)
if (collector.isSuccess()) onSuccessfulLevel(finalGroup)
if (collector.isSuccess) onSuccessfulLevel(finalGroup)
return result == ProcessResult.SCOPE_EMPTY
}
}
@@ -45,7 +45,7 @@ internal class TowerLevelHandler {
CallKind.VariableAccess -> {
processResult += towerLevel.processPropertiesByName(info, processor)
if (!collector.isSuccess() && towerLevel is ScopeTowerLevel && !towerLevel.areThereExtensionReceiverOptions()) {
if (!collector.isSuccess && towerLevel is ScopeTowerLevel && !towerLevel.areThereExtensionReceiverOptions()) {
processResult += towerLevel.processObjectsByName(info, processor)
}
}
@@ -17,7 +17,7 @@ import kotlin.coroutines.resume
class TowerResolveManager private constructor(private val shouldStopAtTheLevel: (TowerGroup) -> Boolean) {
constructor(collector: CandidateCollector) : this(collector::shouldStopAtTheLevel)
constructor(collector: CandidateCollector) : this(collector::shouldStopAtTheGroup)
private val queue = PriorityQueue<SuspendedResolverTask>()
@@ -149,7 +149,7 @@ class FirCallCompletionResultsWriterTransformer(
result.replaceContextReceiverArguments(subCandidate.contextReceiverArguments())
if (result is FirPropertyAccessExpressionImpl && calleeReference.candidate.currentApplicability == CandidateApplicability.PROPERTY_AS_OPERATOR) {
if (result is FirPropertyAccessExpressionImpl && calleeReference.candidate.currentApplicability == CandidateApplicability.K2_PROPERTY_AS_OPERATOR) {
result.nonFatalDiagnostics.add(ConePropertyAsOperator(calleeReference.candidate.symbol as FirPropertySymbol))
}