FIR: fix arose problem with smartcast un-stability
This commit is contained in:
@@ -172,7 +172,7 @@ class VariableStorage(val session: FirSession) {
|
||||
property.getter.let { it != null && it !is FirDefaultPropertyAccessor } -> false
|
||||
property.modality != Modality.FINAL -> {
|
||||
val dispatchReceiver = (originalFir as? FirQualifiedAccess)?.dispatchReceiver ?: return false
|
||||
val propertyClassName = (this as FirPropertySymbol).callableId.classId
|
||||
val propertyClassName = (this as FirPropertySymbol).let { it.overriddenSymbol ?: it }.callableId.classId
|
||||
val receiverType = dispatchReceiver.typeRef.coneTypeSafe<ConeClassLikeType>()?.fullyExpandedType(session) ?: return false
|
||||
val receiverSymbol = receiverType.fullyExpandedType(session).lookupTag.toSymbol(session) ?: return false
|
||||
val receiverClassName = receiverSymbol.classId
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
abstract class ConstantValue<out T>(open val value: T)
|
||||
|
||||
data class ClassLiteralValue(val classId: ClassId, val arrayNestedness: Int)
|
||||
|
||||
class ClassId
|
||||
class KotlinType
|
||||
|
||||
class KClassValue(value: Value) : ConstantValue<KClassValue.Value>(value) {
|
||||
sealed class Value {
|
||||
data class NormalClass(val value: ClassLiteralValue) : Value() {
|
||||
val classId: ClassId
|
||||
val arrayDimensions: Int
|
||||
}
|
||||
|
||||
data class LocalClass(val type: KotlinType) : Value()
|
||||
}
|
||||
|
||||
fun getArgumentType(): KotlinType {
|
||||
when (value) {
|
||||
is Value.LocalClass -> return value.type
|
||||
is Value.NormalClass -> {
|
||||
val (classId, arrayDimensions) = value.value
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
FILE: constantValues.kt
|
||||
public abstract class ConstantValue<out T> : R|kotlin/Any| {
|
||||
public constructor<out T>(value: R|T|): R|ConstantValue<T>| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public open val value: R|T| = R|<local>/value|
|
||||
public get(): R|T|
|
||||
|
||||
}
|
||||
public final data class ClassLiteralValue : R|kotlin/Any| {
|
||||
public constructor(classId: R|ClassId|, arrayNestedness: R|kotlin/Int|): R|ClassLiteralValue| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public final val classId: R|ClassId| = R|<local>/classId|
|
||||
public get(): R|ClassId|
|
||||
|
||||
public final val arrayNestedness: R|kotlin/Int| = R|<local>/arrayNestedness|
|
||||
public get(): R|kotlin/Int|
|
||||
|
||||
public final fun component1(): R|ClassId| {
|
||||
^component1 this@R|/ClassLiteralValue|.R|/ClassLiteralValue.classId|
|
||||
}
|
||||
|
||||
public final fun component2(): R|kotlin/Int| {
|
||||
^component2 this@R|/ClassLiteralValue|.R|/ClassLiteralValue.arrayNestedness|
|
||||
}
|
||||
|
||||
public final fun copy(classId: R|ClassId| = this@R|/ClassLiteralValue|.R|/ClassLiteralValue.classId|, arrayNestedness: R|kotlin/Int| = this@R|/ClassLiteralValue|.R|/ClassLiteralValue.arrayNestedness|): R|ClassLiteralValue| {
|
||||
}
|
||||
|
||||
}
|
||||
public final class ClassId : R|kotlin/Any| {
|
||||
public constructor(): R|ClassId| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
public final class KotlinType : R|kotlin/Any| {
|
||||
public constructor(): R|KotlinType| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
public final class KClassValue : R|ConstantValue<KClassValue.Value>| {
|
||||
public constructor(value: R|KClassValue.Value|): R|KClassValue| {
|
||||
super<R|ConstantValue<KClassValue.Value>|>(R|<local>/value|)
|
||||
}
|
||||
|
||||
public sealed class Value : R|kotlin/Any| {
|
||||
private constructor(): R|KClassValue.Value| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public final data class NormalClass : R|KClassValue.Value| {
|
||||
public constructor(value: R|ClassLiteralValue|): R|KClassValue.Value.NormalClass| {
|
||||
super<R|KClassValue.Value|>()
|
||||
}
|
||||
|
||||
public final val value: R|ClassLiteralValue| = R|<local>/value|
|
||||
public get(): R|ClassLiteralValue|
|
||||
|
||||
public final val classId: R|ClassId|
|
||||
public get(): R|ClassId|
|
||||
|
||||
public final val arrayDimensions: R|kotlin/Int|
|
||||
public get(): R|kotlin/Int|
|
||||
|
||||
public final fun component1(): R|ClassLiteralValue| {
|
||||
^component1 this@R|/KClassValue.Value.NormalClass|.R|/KClassValue.Value.NormalClass.value|
|
||||
}
|
||||
|
||||
public final fun copy(value: R|ClassLiteralValue| = this@R|/KClassValue.Value.NormalClass|.R|/KClassValue.Value.NormalClass.value|): R|KClassValue.Value.NormalClass| {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public final data class LocalClass : R|KClassValue.Value| {
|
||||
public constructor(type: R|KotlinType|): R|KClassValue.Value.LocalClass| {
|
||||
super<R|KClassValue.Value|>()
|
||||
}
|
||||
|
||||
public final val type: R|KotlinType| = R|<local>/type|
|
||||
public get(): R|KotlinType|
|
||||
|
||||
public final fun component1(): R|KotlinType| {
|
||||
^component1 this@R|/KClassValue.Value.LocalClass|.R|/KClassValue.Value.LocalClass.type|
|
||||
}
|
||||
|
||||
public final fun copy(type: R|KotlinType| = this@R|/KClassValue.Value.LocalClass|.R|/KClassValue.Value.LocalClass.type|): R|KClassValue.Value.LocalClass| {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public final fun getArgumentType(): R|KotlinType| {
|
||||
when (this@R|/KClassValue|.R|FakeOverride</KClassValue.value: R|KClassValue.Value|>|) {
|
||||
($subj$ is R|KClassValue.Value.LocalClass|) -> {
|
||||
^getArgumentType this@R|/KClassValue|.R|FakeOverride</KClassValue.value: R|KClassValue.Value|>|.R|/KClassValue.Value.LocalClass.type|
|
||||
}
|
||||
($subj$ is R|KClassValue.Value.NormalClass|) -> {
|
||||
lval <destruct>: R|ClassLiteralValue| = this@R|/KClassValue|.R|FakeOverride</KClassValue.value: R|KClassValue.Value|>|.R|/KClassValue.Value.NormalClass.value|
|
||||
lval classId: R|ClassId| = R|<local>/<destruct>|.R|/ClassLiteralValue.component1|()
|
||||
lval arrayDimensions: R|kotlin/Int| = R|<local>/<destruct>|.R|/ClassLiteralValue.component2|()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+5
@@ -53,6 +53,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
|
||||
runTest("compiler/fir/resolve/testData/resolve/companionUsesNested.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("constantValues.kt")
|
||||
public void testConstantValues() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/constantValues.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("copy.kt")
|
||||
public void testCopy() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/copy.kt");
|
||||
|
||||
Generated
+5
@@ -53,6 +53,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
||||
runTest("compiler/fir/resolve/testData/resolve/companionUsesNested.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("constantValues.kt")
|
||||
public void testConstantValues() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/constantValues.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("copy.kt")
|
||||
public void testCopy() throws Exception {
|
||||
runTest("compiler/fir/resolve/testData/resolve/copy.kt");
|
||||
|
||||
Reference in New Issue
Block a user