[FIR] Split ImplicitReceiverStack to mutable and immutable parts
This commit is contained in:
+6
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user