From 9949de36c93071aef0701941b1bd202ce19a5c8a Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 14 Sep 2023 09:54:07 +0200 Subject: [PATCH] [FIR] Fix false negative ARRAY_EQUALITY_OPERATOR_CAN_BE_REPLACED_WITH_EQUALS ... in presence of typealiases. #KT-61921 --- .../ArrayEqualityCanBeReplacedWithEquals.fir.txt | 7 +++++++ .../ArrayEqualityCanBeReplacedWithEquals.kt | 4 ++++ .../extended/ArrayEqualityCanBeReplacedWithEquals.kt | 6 +++--- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.fir.txt index ad6b5994878..23aa0c48f2f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.fir.txt @@ -1,12 +1,19 @@ FILE: ArrayEqualityCanBeReplacedWithEquals.kt + public final typealias A = R|kotlin/Array| public final fun foo(p: R|kotlin/Int|): R|kotlin/Unit| { lval a: R|kotlin/Array| = R|kotlin/arrayOf|(vararg(Int(1), Int(2), Int(3))) lval b: R|kotlin/Array| = R|kotlin/arrayOf|(vararg(Int(3), Int(2), Int(1))) + lval c: R|A| = R|kotlin/arrayOf|(vararg(Int(3), Int(2), Int(1))) when () { ==(R|/a|, R|/b|) -> { } } + when () { + ==(R|/a|, R|/c|) -> { + } + } + } public final fun testsFromIdea(): R|kotlin/Unit| { lval a: R|kotlin/Array| = R|kotlin/arrayOf|(vararg(String(a))) diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.kt index b50f9364cef..dd2085d3090 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/ArrayEqualityCanBeReplacedWithEquals.kt @@ -1,10 +1,14 @@ // WITH_STDLIB +typealias A = Array + fun foo(p: Int) { val a = arrayOf(1, 2, 3) val b = arrayOf(3, 2, 1) + val c : A = arrayOf(3, 2, 1) if (a == b) { } + if (a == c) { } } fun testsFromIdea() { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/ArrayEqualityCanBeReplacedWithEquals.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/ArrayEqualityCanBeReplacedWithEquals.kt index 03d59853ab9..5bd476631fe 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/ArrayEqualityCanBeReplacedWithEquals.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/ArrayEqualityCanBeReplacedWithEquals.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall import org.jetbrains.kotlin.fir.expressions.FirOperation import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.arguments -import org.jetbrains.kotlin.fir.types.classId +import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClassId import org.jetbrains.kotlin.fir.types.resolvedType import org.jetbrains.kotlin.name.StandardClassIds @@ -26,8 +26,8 @@ object ArrayEqualityCanBeReplacedWithEquals : FirBasicExpressionChecker() { val left = arguments.getOrNull(0) ?: return val right = arguments.getOrNull(1) ?: return - if (left.resolvedType.classId != StandardClassIds.Array) return - if (right.resolvedType.classId != StandardClassIds.Array) return + if (left.resolvedType.fullyExpandedClassId(context.session) != StandardClassIds.Array) return + if (right.resolvedType.fullyExpandedClassId(context.session) != StandardClassIds.Array) return reporter.reportOn(expression.source, ARRAY_EQUALITY_OPERATOR_CAN_BE_REPLACED_WITH_EQUALS, context) }