Stop tower resolve in K2 in more similar manner with K1
This commit is contained in:
@@ -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()
|
||||
|
||||
+5
-5
@@ -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
|
||||
|
||||
+9
-6
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -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)
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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>()
|
||||
|
||||
|
||||
+1
-1
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user