[NI] Get rid of ResolvedAtom usage in ConstraintSystemCompletionContext

This commit is contained in:
Dmitriy Novozhilov
2020-08-26 12:45:13 +03:00
parent 11e8552861
commit aae1681b76
7 changed files with 25 additions and 15 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.inference.TypeParameterBasedTypeVariable import org.jetbrains.kotlin.fir.resolve.inference.TypeParameterBasedTypeVariable
import org.jetbrains.kotlin.fir.resolve.inference.model.ConeDeclaredUpperBoundConstraintPosition
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
@@ -17,7 +18,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirTypePlaceholderProjection import org.jetbrains.kotlin.fir.types.impl.FirTypePlaceholderProjection
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation
import org.jetbrains.kotlin.fir.resolve.inference.model.FirDeclaredUpperBoundConstraintPosition
import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition
internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() { internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() {
@@ -137,7 +137,7 @@ private fun createToFreshVariableSubstitutorAndAddInitialConstraints(
csBuilder.addSubtypeConstraint( csBuilder.addSubtypeConstraint(
defaultType, defaultType,
toFreshVariables.substituteOrSelf(upperBound), toFreshVariables.substituteOrSelf(upperBound),
FirDeclaredUpperBoundConstraintPosition() ConeDeclaredUpperBoundConstraintPosition()
) )
} }
@@ -9,11 +9,15 @@ import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.resolve.calls.Candidate
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
import org.jetbrains.kotlin.fir.resolve.inference.model.ConeFixVariableConstraintPosition
import org.jetbrains.kotlin.fir.returnExpressions import org.jetbrains.kotlin.fir.returnExpressions
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
import org.jetbrains.kotlin.resolve.calls.inference.components.* import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionContext
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode
import org.jetbrains.kotlin.resolve.calls.inference.components.TypeVariableDirectionCalculator
import org.jetbrains.kotlin.resolve.calls.inference.components.VariableFixationFinder
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl
import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition
import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints
@@ -203,7 +207,8 @@ class ConstraintSystemCompleter(private val components: BodyResolveComponents) {
) { ) {
val direction = TypeVariableDirectionCalculator(c, postponedResolveKtPrimitives, topLevelType).getDirection(variableWithConstraints) val direction = TypeVariableDirectionCalculator(c, postponedResolveKtPrimitives, topLevelType).getDirection(variableWithConstraints)
val resultType = components.inferenceComponents.resultTypeResolver.findResultType(c, variableWithConstraints, direction) val resultType = components.inferenceComponents.resultTypeResolver.findResultType(c, variableWithConstraints, direction)
c.fixVariable(variableWithConstraints.typeVariable, resultType, atom = null) // TODO: obtain atom for diagnostics val variable = variableWithConstraints.typeVariable
c.fixVariable(variable, resultType, ConeFixVariableConstraintPosition(variable)) // TODO: obtain atom for diagnostics
} }
private fun analyzePostponeArgumentIfPossible( private fun analyzePostponeArgumentIfPossible(
@@ -6,5 +6,9 @@
package org.jetbrains.kotlin.fir.resolve.inference.model package org.jetbrains.kotlin.fir.resolve.inference.model
import org.jetbrains.kotlin.resolve.calls.inference.model.DeclaredUpperBoundConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.DeclaredUpperBoundConstraintPosition
import org.jetbrains.kotlin.resolve.calls.inference.model.FixVariableConstraintPosition
import org.jetbrains.kotlin.types.model.TypeVariableMarker
class FirDeclaredUpperBoundConstraintPosition : DeclaredUpperBoundConstraintPosition<Nothing?>(null) class ConeDeclaredUpperBoundConstraintPosition : DeclaredUpperBoundConstraintPosition<Nothing?>(null)
class ConeFixVariableConstraintPosition(variable: TypeVariableMarker) : FixVariableConstraintPosition<Nothing?>(variable, null)
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.resolve.calls.inference.components
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintSystemError import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintSystemError
import org.jetbrains.kotlin.resolve.calls.inference.model.FixVariableConstraintPosition
import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints
import org.jetbrains.kotlin.resolve.calls.model.ResolvedAtom
import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker
import org.jetbrains.kotlin.types.model.TypeConstructorMarker import org.jetbrains.kotlin.types.model.TypeConstructorMarker
import org.jetbrains.kotlin.types.model.TypeVariableMarker import org.jetbrains.kotlin.types.model.TypeVariableMarker
@@ -28,7 +28,7 @@ interface ConstraintSystemCompletionContext : VariableFixationFinder.Context, Re
// mutable operations // mutable operations
fun addError(error: ConstraintSystemError) fun addError(error: ConstraintSystemError)
fun fixVariable(variable: TypeVariableMarker, resultType: KotlinTypeMarker, atom: ResolvedAtom?) fun fixVariable(variable: TypeVariableMarker, resultType: KotlinTypeMarker, position: FixVariableConstraintPosition<*>)
fun asConstraintSystemCompletionContext(): ConstraintSystemCompletionContext fun asConstraintSystemCompletionContext(): ConstraintSystemCompletionContext
} }
@@ -238,8 +238,9 @@ class KotlinConstraintSystemCompleter(
topLevelAtoms: List<ResolvedAtom> topLevelAtoms: List<ResolvedAtom>
) { ) {
val resultType = resultTypeResolver.findResultType(c, variableWithConstraints, direction) val resultType = resultTypeResolver.findResultType(c, variableWithConstraints, direction)
val resolvedAtom = findResolvedAtomBy(variableWithConstraints.typeVariable, topLevelAtoms) ?: topLevelAtoms.firstOrNull() val variable = variableWithConstraints.typeVariable
c.fixVariable(variableWithConstraints.typeVariable, resultType, resolvedAtom) val resolvedAtom = findResolvedAtomBy(variable, topLevelAtoms) ?: topLevelAtoms.firstOrNull()
c.fixVariable(variable, resultType, FixVariableConstraintPositionImpl(variable, resolvedAtom))
} }
private fun ConstraintSystemCompletionContext.fixVariablesOrReportNotEnoughInformation( private fun ConstraintSystemCompletionContext.fixVariablesOrReportNotEnoughInformation(
@@ -300,7 +301,7 @@ class KotlinConstraintSystemCompleter(
else -> ErrorUtils.createErrorType("Cannot infer type variable $typeVariable") else -> ErrorUtils.createErrorType("Cannot infer type variable $typeVariable")
} }
c.fixVariable(typeVariable, resultErrorType, resolvedAtom) c.fixVariable(typeVariable, resultErrorType, FixVariableConstraintPositionImpl(typeVariable, resolvedAtom))
} }
private fun ConstraintSystemCompletionContext.getOrderedAllTypeVariables( private fun ConstraintSystemCompletionContext.getOrderedAllTypeVariables(
@@ -468,10 +468,11 @@ class PostponedArgumentInputTypesResolver(
val variableWithConstraints = notFixedTypeVariables.getValue(variableForFixation.variable) val variableWithConstraints = notFixedTypeVariables.getValue(variableForFixation.variable)
val resultType = val resultType =
resultTypeResolver.findResultType(this, variableWithConstraints, TypeVariableDirectionCalculator.ResolveDirection.UNKNOWN) resultTypeResolver.findResultType(this, variableWithConstraints, TypeVariableDirectionCalculator.ResolveDirection.UNKNOWN)
val resolvedAtom = KotlinConstraintSystemCompleter.findResolvedAtomBy(variableWithConstraints.typeVariable, topLevelAtoms) val variable = variableWithConstraints.typeVariable
val resolvedAtom = KotlinConstraintSystemCompleter.findResolvedAtomBy(variable, topLevelAtoms)
?: topLevelAtoms.firstOrNull() ?: topLevelAtoms.firstOrNull()
fixVariable(variableWithConstraints.typeVariable, resultType, resolvedAtom) fixVariable(variable, resultType, FixVariableConstraintPositionImpl(variable, resolvedAtom))
return true return true
} }
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.resolve.calls.inference.model
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzerContext import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzerContext
import org.jetbrains.kotlin.resolve.calls.inference.* import org.jetbrains.kotlin.resolve.calls.inference.*
import org.jetbrains.kotlin.resolve.calls.inference.components.* import org.jetbrains.kotlin.resolve.calls.inference.components.*
import org.jetbrains.kotlin.resolve.calls.model.ResolvedAtom
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker
import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.types.model.*
@@ -292,11 +291,11 @@ class NewConstraintSystemImpl(
// KotlinConstraintSystemCompleter.Context // KotlinConstraintSystemCompleter.Context
// TODO: simplify this: do only substitution a fixing type variable rather than running of subtyping and full incorporation // TODO: simplify this: do only substitution a fixing type variable rather than running of subtyping and full incorporation
override fun fixVariable(variable: TypeVariableMarker, resultType: KotlinTypeMarker, atom: ResolvedAtom?) { override fun fixVariable(variable: TypeVariableMarker, resultType: KotlinTypeMarker, position: FixVariableConstraintPosition<*>) {
checkState(State.BUILDING, State.COMPLETION) checkState(State.BUILDING, State.COMPLETION)
constraintInjector.addInitialEqualityConstraint( constraintInjector.addInitialEqualityConstraint(
this, variable.defaultType(), resultType, FixVariableConstraintPositionImpl(variable, atom) this, variable.defaultType(), resultType, position
) )
val freshTypeConstructor = variable.freshTypeConstructor() val freshTypeConstructor = variable.freshTypeConstructor()