[K2] Prohibit smart casts for 'expect' properties

^KT-61340
This commit is contained in:
Anastasia.Nekrasova
2023-09-19 19:03:15 +03:00
committed by Space Team
parent e4ea733482
commit e3bab4a7da
9 changed files with 150 additions and 0 deletions
@@ -36,6 +36,9 @@ enum class PropertyStability(val impliedSmartcastStability: SmartcastStability?)
// Smartcast may or may not be safe, depending on whether there are concurrent writes to this local variable.
LOCAL_VAR(null),
// Smartcast is always unsafe regardless of usage.
EXPECT_PROPERTY(SmartcastStability.EXPECT_PROPERTY),
// Open or custom getter.
// Smartcast is always unsafe regardless of usage.
PROPERTY_WITH_GETTER(SmartcastStability.PROPERTY_WITH_GETTER),
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.declarations.utils.visibility
@@ -165,6 +166,7 @@ class VariableStorageImpl(private val session: FirSession) : VariableStorage() {
is FirFunctionSymbol<*>, is FirClassSymbol<*> -> return PropertyStability.STABLE_VALUE
is FirBackingFieldSymbol -> return if (isVal) PropertyStability.STABLE_VALUE else PropertyStability.MUTABLE_PROPERTY
}
if (this is FirCallableSymbol && this.isExpect) return PropertyStability.EXPECT_PROPERTY
if (this !is FirVariableSymbol<*>) return null
if (this is FirFieldSymbol && !this.isFinal) return PropertyStability.MUTABLE_PROPERTY