[LL API] Handle smart casts correctly on 'FirCodeFragment' analysis

This commit is contained in:
Yan Zhulanow
2023-08-31 15:39:40 +09:00
committed by Space Team
parent 0fbf648971
commit 5559a0754d
17 changed files with 132 additions and 10 deletions
@@ -9,8 +9,8 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.containingClassForLocalAttr
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.resolve.dfa.RealVariable
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
@@ -98,7 +98,7 @@ val FirConstructorSymbol.typeAliasForConstructor: FirTypeAliasSymbol?
interface FirCodeFragmentContext {
val towerDataContext: FirTowerDataContext
val variables: Map<FirBasedSymbol<*>, Set<ConeKotlinType>>
val smartCasts: Map<RealVariable, Set<ConeKotlinType>>
}
private object CodeFragmentContextDataKey : FirDeclarationDataKey()
@@ -144,7 +144,7 @@ class VariableStorageImpl(private val session: FirSession) : VariableStorage() {
extensionReceiver = if (extensionReceiver == from) to else extensionReceiver,
)
}
return _realVariables.getOrPut(newIdentifier) {
return getOrPut(newIdentifier) {
with(variable) {
RealVariable(
newIdentifier, isThisReference, if (explicitReceiverVariable == from) to else explicitReceiverVariable,
@@ -154,6 +154,10 @@ class VariableStorageImpl(private val session: FirSession) : VariableStorage() {
}
}
fun getOrPut(identifier: Identifier, factory: () -> RealVariable): RealVariable {
return _realVariables.getOrPut(identifier, factory)
}
private fun FirBasedSymbol<*>.getStability(originalFir: FirElement): PropertyStability? {
if (originalFir is FirThisReceiverExpression) return PropertyStability.STABLE_VALUE
when (this) {