[NI] Use compatibility mode for KT-41934

This commit is contained in:
Pavel Kirpichenkov
2020-09-18 12:12:42 +03:00
parent 1465e10f12
commit fdc134ff66
6 changed files with 65 additions and 22 deletions
@@ -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>) {
@@ -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)