Lift assignment out: do not highlight for exactly one assignment

Related to KT-14900
This commit is contained in:
Mikhail Glukhikh
2017-07-05 15:04:27 +03:00
parent 1010ecca8c
commit c0d10264bc
6 changed files with 17 additions and 6 deletions
@@ -42,11 +42,13 @@ class LiftReturnOrAssignmentInspection : AbstractKotlinInspection() {
) )
return return
} }
if (BranchedFoldingUtils.canFoldToAssignment(expression)) { val assignmentNumber = BranchedFoldingUtils.getFoldableAssignmentNumber(expression)
if (assignmentNumber > 0) {
holder.registerProblem( holder.registerProblem(
keyword, keyword,
"Assignment can be lifted out of '${keyword.text}'", "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) LiftAssignmentOutFix(keyword.text)
) )
} }
@@ -48,7 +48,7 @@ object BranchedFoldingUtils {
fun checkAssignmentsMatch(a1: KtBinaryExpression, a2: KtBinaryExpression): Boolean = fun checkAssignmentsMatch(a1: KtBinaryExpression, a2: KtBinaryExpression): Boolean =
a1.left?.text == a2.left?.text && a1.operationToken == a2.operationToken a1.left?.text == a2.left?.text && a1.operationToken == a2.operationToken
fun canFoldToAssignment(expression: KtExpression?): Boolean { internal fun getFoldableAssignmentNumber(expression: KtExpression?): Int {
val assignments = mutableListOf<KtBinaryExpression>() val assignments = mutableListOf<KtBinaryExpression>()
fun collectAssignmentsAndCheck(e: KtExpression?): Boolean = when (e) { fun collectAssignmentsAndCheck(e: KtExpression?): Boolean = when (e) {
is KtWhenExpression -> { is KtWhenExpression -> {
@@ -76,10 +76,11 @@ object BranchedFoldingUtils {
is KtThrowExpression, is KtReturnExpression -> true is KtThrowExpression, is KtReturnExpression -> true
else -> false else -> false
} }
if (!collectAssignmentsAndCheck(expression)) return false if (!collectAssignmentsAndCheck(expression)) return -1
if (assignments.isEmpty()) return false if (assignments.isEmpty()) return 0
val firstAssignment = assignments.first() 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<KtExpression?>) = private fun getFoldableReturnNumber(branches: List<KtExpression?>) =
@@ -1,3 +1,5 @@
// HIGHLIGHT: INFORMATION
fun foo(): Int { fun foo(): Int {
var res = 0 var res = 0
loop@ while (true) { loop@ while (true) {
@@ -1,3 +1,5 @@
// HIGHLIGHT: INFORMATION
fun foo(): Int { fun foo(): Int {
var res = 0 var res = 0
loop@ while (true) { loop@ while (true) {
@@ -1,3 +1,5 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun test(n: Int): String { fun test(n: Int): String {
var res: String var res: String
@@ -1,3 +1,5 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun test(n: Int): String { fun test(n: Int): String {
var res: String var res: String