From 8aa32d9f45a071c4bb958215c271dce35d59625b Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 21 Dec 2023 16:21:01 +0100 Subject: [PATCH] [FIR] Rename DUPLICATE_LABEL_IN_WHEN to DUPLICATE_BRANCH_CONDITION_IN_WHEN ... and fix the message #KT-35289 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 4 +- .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 +- .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 4 +- .../diagnostics/FirDiagnosticsList.kt | 2 +- .../fir/analysis/diagnostics/FirErrors.kt | 2 +- .../expression/FirWhenConditionChecker.kt | 4 +- .../diagnostics/FirErrorsDefaultMessages.kt | 4 +- .../tests/when/DuplicatedLabels.fir.kt | 18 ++-- .../dynamicTypes/dynamicCastTarget.fir.kt | 4 +- .../when-expression/p-4/neg/1.1.fir.kt | 90 +++++++++++++++++++ .../when-expression/p-4/neg/1.1.kt | 1 - .../when-expression/p-4/pos/1.1.fir.kt | 8 +- 12 files changed, 117 insertions(+), 28 deletions(-) create mode 100644 compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/neg/1.1.fir.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 07fba012258..771700fc476 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4245,8 +4245,8 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } - add(FirErrors.DUPLICATE_LABEL_IN_WHEN) { firDiagnostic -> - DuplicateLabelInWhenImpl( + add(FirErrors.DUPLICATE_BRANCH_CONDITION_IN_WHEN) { firDiagnostic -> + DuplicateBranchConditionInWhenImpl( firDiagnostic as KtPsiDiagnostic, token, ) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index af1fe844078..bbf80f90ed3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2958,8 +2958,8 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = CommaInWhenConditionWithoutArgument::class } - interface DuplicateLabelInWhen : KtFirDiagnostic { - override val diagnosticClass get() = DuplicateLabelInWhen::class + interface DuplicateBranchConditionInWhen : KtFirDiagnostic { + override val diagnosticClass get() = DuplicateBranchConditionInWhen::class } interface ConfusingBranchConditionError : KtFirDiagnostic { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 07c9d4f1deb..d1e5bf8e547 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3563,10 +3563,10 @@ internal class CommaInWhenConditionWithoutArgumentImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.CommaInWhenConditionWithoutArgument -internal class DuplicateLabelInWhenImpl( +internal class DuplicateBranchConditionInWhenImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, -) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DuplicateLabelInWhen +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DuplicateBranchConditionInWhen internal class ConfusingBranchConditionErrorImpl( firDiagnostic: KtPsiDiagnostic, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 2919063b168..7cb34c562f6 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1470,7 +1470,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("illegalReason") } val COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT by error(PositioningStrategy.COMMAS) - val DUPLICATE_LABEL_IN_WHEN by warning() + val DUPLICATE_BRANCH_CONDITION_IN_WHEN by warning() val CONFUSING_BRANCH_CONDITION by deprecationError(LanguageFeature.ProhibitConfusingSyntaxInWhenBranches) } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 850a96aa65c..51b5cc280a3 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -750,7 +750,7 @@ object FirErrors { val ELSE_MISPLACED_IN_WHEN: KtDiagnosticFactory0 by error0(SourceElementPositioningStrategies.ELSE_ENTRY) val ILLEGAL_DECLARATION_IN_WHEN_SUBJECT: KtDiagnosticFactory1 by error1() val COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT: KtDiagnosticFactory0 by error0(SourceElementPositioningStrategies.COMMAS) - val DUPLICATE_LABEL_IN_WHEN: KtDiagnosticFactory0 by warning0() + val DUPLICATE_BRANCH_CONDITION_IN_WHEN: KtDiagnosticFactory0 by warning0() val CONFUSING_BRANCH_CONDITION: KtDiagnosticFactoryForDeprecation0 by deprecationError0(ProhibitConfusingSyntaxInWhenBranches) // Context tracking diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirWhenConditionChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirWhenConditionChecker.kt index 036223585ab..65ecc45adf4 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirWhenConditionChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirWhenConditionChecker.kt @@ -52,14 +52,14 @@ object FirWhenConditionChecker : FirWhenExpressionChecker() { else -> continue } if (!checkedConstants.add(value)) { - reporter.reportOn(condition.source, FirErrors.DUPLICATE_LABEL_IN_WHEN, context) + reporter.reportOn(condition.source, FirErrors.DUPLICATE_BRANCH_CONDITION_IN_WHEN, context) } } } is FirTypeOperatorCall -> { val coneType = condition.conversionTypeRef.coneType if (!checkedTypes.add(coneType to condition.operation)) { - reporter.reportOn(condition.conversionTypeRef.source, FirErrors.DUPLICATE_LABEL_IN_WHEN, context) + reporter.reportOn(condition.conversionTypeRef.source, FirErrors.DUPLICATE_BRANCH_CONDITION_IN_WHEN, context) } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 9e9b2ab72c7..6fe7546be70 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -207,7 +207,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATION_ERROR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DESERIALIZATION_ERROR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DIVISION_BY_ZERO import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DSL_SCOPE_VIOLATION -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DUPLICATE_LABEL_IN_WHEN +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DUPLICATE_BRANCH_CONDITION_IN_WHEN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DUPLICATE_PARAMETER_NAME_IN_FUNCTION_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DYNAMIC_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DYNAMIC_RECEIVER_EXPECTED_BUT_WAS_NON_DYNAMIC @@ -2241,7 +2241,7 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT, "Use '||' instead of commas in conditions of 'when' without a subject." ) - map.put(DUPLICATE_LABEL_IN_WHEN, "Duplicate label in 'when'.") + map.put(DUPLICATE_BRANCH_CONDITION_IN_WHEN, "Duplicate branch condition in 'when'.") map.put( ILLEGAL_DECLARATION_IN_WHEN_SUBJECT, "Illegal variable declaration in ''when'' subject: {0}. Should be a simple ''val'' with an initializer.", diff --git a/compiler/testData/diagnostics/tests/when/DuplicatedLabels.fir.kt b/compiler/testData/diagnostics/tests/when/DuplicatedLabels.fir.kt index 4a0f13ae351..bfda5abfb44 100644 --- a/compiler/testData/diagnostics/tests/when/DuplicatedLabels.fir.kt +++ b/compiler/testData/diagnostics/tests/when/DuplicatedLabels.fir.kt @@ -15,10 +15,10 @@ const val four = 4 fun first(arg: Int) = when (arg) { 1 -> 2 2 -> 3 - 1 -> 4 + 1 -> 4 4 -> 5 - 1 -> 6 - 2 -> 7 + 1 -> 6 + 2 -> 7 // Error should be here: see KT-11971 four -> 8 else -> 0 @@ -28,8 +28,8 @@ fun second(arg: String): Int { when (arg) { "ABC" -> return 0 "DEF" -> return 1 - "ABC" -> return -1 - "DEF" -> return -2 + "ABC" -> return -1 + "DEF" -> return -2 } return 42 } @@ -39,8 +39,8 @@ fun third(arg: Any?): Int { null -> return -1 is String -> return 0 is Double -> return 1 - is Double -> return 2 - null -> return 3 + is Double -> return 2 + null -> return 3 !is String -> return 4 else -> return 5 } @@ -51,7 +51,7 @@ enum class Color { RED, GREEN, BLUE } fun fourth(arg: Color) = when (arg) { Color.RED -> "RED" Color.GREEN -> "GREEN" - Color.RED -> "BLUE" + Color.RED -> "BLUE" Color.BLUE -> "BLUE" } @@ -65,6 +65,6 @@ object Foo fun sixth(arg: Any?) = when (arg) { Foo -> "" - Foo -> "" + Foo -> "" else -> null } diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCastTarget.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCastTarget.fir.kt index 0a7e7cf58b4..ad2dbb0d610 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCastTarget.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/dynamicCastTarget.fir.kt @@ -15,9 +15,9 @@ fun test(d: Any, dl: Collection) { when (d) { is dynamic -> {} - is dynamic? -> {} + is dynamic? -> {} !is dynamic -> {} - !is dynamic? -> {} + !is dynamic? -> {} } dl as List diff --git a/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/neg/1.1.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/neg/1.1.fir.kt new file mode 100644 index 00000000000..0ecab3b72a7 --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/neg/1.1.fir.kt @@ -0,0 +1,90 @@ +// !LANGUAGE: +ProhibitSimplificationOfNonTrivialConstBooleanExpressions +// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION +// SKIP_TXT +// FULL_JDK + +/* + * KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE) + * + * SPEC VERSION: 0.1-313 + * MAIN LINK: expressions, when-expression -> paragraph 4 -> sentence 1 + * NUMBER: 1 + * DESCRIPTION: it is possible to replace the else condition with an always-true condition + */ + +// FILE: JavaEnum.java + +enum JavaEnum { + Val_1, + Val_2, +} + +// FILE: KotlinClass.kt + +// TESTCASE NUMBER: 1 +fun case1() { + val z = JavaEnum.Val_1 + val when2 = when (z) { + JavaEnum.Val_1 -> { } + JavaEnum.Val_1 -> { } + } + +} + +// TESTCASE NUMBER: 2 + +fun case2() { + val b = false + val when2: Any = when (b) { + false -> { } + false -> { } + } +} + +// TESTCASE NUMBER: 3 + +fun case3() { + val a = false + val when2: Any = when (a) { + true -> { } + true -> { } + } +} + +// TESTCASE NUMBER: 4 + +fun case4() { + val x: SClass = SClass.B() + val when2 = when (x){ + is SClass.A ->{ } + is SClass.B ->{ } + is SClass.B ->{ } + } +} + +sealed class SClass { + class A : SClass() + class B : SClass() + class C : SClass() +} + +// TESTCASE NUMBER: 5 + +fun case5() { + val b = false + val when1: Any = when (b) { + false -> { } + !false -> { } + else -> { } + } + + val when2: Any = when (b) { + false -> { } + !false -> { } + } + val when3: Any = when (b) { + false -> { } + false -> { } + !false -> { } + } +} diff --git a/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/neg/1.1.kt b/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/neg/1.1.kt index e33647bc41a..72a33276c38 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/neg/1.1.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/neg/1.1.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !LANGUAGE: +ProhibitSimplificationOfNonTrivialConstBooleanExpressions // !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/pos/1.1.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/pos/1.1.fir.kt index e19d4f2400e..8c7c01732b8 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/pos/1.1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/expressions/when-expression/p-4/pos/1.1.fir.kt @@ -37,7 +37,7 @@ fun case1() { val when3 = when (z) { JavaEnum.Val_1 -> { } JavaEnum.Val_2 -> { } - JavaEnum.Val_2 -> { } + JavaEnum.Val_2 -> { } } } @@ -57,7 +57,7 @@ fun case2() { } val when3: Any = when (b) { false -> { } - false -> { } + false -> { } !false -> { } } } @@ -78,7 +78,7 @@ fun case3() { val when3: Any = when (a) { true -> { } false -> { } - false -> { } + false -> { } } } @@ -102,7 +102,7 @@ fun case4() { val when3 = when (x){ is SClass.A ->{ } is SClass.B ->{ } - is SClass.B ->{ } + is SClass.B ->{ } is SClass.C ->{ } } }