diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorage.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorage.kt index 70fb8383876..662f8ac984b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorage.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorage.kt @@ -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()?.fullyExpandedType(session) ?: return false val receiverSymbol = receiverType.fullyExpandedType(session).lookupTag.toSymbol(session) ?: return false val receiverClassName = receiverSymbol.classId diff --git a/compiler/fir/resolve/testData/resolve/constantValues.kt b/compiler/fir/resolve/testData/resolve/constantValues.kt new file mode 100644 index 00000000000..cc31e1c6fca --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/constantValues.kt @@ -0,0 +1,26 @@ +abstract class ConstantValue(open val value: T) + +data class ClassLiteralValue(val classId: ClassId, val arrayNestedness: Int) + +class ClassId +class KotlinType + +class KClassValue(value: Value) : ConstantValue(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 + } + } + } +} diff --git a/compiler/fir/resolve/testData/resolve/constantValues.txt b/compiler/fir/resolve/testData/resolve/constantValues.txt new file mode 100644 index 00000000000..b33115ddf0b --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/constantValues.txt @@ -0,0 +1,112 @@ +FILE: constantValues.kt + public abstract class ConstantValue : R|kotlin/Any| { + public constructor(value: R|T|): R|ConstantValue| { + super() + } + + public open val value: R|T| = R|/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() + } + + public final val classId: R|ClassId| = R|/classId| + public get(): R|ClassId| + + public final val arrayNestedness: R|kotlin/Int| = R|/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() + } + + } + public final class KotlinType : R|kotlin/Any| { + public constructor(): R|KotlinType| { + super() + } + + } + public final class KClassValue : R|ConstantValue| { + public constructor(value: R|KClassValue.Value|): R|KClassValue| { + super|>(R|/value|) + } + + public sealed class Value : R|kotlin/Any| { + private constructor(): R|KClassValue.Value| { + super() + } + + public final data class NormalClass : R|KClassValue.Value| { + public constructor(value: R|ClassLiteralValue|): R|KClassValue.Value.NormalClass| { + super() + } + + public final val value: R|ClassLiteralValue| = R|/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() + } + + public final val type: R|KotlinType| = R|/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|) { + ($subj$ is R|KClassValue.Value.LocalClass|) -> { + ^getArgumentType this@R|/KClassValue|.R|FakeOverride|.R|/KClassValue.Value.LocalClass.type| + } + ($subj$ is R|KClassValue.Value.NormalClass|) -> { + lval : R|ClassLiteralValue| = this@R|/KClassValue|.R|FakeOverride|.R|/KClassValue.Value.NormalClass.value| + lval classId: R|ClassId| = R|/|.R|/ClassLiteralValue.component1|() + lval arrayDimensions: R|kotlin/Int| = R|/|.R|/ClassLiteralValue.component2|() + } + } + + } + + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index d0fb0c37a22..c5547aee58a 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -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"); diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index bce8204a368..714625bff04 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -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");