diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/valueOfOrNull.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/valueOfOrNull.fir.txt new file mode 100644 index 00000000000..6c789a911cb --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/valueOfOrNull.fir.txt @@ -0,0 +1,59 @@ +FILE: valueOfOrNull.kt + public final enum class SomeEnum : R|kotlin/Enum| { + private constructor(): R|SomeEnum| { + super|>() + } + + public final static enum entry ENTRY: R|SomeEnum| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|SomeEnum| { + } + + } + public final fun foo(s: R|kotlin/String?|): R|kotlin/Unit| { + lval result: R|SomeEnum| = R|/s|?.{ $subj$.R|kotlin/let|( = let@fun (it: R|kotlin/String|): R|SomeEnum?| { + ^ R|/valueOfOrNull|(R|/it|) + } + ) } ?: Q|SomeEnum|.R|/SomeEnum.ENTRY| + lval result2: R|SomeEnum| = R|/s|?.{ $subj$.R|kotlin/let|( = let@fun (it: R|kotlin/String|): R|SomeEnum?| { + ^ R|/valueOfOrNull|(R|/it|) + } + ) } ?: Q|SomeEnum|.R|/SomeEnum.ENTRY| + lval result3: R|SomeEnum?| = when () { + ==(R|/s|, Null(null)) -> { + Q|SomeEnum|.R|/SomeEnum.ENTRY| + } + else -> { + R|/valueOfOrNull|(R|/s|) + } + } + + lval result4: R|SomeEnum?| = when () { + ==(R|/s|, Null(null)) -> { + Q|SomeEnum|.R|/SomeEnum.ENTRY| + } + else -> { + R|/s|.R|kotlin/let|( = let@fun (it: R|kotlin/String|): R|SomeEnum?| { + ^ R|/valueOfOrNull|(R|/it|) + } + ) + } + } + + } + public final inline fun |> valueOfOrNull(value: R|kotlin/String|): R|E?| { + lval : R|kotlin/collections/Iterator| = R|kotlin/enumValues|().R|SubstitutionOverride|>|() + while(R|/|.R|kotlin/collections/Iterator.hasNext|()) { + lval enumValue: R|E| = R|/|.R|SubstitutionOverride|() + when () { + ==(R|/enumValue|.R|kotlin/Enum.name|, R|/value|) -> { + ^valueOfOrNull R|/enumValue| + } + } + + } + + ^valueOfOrNull Null(null) + } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/valueOfOrNull.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/valueOfOrNull.kt new file mode 100644 index 00000000000..68eca9feabe --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/valueOfOrNull.kt @@ -0,0 +1,19 @@ +enum class SomeEnum { + ENTRY; +} + +fun foo(s: String?) { + val result = s?.let { valueOfOrNull(it) } ?: SomeEnum.ENTRY + val result2 = s?.let { valueOfOrNull(it) } ?: SomeEnum.ENTRY + val result3 = if (s == null) SomeEnum.ENTRY else valueOfOrNull(s) + val result4 = if (s == null) SomeEnum.ENTRY else s.let { valueOfOrNull(it) } +} + +inline fun > valueOfOrNull(value: String): E? { + for (enumValue in enumValues()) { + if (enumValue.name == value) { + return enumValue + } + } + return null +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index 3ee6cbb889b..7528fb0adae 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -4947,6 +4947,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/TypesEligibleForSimpleVisit.kt"); } + @Test + @TestMetadata("valueOfOrNull.kt") + public void testValueOfOrNull() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/valueOfOrNull.kt"); + } + @Test @TestMetadata("weakHashMap.kt") public void testWeakHashMap() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 2248bdb9a1b..802bef8c050 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -5015,6 +5015,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/TypesEligibleForSimpleVisit.kt"); } + @Test + @TestMetadata("valueOfOrNull.kt") + public void testValueOfOrNull() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/valueOfOrNull.kt"); + } + @Test @TestMetadata("weakHashMap.kt") public void testWeakHashMap() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConeConstraintSystemUtilContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConeConstraintSystemUtilContext.kt index 5a12718b312..ae9f03b853f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConeConstraintSystemUtilContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConeConstraintSystemUtilContext.kt @@ -38,8 +38,7 @@ object ConeConstraintSystemUtilContext : ConstraintSystemUtilContext { } override fun TypeVariableMarker.isReified(): Boolean { - // TODO - return false + return this is TypeParameterBasedTypeVariable && typeParameterSymbol.fir.isReified } override fun KotlinTypeMarker.refineType(): KotlinTypeMarker {