[FIR] Split ImplicitReceiverStack to mutable and immutable parts

This commit is contained in:
Dmitriy Novozhilov
2020-03-19 12:57:41 +03:00
parent 3b892fe31e
commit 1c87601486
4 changed files with 21 additions and 14 deletions
@@ -9,10 +9,15 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.resolve.ImplicitReceiverStack
abstract class FirExpressionChecker<in E : FirExpression> {
abstract fun check(functionCall: E, reporter: DiagnosticReporter)
}
typealias FirFunctionCallChecker = FirExpressionChecker<FirFunctionCall>
typealias FirQualifiedAccessChecker = FirExpressionChecker<FirQualifiedAccessExpression>
typealias FirQualifiedAccessChecker = FirExpressionChecker<FirQualifiedAccessExpression>
class FirExpressionCheckerContext(
val implicitReceiverStack: ImplicitReceiverStack
)
@@ -15,16 +15,18 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.name.Name
interface ImplicitReceiverStack {
fun add(name: Name?, value: ImplicitReceiverValue<*>)
fun pop(name: Name?)
abstract class ImplicitReceiverStack : Iterable<ImplicitReceiverValue<*>> {
abstract operator fun get(name: String?): ImplicitReceiverValue<*>?
operator fun get(name: String?): ImplicitReceiverValue<*>?
abstract fun lastDispatchReceiver(): ImplicitDispatchReceiverValue?
abstract fun receiversAsReversed(): List<ImplicitReceiverValue<*>>
}
fun lastDispatchReceiver(): ImplicitDispatchReceiverValue?
fun receiversAsReversed(): List<ImplicitReceiverValue<*>>
abstract class MutableImplicitReceiverStack : ImplicitReceiverStack() {
abstract fun add(name: Name?, value: ImplicitReceiverValue<*>)
abstract fun pop(name: Name?)
fun snapshot(): ImplicitReceiverStack
abstract fun snapshot(): MutableImplicitReceiverStack
}
class ImplicitReceiverStackImpl private constructor(
@@ -33,7 +35,7 @@ class ImplicitReceiverStackImpl private constructor(
private var originalTypes: PersistentList<ConeKotlinType>,
private var indexesPerLabel: PersistentSetMultimap<Name, Int>,
private var indexesPerSymbol: PersistentMap<FirBasedSymbol<*>, Int>
) : ImplicitReceiverStack, Iterable<ImplicitReceiverValue<*>> {
) : MutableImplicitReceiverStack() {
val size: Int get() = stack.size
constructor() : this(
@@ -90,7 +92,7 @@ class ImplicitReceiverStackImpl private constructor(
return stack.iterator()
}
override fun snapshot(): ImplicitReceiverStack {
override fun snapshot(): ImplicitReceiverStackImpl {
return ImplicitReceiverStackImpl(stack, originalTypes, indexesPerLabel, indexesPerSymbol)
}
}
@@ -28,7 +28,7 @@ typealias FirLocalScopes = PersistentList<FirLocalScope>
class FirLocalContext(
val localScopes: FirLocalScopes,
val implicitReceiverStack: ImplicitReceiverStack
val implicitReceiverStack: MutableImplicitReceiverStack
)
typealias LocalContextForAnonymousFunctions = Map<FirAnonymousFunctionSymbol, FirLocalContext>
@@ -39,7 +39,7 @@ interface SessionHolder {
interface BodyResolveComponents : SessionHolder {
val returnTypeCalculator: ReturnTypeCalculator
val implicitReceiverStack: ImplicitReceiverStack
val implicitReceiverStack: MutableImplicitReceiverStack
val topLevelScopes: List<FirScope>
val localScopes: FirLocalScopes
val localContextForAnonymousFunctions: LocalContextForAnonymousFunctions
@@ -78,7 +78,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
protected inline val symbolProvider: FirSymbolProvider get() = components.symbolProvider
protected inline val implicitReceiverStack: ImplicitReceiverStack get() = components.implicitReceiverStack
protected inline val implicitReceiverStack: MutableImplicitReceiverStack get() = components.implicitReceiverStack
protected inline val inferenceComponents: InferenceComponents get() = components.inferenceComponents
protected inline val resolutionStageRunner: ResolutionStageRunner get() = components.resolutionStageRunner
protected inline val samResolver: FirSamResolver get() = components.samResolver
@@ -122,7 +122,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
override val returnTypeCalculator: ReturnTypeCalculator = transformer.returnTypeCalculator
@set:PrivateForInline
override var implicitReceiverStack: ImplicitReceiverStack = ImplicitReceiverStackImpl()
override var implicitReceiverStack: MutableImplicitReceiverStack = ImplicitReceiverStackImpl()
override val inferenceComponents: InferenceComponents = inferenceComponents(session, returnTypeCalculator, scopeSession)
override val resolutionStageRunner: ResolutionStageRunner = ResolutionStageRunner(inferenceComponents)