diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/LiftReturnOrAssignmentInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/LiftReturnOrAssignmentInspection.kt index b26fde1ce91..323e4bd08a7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/LiftReturnOrAssignmentInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/LiftReturnOrAssignmentInspection.kt @@ -42,11 +42,13 @@ class LiftReturnOrAssignmentInspection : AbstractKotlinInspection() { ) return } - if (BranchedFoldingUtils.canFoldToAssignment(expression)) { + val assignmentNumber = BranchedFoldingUtils.getFoldableAssignmentNumber(expression) + if (assignmentNumber > 0) { holder.registerProblem( keyword, "Assignment can be lifted out of '${keyword.text}'", - ProblemHighlightType.GENERIC_ERROR_OR_WARNING, + if (assignmentNumber > 1) ProblemHighlightType.GENERIC_ERROR_OR_WARNING + else ProblemHighlightType.INFORMATION, LiftAssignmentOutFix(keyword.text) ) } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt index d832822b088..cd2be440eb7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt @@ -48,7 +48,7 @@ object BranchedFoldingUtils { fun checkAssignmentsMatch(a1: KtBinaryExpression, a2: KtBinaryExpression): Boolean = a1.left?.text == a2.left?.text && a1.operationToken == a2.operationToken - fun canFoldToAssignment(expression: KtExpression?): Boolean { + internal fun getFoldableAssignmentNumber(expression: KtExpression?): Int { val assignments = mutableListOf() fun collectAssignmentsAndCheck(e: KtExpression?): Boolean = when (e) { is KtWhenExpression -> { @@ -76,10 +76,11 @@ object BranchedFoldingUtils { is KtThrowExpression, is KtReturnExpression -> true else -> false } - if (!collectAssignmentsAndCheck(expression)) return false - if (assignments.isEmpty()) return false + if (!collectAssignmentsAndCheck(expression)) return -1 + if (assignments.isEmpty()) return 0 val firstAssignment = assignments.first() - return assignments.all { BranchedFoldingUtils.checkAssignmentsMatch(it, firstAssignment) } + if (assignments.any { !BranchedFoldingUtils.checkAssignmentsMatch(it, firstAssignment) }) return -1 + return assignments.size } private fun getFoldableReturnNumber(branches: List) = diff --git a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt index c2016bf11f9..2130527cab0 100644 --- a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt +++ b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt @@ -1,3 +1,5 @@ +// HIGHLIGHT: INFORMATION + fun foo(): Int { var res = 0 loop@ while (true) { diff --git a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt.after b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt.after index b4d2e79e053..31ca3a1481d 100644 --- a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt.after +++ b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt.after @@ -1,3 +1,5 @@ +// HIGHLIGHT: INFORMATION + fun foo(): Int { var res = 0 loop@ while (true) { diff --git a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt index 2a8e10ac318..1b82838bbbc 100644 --- a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt +++ b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt @@ -1,3 +1,5 @@ +// HIGHLIGHT: GENERIC_ERROR_OR_WARNING + fun test(n: Int): String { var res: String diff --git a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt.after b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt.after index 010032b7330..c780277a842 100644 --- a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt.after +++ b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt.after @@ -1,3 +1,5 @@ +// HIGHLIGHT: GENERIC_ERROR_OR_WARNING + fun test(n: Int): String { var res: String