[NI] Use compatibility mode for KT-41934
This commit is contained in:
+16
-3
@@ -5,6 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.resolve.calls.inference.components
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.resolve.calls.components.transformToResolvedLambda
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.*
|
||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||
@@ -19,6 +21,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
class KotlinConstraintSystemCompleter(
|
||||
private val resultTypeResolver: ResultTypeResolver,
|
||||
val variableFixationFinder: VariableFixationFinder,
|
||||
val languageVersionSettings: LanguageVersionSettings,
|
||||
) {
|
||||
private val postponedArgumentInputTypesResolver = PostponedArgumentInputTypesResolver(resultTypeResolver, variableFixationFinder)
|
||||
|
||||
@@ -104,7 +107,8 @@ class KotlinConstraintSystemCompleter(
|
||||
postponedArguments,
|
||||
topLevelType,
|
||||
topLevelAtoms,
|
||||
dependencyProvider
|
||||
dependencyProvider,
|
||||
inferenceCompatibilityMode = isInferenceCompatibilityModeEnabled(),
|
||||
)
|
||||
|
||||
if (wasFixedSomeVariable)
|
||||
@@ -257,7 +261,8 @@ class KotlinConstraintSystemCompleter(
|
||||
getOrderedAllTypeVariables(collectVariablesFromContext, topLevelAtoms),
|
||||
postponedArguments,
|
||||
completionMode,
|
||||
topLevelType
|
||||
topLevelType,
|
||||
inferenceCompatibilityMode = isInferenceCompatibilityModeEnabled(),
|
||||
) ?: break
|
||||
|
||||
if (!variableForFixation.hasProperConstraint && completionMode == ConstraintSystemCompletionMode.PARTIAL)
|
||||
@@ -363,9 +368,17 @@ class KotlinConstraintSystemCompleter(
|
||||
collectVariablesFromContext: Boolean,
|
||||
postponedArguments: List<PostponedResolvedAtom>
|
||||
) = variableFixationFinder.findFirstVariableForFixation(
|
||||
this, getOrderedAllTypeVariables(collectVariablesFromContext, topLevelAtoms), postponedArguments, completionMode, topLevelType
|
||||
this,
|
||||
getOrderedAllTypeVariables(collectVariablesFromContext, topLevelAtoms),
|
||||
postponedArguments,
|
||||
completionMode,
|
||||
topLevelType,
|
||||
inferenceCompatibilityMode = isInferenceCompatibilityModeEnabled(),
|
||||
) != null
|
||||
|
||||
private fun isInferenceCompatibilityModeEnabled(): Boolean =
|
||||
languageVersionSettings.supportsFeature(LanguageFeature.InferenceCompatibility)
|
||||
|
||||
companion object {
|
||||
fun getOrderedNotAnalyzedPostponedArguments(topLevelAtoms: List<ResolvedAtom>): List<PostponedResolvedAtom> {
|
||||
fun ResolvedAtom.process(to: MutableList<PostponedResolvedAtom>) {
|
||||
|
||||
+13
-4
@@ -454,13 +454,21 @@ class PostponedArgumentInputTypesResolver(
|
||||
postponedArguments: List<PostponedResolvedAtom>,
|
||||
topLevelType: UnwrappedType,
|
||||
topLevelAtoms: List<ResolvedAtom>,
|
||||
dependencyProvider: TypeVariableDependencyInformationProvider
|
||||
dependencyProvider: TypeVariableDependencyInformationProvider,
|
||||
inferenceCompatibilityMode: Boolean = false,
|
||||
): Boolean {
|
||||
val expectedType = argument.run { safeAs<PostponedAtomWithRevisableExpectedType>()?.revisedExpectedType ?: expectedType }
|
||||
|
||||
if (expectedType != null && expectedType.isFunctionOrKFunctionTypeWithAnySuspendability) {
|
||||
val wasFixedSomeVariable =
|
||||
c.fixNextReadyVariableForParameterType(expectedType, postponedArguments, topLevelType, topLevelAtoms, dependencyProvider)
|
||||
c.fixNextReadyVariableForParameterType(
|
||||
expectedType,
|
||||
postponedArguments,
|
||||
topLevelType,
|
||||
topLevelAtoms,
|
||||
dependencyProvider,
|
||||
inferenceCompatibilityMode
|
||||
)
|
||||
|
||||
if (wasFixedSomeVariable)
|
||||
return true
|
||||
@@ -474,12 +482,13 @@ class PostponedArgumentInputTypesResolver(
|
||||
postponedArguments: List<PostponedResolvedAtom>,
|
||||
topLevelType: UnwrappedType,
|
||||
topLevelAtoms: List<ResolvedAtom>,
|
||||
dependencyProvider: TypeVariableDependencyInformationProvider
|
||||
dependencyProvider: TypeVariableDependencyInformationProvider,
|
||||
inferenceCompatibilityMode: Boolean,
|
||||
): Boolean {
|
||||
val relatedVariables = type.getPureArgumentsForFunctionalTypeOrSubtype()
|
||||
.flatMap { getAllDeeplyRelatedTypeVariables(it, dependencyProvider) }
|
||||
val variableForFixation = variableFixationFinder.findFirstVariableForFixation(
|
||||
this, relatedVariables, postponedArguments, ConstraintSystemCompletionMode.FULL, topLevelType
|
||||
this, relatedVariables, postponedArguments, ConstraintSystemCompletionMode.FULL, topLevelType, inferenceCompatibilityMode
|
||||
)
|
||||
|
||||
if (variableForFixation == null || !variableForFixation.hasProperConstraint)
|
||||
|
||||
Reference in New Issue
Block a user