diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/FirExpressionChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/FirExpressionChecker.kt index 65ccf20f3ee..9e4d0f40734 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/FirExpressionChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/call/FirExpressionChecker.kt @@ -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 { abstract fun check(functionCall: E, reporter: DiagnosticReporter) } typealias FirFunctionCallChecker = FirExpressionChecker -typealias FirQualifiedAccessChecker = FirExpressionChecker \ No newline at end of file +typealias FirQualifiedAccessChecker = FirExpressionChecker + +class FirExpressionCheckerContext( + val implicitReceiverStack: ImplicitReceiverStack +) \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ImplicitReceiverStack.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ImplicitReceiverStack.kt index e8d9823248f..949ad93989f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ImplicitReceiverStack.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ImplicitReceiverStack.kt @@ -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> { + abstract operator fun get(name: String?): ImplicitReceiverValue<*>? - operator fun get(name: String?): ImplicitReceiverValue<*>? + abstract fun lastDispatchReceiver(): ImplicitDispatchReceiverValue? + abstract fun receiversAsReversed(): List> +} - fun lastDispatchReceiver(): ImplicitDispatchReceiverValue? - fun receiversAsReversed(): List> +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, private var indexesPerLabel: PersistentSetMultimap, private var indexesPerSymbol: PersistentMap, Int> -) : ImplicitReceiverStack, Iterable> { +) : 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) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SessionHolder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SessionHolder.kt index 1002e2e17ba..7cf7749e33b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SessionHolder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SessionHolder.kt @@ -28,7 +28,7 @@ typealias FirLocalScopes = PersistentList class FirLocalContext( val localScopes: FirLocalScopes, - val implicitReceiverStack: ImplicitReceiverStack + val implicitReceiverStack: MutableImplicitReceiverStack ) typealias LocalContextForAnonymousFunctions = Map @@ -39,7 +39,7 @@ interface SessionHolder { interface BodyResolveComponents : SessionHolder { val returnTypeCalculator: ReturnTypeCalculator - val implicitReceiverStack: ImplicitReceiverStack + val implicitReceiverStack: MutableImplicitReceiverStack val topLevelScopes: List val localScopes: FirLocalScopes val localContextForAnonymousFunctions: LocalContextForAnonymousFunctions diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt index a6b3ef93df5..c66895af762 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt @@ -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)