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
}
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)
)
}
@@ -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<KtBinaryExpression>()
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<KtExpression?>) =
@@ -1,3 +1,5 @@
// HIGHLIGHT: INFORMATION
fun foo(): Int {
var res = 0
loop@ while (true) {
@@ -1,3 +1,5 @@
// HIGHLIGHT: INFORMATION
fun foo(): Int {
var res = 0
loop@ while (true) {
@@ -1,3 +1,5 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun test(n: Int): String {
var res: String
@@ -1,3 +1,5 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun test(n: Int): String {
var res: String