[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.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.ImplicitReceiverStack
|
||||||
|
|
||||||
abstract class FirExpressionChecker<in E : FirExpression> {
|
abstract class FirExpressionChecker<in E : FirExpression> {
|
||||||
abstract fun check(functionCall: E, reporter: DiagnosticReporter)
|
abstract fun check(functionCall: E, reporter: DiagnosticReporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
typealias FirFunctionCallChecker = FirExpressionChecker<FirFunctionCall>
|
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.fir.types.ConeKotlinType
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
interface ImplicitReceiverStack {
|
abstract class ImplicitReceiverStack : Iterable<ImplicitReceiverValue<*>> {
|
||||||
fun add(name: Name?, value: ImplicitReceiverValue<*>)
|
abstract operator fun get(name: String?): ImplicitReceiverValue<*>?
|
||||||
fun pop(name: Name?)
|
|
||||||
|
|
||||||
operator fun get(name: String?): ImplicitReceiverValue<*>?
|
abstract fun lastDispatchReceiver(): ImplicitDispatchReceiverValue?
|
||||||
|
abstract fun receiversAsReversed(): List<ImplicitReceiverValue<*>>
|
||||||
|
}
|
||||||
|
|
||||||
fun lastDispatchReceiver(): ImplicitDispatchReceiverValue?
|
abstract class MutableImplicitReceiverStack : ImplicitReceiverStack() {
|
||||||
fun receiversAsReversed(): List<ImplicitReceiverValue<*>>
|
abstract fun add(name: Name?, value: ImplicitReceiverValue<*>)
|
||||||
|
abstract fun pop(name: Name?)
|
||||||
|
|
||||||
fun snapshot(): ImplicitReceiverStack
|
abstract fun snapshot(): MutableImplicitReceiverStack
|
||||||
}
|
}
|
||||||
|
|
||||||
class ImplicitReceiverStackImpl private constructor(
|
class ImplicitReceiverStackImpl private constructor(
|
||||||
@@ -33,7 +35,7 @@ class ImplicitReceiverStackImpl private constructor(
|
|||||||
private var originalTypes: PersistentList<ConeKotlinType>,
|
private var originalTypes: PersistentList<ConeKotlinType>,
|
||||||
private var indexesPerLabel: PersistentSetMultimap<Name, Int>,
|
private var indexesPerLabel: PersistentSetMultimap<Name, Int>,
|
||||||
private var indexesPerSymbol: PersistentMap<FirBasedSymbol<*>, Int>
|
private var indexesPerSymbol: PersistentMap<FirBasedSymbol<*>, Int>
|
||||||
) : ImplicitReceiverStack, Iterable<ImplicitReceiverValue<*>> {
|
) : MutableImplicitReceiverStack() {
|
||||||
val size: Int get() = stack.size
|
val size: Int get() = stack.size
|
||||||
|
|
||||||
constructor() : this(
|
constructor() : this(
|
||||||
@@ -90,7 +92,7 @@ class ImplicitReceiverStackImpl private constructor(
|
|||||||
return stack.iterator()
|
return stack.iterator()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun snapshot(): ImplicitReceiverStack {
|
override fun snapshot(): ImplicitReceiverStackImpl {
|
||||||
return ImplicitReceiverStackImpl(stack, originalTypes, indexesPerLabel, indexesPerSymbol)
|
return ImplicitReceiverStackImpl(stack, originalTypes, indexesPerLabel, indexesPerSymbol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ typealias FirLocalScopes = PersistentList<FirLocalScope>
|
|||||||
|
|
||||||
class FirLocalContext(
|
class FirLocalContext(
|
||||||
val localScopes: FirLocalScopes,
|
val localScopes: FirLocalScopes,
|
||||||
val implicitReceiverStack: ImplicitReceiverStack
|
val implicitReceiverStack: MutableImplicitReceiverStack
|
||||||
)
|
)
|
||||||
|
|
||||||
typealias LocalContextForAnonymousFunctions = Map<FirAnonymousFunctionSymbol, FirLocalContext>
|
typealias LocalContextForAnonymousFunctions = Map<FirAnonymousFunctionSymbol, FirLocalContext>
|
||||||
@@ -39,7 +39,7 @@ interface SessionHolder {
|
|||||||
|
|
||||||
interface BodyResolveComponents : SessionHolder {
|
interface BodyResolveComponents : SessionHolder {
|
||||||
val returnTypeCalculator: ReturnTypeCalculator
|
val returnTypeCalculator: ReturnTypeCalculator
|
||||||
val implicitReceiverStack: ImplicitReceiverStack
|
val implicitReceiverStack: MutableImplicitReceiverStack
|
||||||
val topLevelScopes: List<FirScope>
|
val topLevelScopes: List<FirScope>
|
||||||
val localScopes: FirLocalScopes
|
val localScopes: FirLocalScopes
|
||||||
val localContextForAnonymousFunctions: LocalContextForAnonymousFunctions
|
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 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 inferenceComponents: InferenceComponents get() = components.inferenceComponents
|
||||||
protected inline val resolutionStageRunner: ResolutionStageRunner get() = components.resolutionStageRunner
|
protected inline val resolutionStageRunner: ResolutionStageRunner get() = components.resolutionStageRunner
|
||||||
protected inline val samResolver: FirSamResolver get() = components.samResolver
|
protected inline val samResolver: FirSamResolver get() = components.samResolver
|
||||||
@@ -122,7 +122,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
|||||||
override val returnTypeCalculator: ReturnTypeCalculator = transformer.returnTypeCalculator
|
override val returnTypeCalculator: ReturnTypeCalculator = transformer.returnTypeCalculator
|
||||||
|
|
||||||
@set:PrivateForInline
|
@set:PrivateForInline
|
||||||
override var implicitReceiverStack: ImplicitReceiverStack = ImplicitReceiverStackImpl()
|
override var implicitReceiverStack: MutableImplicitReceiverStack = ImplicitReceiverStackImpl()
|
||||||
|
|
||||||
override val inferenceComponents: InferenceComponents = inferenceComponents(session, returnTypeCalculator, scopeSession)
|
override val inferenceComponents: InferenceComponents = inferenceComponents(session, returnTypeCalculator, scopeSession)
|
||||||
override val resolutionStageRunner: ResolutionStageRunner = ResolutionStageRunner(inferenceComponents)
|
override val resolutionStageRunner: ResolutionStageRunner = ResolutionStageRunner(inferenceComponents)
|
||||||
|
|||||||
Reference in New Issue
Block a user