[FIR] Add base class for PostponedResolvedAtomMarker to FIR

This commit is contained in:
Dmitriy Novozhilov
2020-03-06 12:01:31 +03:00
parent 2a58fc238f
commit 643d7be12d
5 changed files with 17 additions and 34 deletions
@@ -13,10 +13,8 @@ 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.calls.candidate import org.jetbrains.kotlin.fir.resolve.calls.candidate
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.FirCallCompletionResultsWriterTransformer
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor
import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.TypeVariableDirec
import org.jetbrains.kotlin.resolve.calls.inference.components.VariableFixationFinder 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.VariableWithConstraints import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints
import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtom
import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker
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
@@ -97,12 +96,13 @@ private fun Candidate.hasProperNonTrivialLowerConstraints(components: InferenceC
class ConstraintSystemCompleter(val components: InferenceComponents) { class ConstraintSystemCompleter(val components: InferenceComponents) {
private val variableFixationFinder = VariableFixationFinder(components.trivialConstraintTypeInferenceOracle) private val variableFixationFinder = VariableFixationFinder(components.trivialConstraintTypeInferenceOracle)
fun complete( fun complete(
c: KotlinConstraintSystemCompleter.Context, c: KotlinConstraintSystemCompleter.Context,
completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode, completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode,
topLevelAtoms: List<FirStatement>, topLevelAtoms: List<FirStatement>,
candidateReturnType: ConeKotlinType, candidateReturnType: ConeKotlinType,
analyze: (PostponedResolvedAtomMarker) -> Unit analyze: (PostponedResolvedAtom) -> Unit
) { ) {
while (true) { while (true) {
@@ -198,7 +198,7 @@ class ConstraintSystemCompleter(val components: InferenceComponents) {
private fun analyzePostponeArgumentIfPossible( private fun analyzePostponeArgumentIfPossible(
c: KotlinConstraintSystemCompleter.Context, c: KotlinConstraintSystemCompleter.Context,
topLevelAtoms: List<FirStatement>, topLevelAtoms: List<FirStatement>,
analyze: (PostponedResolvedAtomMarker) -> Unit analyze: (PostponedResolvedAtom) -> Unit
): Boolean { ): Boolean {
for (argument in getOrderedNotAnalyzedPostponedArguments(topLevelAtoms)) { for (argument in getOrderedNotAnalyzedPostponedArguments(topLevelAtoms)) {
if (canWeAnalyzeIt(c, argument)) { if (canWeAnalyzeIt(c, argument)) {
@@ -209,8 +209,8 @@ class ConstraintSystemCompleter(val components: InferenceComponents) {
return false return false
} }
private fun getOrderedNotAnalyzedPostponedArguments(topLevelAtoms: List<FirStatement>): List<PostponedResolvedAtomMarker> { private fun getOrderedNotAnalyzedPostponedArguments(topLevelAtoms: List<FirStatement>): List<PostponedResolvedAtom> {
val notAnalyzedArguments = arrayListOf<PostponedResolvedAtomMarker>() val notAnalyzedArguments = arrayListOf<PostponedResolvedAtom>()
for (primitive in topLevelAtoms) { for (primitive in topLevelAtoms) {
primitive.processAllContainingCallCandidates( primitive.processAllContainingCallCandidates(
// TODO: remove this argument and relevant parameter // TODO: remove this argument and relevant parameter
@@ -218,7 +218,7 @@ class ConstraintSystemCompleter(val components: InferenceComponents) {
processBlocks = true processBlocks = true
) { candidate -> ) { candidate ->
candidate.postponedAtoms.forEach { candidate.postponedAtoms.forEach {
notAnalyzedArguments.addIfNotNull(it.safeAs<PostponedResolvedAtomMarker>()?.takeUnless { it.analyzed }) notAnalyzedArguments.addIfNotNull(it.safeAs<PostponedResolvedAtom>()?.takeUnless { it.analyzed })
} }
} }
} }
@@ -44,11 +44,6 @@ fun Candidate.preprocessLambdaArgument(
// TODO: add SAM conversion processing // TODO: add SAM conversion processing
val lambdaType = createFunctionalType(resolvedArgument.parameters, resolvedArgument.receiver, resolvedArgument.returnType) val lambdaType = createFunctionalType(resolvedArgument.parameters, resolvedArgument.receiver, resolvedArgument.returnType)
csBuilder.addSubtypeConstraint(lambdaType, expectedType, SimpleConstraintSystemConstraintPosition) csBuilder.addSubtypeConstraint(lambdaType, expectedType, SimpleConstraintSystemConstraintPosition)
// val lambdaType = createFunctionType(
// csBuilder.builtIns, Annotations.EMPTY, resolvedArgument.receiver,
// resolvedArgument.parameters, null, resolvedArgument.returnType, resolvedArgument.isSuspend
// )
// csBuilder.addSubtypeConstraint(lambdaType, expectedType, ArgumentConstraintPosition(argument))
} }
postponedAtoms += resolvedArgument postponedAtoms += resolvedArgument
@@ -203,6 +198,12 @@ private fun ConeKotlinType.extractParametersForFunctionalType(
class TypeVariableForLambdaReturnType(val argument: FirAnonymousFunction, name: String) : ConeTypeVariable(name) class TypeVariableForLambdaReturnType(val argument: FirAnonymousFunction, name: String) : ConeTypeVariable(name)
sealed class PostponedResolvedAtom : PostponedResolvedAtomMarker {
abstract override val inputTypes: Collection<ConeKotlinType>
abstract override val outputType: ConeKotlinType?
override var analyzed: Boolean = false
}
class ResolvedLambdaAtom( class ResolvedLambdaAtom(
val atom: FirAnonymousFunction, val atom: FirAnonymousFunction,
val isSuspend: Boolean, val isSuspend: Boolean,
@@ -210,21 +211,9 @@ class ResolvedLambdaAtom(
val parameters: List<ConeKotlinType>, val parameters: List<ConeKotlinType>,
val returnType: ConeKotlinType, val returnType: ConeKotlinType,
val typeVariableForLambdaReturnType: TypeVariableForLambdaReturnType? val typeVariableForLambdaReturnType: TypeVariableForLambdaReturnType?
) : PostponedResolvedAtomMarker { ) : PostponedResolvedAtom() {
override var analyzed: Boolean = false
lateinit var returnStatements: Collection<FirStatement> lateinit var returnStatements: Collection<FirStatement>
// lateinit var resultArguments: List<KotlinCallArgument>
// private set
// fun setAnalyzedResults(
// resultArguments: List<KotlinCallArgument>,
// subResolvedAtoms: List<ResolvedAtom>
// ) {
// this.resultArguments = resultArguments
// setAnalyzedResults(subResolvedAtoms)
// }
override val inputTypes: Collection<ConeKotlinType> get() = receiver?.let { parameters + it } ?: parameters override val inputTypes: Collection<ConeKotlinType> get() = receiver?.let { parameters + it } ?: parameters
override val outputType: ConeKotlinType get() = returnType override val outputType: ConeKotlinType get() = returnType
} }
@@ -234,8 +223,7 @@ class ResolvedCallableReferenceAtom(
val expectedType: ConeKotlinType?, val expectedType: ConeKotlinType?,
val lhs: DoubleColonLHS?, val lhs: DoubleColonLHS?,
private val session: FirSession private val session: FirSession
) : PostponedResolvedAtomMarker { ) : PostponedResolvedAtom() {
override var analyzed: Boolean = false
var postponed: Boolean = false var postponed: Boolean = false
var resultingCandidate: Pair<Candidate, CandidateApplicability>? = null var resultingCandidate: Pair<Candidate, CandidateApplicability>? = null
@@ -49,8 +49,7 @@ class PostponedArgumentsAnalyzer(
fun analyze( fun analyze(
c: PostponedArgumentsAnalyzer.Context, c: PostponedArgumentsAnalyzer.Context,
// resolutionCallbacks: KotlinResolutionCallbacks, argument: PostponedResolvedAtom,
argument: PostponedResolvedAtomMarker,
candidate: Candidate candidate: Candidate
//diagnosticsHolder: KotlinDiagnosticsHolder //diagnosticsHolder: KotlinDiagnosticsHolder
) { ) {
@@ -66,8 +65,6 @@ class PostponedArgumentsAnalyzer(
is ResolvedCallableReferenceAtom -> processCallableReference(argument, candidate) is ResolvedCallableReferenceAtom -> processCallableReference(argument, candidate)
// //
// is ResolvedCollectionLiteralAtom -> TODO("Not supported") // is ResolvedCollectionLiteralAtom -> TODO("Not supported")
else -> error("Unexpected resolved primitive: ${argument.javaClass.canonicalName}")
} }
} }
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.resolve.calls.inference.components
import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind
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.PostponedResolvedAtom import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker
import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.types.model.FlexibleTypeMarker import org.jetbrains.kotlin.types.model.FlexibleTypeMarker
import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker
@@ -32,7 +32,7 @@ private typealias Variable = VariableWithConstraints
class TypeVariableDirectionCalculator( class TypeVariableDirectionCalculator(
private val c: VariableFixationFinder.Context, private val c: VariableFixationFinder.Context,
private val postponedKtPrimitives: List<PostponedResolvedAtom>, private val postponedKtPrimitives: List<PostponedResolvedAtomMarker>,
topLevelType: KotlinTypeMarker topLevelType: KotlinTypeMarker
) { ) {
enum class ResolveDirection { enum class ResolveDirection {