[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.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
@@ -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)