[FIR] Make resolution sequence of CallKind static field

This commit is contained in:
Dmitriy Novozhilov
2019-07-25 17:55:25 +03:00
committed by Mikhail Glukhikh
parent 53404e5dac
commit 98f75669a5
2 changed files with 20 additions and 29 deletions
@@ -6,22 +6,10 @@
package org.jetbrains.kotlin.fir.resolve.calls package org.jetbrains.kotlin.fir.resolve.calls
sealed class CallKind { sealed class CallKind {
abstract fun sequence(): List<ResolutionStage> abstract val resolutionSequence: List<ResolutionStage>
object Function : CallKind() { object Function : CallKind() {
override fun sequence(): List<ResolutionStage> { override val resolutionSequence: List<ResolutionStage> = listOf(
return functionCallResolutionSequence()
}
}
object VariableAccess : CallKind() {
override fun sequence(): List<ResolutionStage> {
return qualifiedAccessResolutionSequence()
}
}
}
internal fun functionCallResolutionSequence() = listOf(
CheckVisibility, CheckVisibility,
MapArguments, MapArguments,
CheckExplicitReceiverConsistency, CheckExplicitReceiverConsistency,
@@ -30,9 +18,10 @@ internal fun functionCallResolutionSequence() = listOf(
CheckReceivers.Extension, CheckReceivers.Extension,
CheckArguments CheckArguments
) )
}
object VariableAccess : CallKind() {
internal fun qualifiedAccessResolutionSequence() = listOf( override val resolutionSequence: List<ResolutionStage> = listOf(
CheckVisibility, CheckVisibility,
DiscriminateSynthetics, DiscriminateSynthetics,
CheckExplicitReceiverConsistency, CheckExplicitReceiverConsistency,
@@ -40,3 +29,5 @@ internal fun qualifiedAccessResolutionSequence() = listOf(
CheckReceivers.Dispatch, CheckReceivers.Dispatch,
CheckReceivers.Extension CheckReceivers.Extension
) )
}
}
@@ -16,7 +16,7 @@ class ResolutionStageRunner(val components: InferenceComponents) {
val sink = CheckerSinkImpl(components) val sink = CheckerSinkImpl(components)
var finished = false var finished = false
sink.continuation = suspend { sink.continuation = suspend {
for (stage in candidate.callInfo.callKind.sequence()) { for (stage in candidate.callInfo.callKind.resolutionSequence) {
stage.check(candidate, sink, candidate.callInfo) stage.check(candidate, sink, candidate.callInfo)
} }
}.createCoroutineUnintercepted(completion = object : Continuation<Unit> { }.createCoroutineUnintercepted(completion = object : Continuation<Unit> {