diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index b241d6b5a03..3937ee6d7ad 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -35846,6 +35846,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/when/whenOnNothing.kt"); } + @Test + @TestMetadata("whenOverEnumWithSameNameAsEntry.kt") + public void testWhenOverEnumWithSameNameAsEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOverEnumWithSameNameAsEntry.kt"); + } + @Test @TestMetadata("WhenTypeDisjunctions.kt") public void testWhenTypeDisjunctions() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 354ab69f4ee..a92d1d2f167 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -35846,6 +35846,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/when/whenOnNothing.kt"); } + @Test + @TestMetadata("whenOverEnumWithSameNameAsEntry.kt") + public void testWhenOverEnumWithSameNameAsEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOverEnumWithSameNameAsEntry.kt"); + } + @Test @TestMetadata("WhenTypeDisjunctions.kt") public void testWhenTypeDisjunctions() throws Exception { diff --git a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/correctJava.kt b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/correctJava.kt index 778335b94d3..a707365adbc 100644 --- a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/correctJava.kt +++ b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/correctJava.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +ContextSensitiveEnumResolutionInWhen // FILE: JavaEnum.java public enum JavaEnum { diff --git a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/incorrectJava.kt b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/incorrectJava.kt index 1acb68f38f0..0a38f42b86c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/incorrectJava.kt +++ b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/incorrectJava.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +ContextSensitiveEnumResolutionInWhen // FILE: JavaEnum.java public enum JavaEnum { diff --git a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/nested.kt b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/nested.kt index fa1fda3d059..df3d89bd6bf 100644 --- a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/nested.kt +++ b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/nested.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +ContextSensitiveEnumResolutionInWhen enum class Outer { FIRST, SECOND; } diff --git a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/notInsideBranches.kt b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/notInsideBranches.kt index dc1bc6ffcfe..52df1acf77e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/notInsideBranches.kt +++ b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/notInsideBranches.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +ContextSensitiveEnumResolutionInWhen enum class Some { FIRST, SECOND; diff --git a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/priority.kt b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/priority.kt index 937c242694a..e5fb7f49603 100644 --- a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/priority.kt +++ b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/priority.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +ContextSensitiveEnumResolutionInWhen // FILE: first.kt package first diff --git a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/typeAlias.kt b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/typeAlias.kt index a0c1e1eb63c..dfe00e182db 100644 --- a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/typeAlias.kt +++ b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/typeAlias.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +ContextSensitiveEnumResolutionInWhen enum class Some { FIRST, SECOND; diff --git a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/unqualifiedEnum.kt b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/unqualifiedEnum.kt index f8d284c421d..cefcf8e36f1 100644 --- a/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/unqualifiedEnum.kt +++ b/compiler/fir/analysis-tests/testData/resolve/unqualifiedEnum/unqualifiedEnum.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +ContextSensitiveEnumResolutionInWhen package test enum class Sample { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 1523450f0b8..5c8d39a5324 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -35846,6 +35846,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/when/whenOnNothing.kt"); } + @Test + @TestMetadata("whenOverEnumWithSameNameAsEntry.kt") + public void testWhenOverEnumWithSameNameAsEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOverEnumWithSameNameAsEntry.kt"); + } + @Test @TestMetadata("WhenTypeDisjunctions.kt") public void testWhenTypeDisjunctions() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 863cd2318b7..09e001046c1 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -35942,6 +35942,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/when/whenOnNothing.kt"); } + @Test + @TestMetadata("whenOverEnumWithSameNameAsEntry.kt") + public void testWhenOverEnumWithSameNameAsEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOverEnumWithSameNameAsEntry.kt"); + } + @Test @TestMetadata("WhenTypeDisjunctions.kt") public void testWhenTypeDisjunctions() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt index 6a340de3c59..4b5d7f4fc31 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.PrivateForInline @@ -15,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.declarations.utils.isInner import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirWhenExpression +import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.ImplicitExtensionReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue @@ -534,19 +536,28 @@ class BodyResolveContext( inline fun withWhenSubjectType( subjectType: ConeKotlinType?, sessionHolder: SessionHolder, - f: () -> T + f: () -> T, ): T { val session = sessionHolder.session - val subjectClassSymbol = (subjectType as? ConeClassLikeType) - ?.lookupTag?.toFirRegularClassSymbol(session)?.takeIf { it.fir.classKind == ClassKind.ENUM_CLASS } - val whenSubjectImportingScope = subjectClassSymbol?.let { - FirWhenSubjectImportingScope(it.classId, session, sessionHolder.scopeSession) + + val withContextSensitiveResolution = + session.languageVersionSettings.supportsFeature(LanguageFeature.ContextSensitiveEnumResolutionInWhen) + + if (withContextSensitiveResolution) { + val subjectClassSymbol = (subjectType as? ConeClassLikeType) + ?.lookupTag?.toFirRegularClassSymbol(session)?.takeIf { it.fir.classKind == ClassKind.ENUM_CLASS } + val whenSubjectImportingScope = subjectClassSymbol?.let { + FirWhenSubjectImportingScope(it.classId, session, sessionHolder.scopeSession) + } + whenSubjectImportingScopes.add(whenSubjectImportingScope) } - whenSubjectImportingScopes.add(whenSubjectImportingScope) + return try { f() } finally { - whenSubjectImportingScopes.removeLast() + if (withContextSensitiveResolution) { + whenSubjectImportingScopes.removeLast() + } } } diff --git a/compiler/testData/codegen/box/fir/unqualifiedEnum.kt b/compiler/testData/codegen/box/fir/unqualifiedEnum.kt index 7d1bf8791f6..2fb8f499c7b 100644 --- a/compiler/testData/codegen/box/fir/unqualifiedEnum.kt +++ b/compiler/testData/codegen/box/fir/unqualifiedEnum.kt @@ -1,6 +1,7 @@ // TARGET_BACKEND: JVM_IR // IGNORE_BACKEND_K1: JVM_IR // WITH_STDLIB +// LANGUAGE: +ContextSensitiveEnumResolutionInWhen enum class Rainbow { RED, diff --git a/compiler/testData/diagnostics/tests/when/whenOverEnumWithSameNameAsEntry.kt b/compiler/testData/diagnostics/tests/when/whenOverEnumWithSameNameAsEntry.kt new file mode 100644 index 00000000000..1aee62b2a62 --- /dev/null +++ b/compiler/testData/diagnostics/tests/when/whenOverEnumWithSameNameAsEntry.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// KT-58897 + +enum class A { + A, + B, +} + +fun test2(a: A) = when (a) { + A.A -> "A" + A.B -> "B" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 404715f3cc1..12c93e8576b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -36744,6 +36744,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/when/whenOnNothing.kt"); } + @Test + @TestMetadata("whenOverEnumWithSameNameAsEntry.kt") + public void testWhenOverEnumWithSameNameAsEntry() throws Exception { + runTest("compiler/testData/diagnostics/tests/when/whenOverEnumWithSameNameAsEntry.kt"); + } + @Test @TestMetadata("WhenTypeDisjunctions.kt") public void testWhenTypeDisjunctions() throws Exception { diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 53f21c87a52..ce1cb87906e 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -348,6 +348,7 @@ enum class LanguageFeature( ForbidInferringTypeVariablesIntoEmptyIntersection(sinceVersion = null, kind = BUG_FIX), // KT-51221 IntrinsicConstEvaluation(sinceVersion = null, kind = UNSTABLE_FEATURE), // KT-49303 DisableCheckingChangedProgressionsResolve(sinceVersion = null, kind = OTHER), // KT-49276 + ContextSensitiveEnumResolutionInWhen(sinceVersion = null, kind = UNSTABLE_FEATURE), // KT-52774 ; init {