[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.candidate
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.coneTypeUnsafe
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor
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.model.NewConstraintSystemImpl
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.model.KotlinTypeMarker
import org.jetbrains.kotlin.types.model.TypeConstructorMarker
@@ -97,12 +96,13 @@ private fun Candidate.hasProperNonTrivialLowerConstraints(components: InferenceC
class ConstraintSystemCompleter(val components: InferenceComponents) {
private val variableFixationFinder = VariableFixationFinder(components.trivialConstraintTypeInferenceOracle)
fun complete(
c: KotlinConstraintSystemCompleter.Context,
completionMode: KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode,
topLevelAtoms: List<FirStatement>,
candidateReturnType: ConeKotlinType,
analyze: (PostponedResolvedAtomMarker) -> Unit
analyze: (PostponedResolvedAtom) -> Unit
) {
while (true) {
@@ -198,7 +198,7 @@ class ConstraintSystemCompleter(val components: InferenceComponents) {
private fun analyzePostponeArgumentIfPossible(
c: KotlinConstraintSystemCompleter.Context,
topLevelAtoms: List<FirStatement>,
analyze: (PostponedResolvedAtomMarker) -> Unit
analyze: (PostponedResolvedAtom) -> Unit
): Boolean {
for (argument in getOrderedNotAnalyzedPostponedArguments(topLevelAtoms)) {
if (canWeAnalyzeIt(c, argument)) {
@@ -209,8 +209,8 @@ class ConstraintSystemCompleter(val components: InferenceComponents) {
return false
}
private fun getOrderedNotAnalyzedPostponedArguments(topLevelAtoms: List<FirStatement>): List<PostponedResolvedAtomMarker> {
val notAnalyzedArguments = arrayListOf<PostponedResolvedAtomMarker>()
private fun getOrderedNotAnalyzedPostponedArguments(topLevelAtoms: List<FirStatement>): List<PostponedResolvedAtom> {
val notAnalyzedArguments = arrayListOf<PostponedResolvedAtom>()
for (primitive in topLevelAtoms) {
primitive.processAllContainingCallCandidates(
// TODO: remove this argument and relevant parameter
@@ -218,7 +218,7 @@ class ConstraintSystemCompleter(val components: InferenceComponents) {
processBlocks = true
) { candidate ->
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
val lambdaType = createFunctionalType(resolvedArgument.parameters, resolvedArgument.receiver, resolvedArgument.returnType)
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
@@ -203,6 +198,12 @@ private fun ConeKotlinType.extractParametersForFunctionalType(
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(
val atom: FirAnonymousFunction,
val isSuspend: Boolean,
@@ -210,21 +211,9 @@ class ResolvedLambdaAtom(
val parameters: List<ConeKotlinType>,
val returnType: ConeKotlinType,
val typeVariableForLambdaReturnType: TypeVariableForLambdaReturnType?
) : PostponedResolvedAtomMarker {
override var analyzed: Boolean = false
) : PostponedResolvedAtom() {
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 outputType: ConeKotlinType get() = returnType
}
@@ -234,8 +223,7 @@ class ResolvedCallableReferenceAtom(
val expectedType: ConeKotlinType?,
val lhs: DoubleColonLHS?,
private val session: FirSession
) : PostponedResolvedAtomMarker {
override var analyzed: Boolean = false
) : PostponedResolvedAtom() {
var postponed: Boolean = false
var resultingCandidate: Pair<Candidate, CandidateApplicability>? = null
@@ -49,8 +49,7 @@ class PostponedArgumentsAnalyzer(
fun analyze(
c: PostponedArgumentsAnalyzer.Context,
// resolutionCallbacks: KotlinResolutionCallbacks,
argument: PostponedResolvedAtomMarker,
argument: PostponedResolvedAtom,
candidate: Candidate
//diagnosticsHolder: KotlinDiagnosticsHolder
) {
@@ -66,8 +65,6 @@ class PostponedArgumentsAnalyzer(
is ResolvedCallableReferenceAtom -> processCallableReference(argument, candidate)
//
// 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.ConstraintKind
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.model.FlexibleTypeMarker
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
@@ -32,7 +32,7 @@ private typealias Variable = VariableWithConstraints
class TypeVariableDirectionCalculator(
private val c: VariableFixationFinder.Context,
private val postponedKtPrimitives: List<PostponedResolvedAtom>,
private val postponedKtPrimitives: List<PostponedResolvedAtomMarker>,
topLevelType: KotlinTypeMarker
) {
enum class ResolveDirection {