FIR: fix arose problem with smartcast un-stability

This commit is contained in:
Mikhail Glukhikh
2020-02-28 13:33:59 +03:00
parent d5fbd93fe6
commit c2eab08cc9
5 changed files with 149 additions and 1 deletions
@@ -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
+26
View File
@@ -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
}
}
}
}
+112
View File
@@ -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|()
}
}
}
}
@@ -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");
@@ -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");