ControlFlowWithEmptyBodyInspection: shouldn't report on while with comments

#KT-32419 Fixed
This commit is contained in:
Dmitry Gridin
2019-07-04 16:33:24 +07:00
parent 6e750b0857
commit 46eb929bd1
5 changed files with 13 additions and 17 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.inspections
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.inspections.collections.isCalling
import org.jetbrains.kotlin.idea.util.hasComments
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
@@ -39,14 +40,16 @@ class ControlFlowWithEmptyBodyInspection : AbstractKotlinInspection() {
override fun visitWhileExpression(expression: KtWhileExpression) {
val keyword = expression.allChildren.firstOrNull { it.node.elementType == KtTokens.WHILE_KEYWORD } ?: return
if (expression.body.isEmptyBodyOrNull()) {
val body = expression.body
if (body?.hasComments() != true && body.isEmptyBodyOrNull()) {
holder.registerProblem(expression, keyword)
}
}
override fun visitDoWhileExpression(expression: KtDoWhileExpression) {
val keyword = expression.allChildren.firstOrNull { it.node.elementType == KtTokens.DO_KEYWORD } ?: return
if (expression.body.isEmptyBodyOrNull()) {
val body = expression.body
if (body?.hasComments() != true && body.isEmptyBodyOrNull()) {
holder.registerProblem(expression, keyword)
}
}
@@ -10,8 +10,6 @@ import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.search.LocalSearchScope
import com.intellij.psi.search.searches.ReferencesSearch
@@ -25,6 +23,7 @@ import org.jetbrains.kotlin.idea.intentions.branchedTransformations.expressionCo
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.fromIfKeywordToRightParenthesisTextRangeInThis
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.shouldBeTransformed
import org.jetbrains.kotlin.idea.util.CommentSaver
import org.jetbrains.kotlin.idea.util.hasComments
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange
@@ -102,16 +101,6 @@ class FoldInitializerAndIfToElvisInspection : AbstractApplicabilityBasedInspecti
return newElvis
}
private fun PsiElement.hasComments(): Boolean {
var result = false
accept(object : KtTreeVisitorVoid() {
override fun visitComment(comment: PsiComment?) {
result = true
}
})
return result
}
private fun calcData(ifExpression: KtIfExpression): Data? {
if (ifExpression.`else` != null) return null
@@ -6,11 +6,13 @@
package org.jetbrains.kotlin.idea.util
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.intentions.callExpression
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.containingClass
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
@@ -42,4 +44,6 @@ fun PsiElement.textRangeIn(other: PsiElement): TextRange = textRange.shiftLeft(o
fun KtDotQualifiedExpression.calleeTextRangeInThis(): TextRange? = callExpression?.calleeExpression?.textRangeIn(this)
fun KtNamedDeclaration.nameIdentifierTextRangeInThis(): TextRange? = nameIdentifier?.textRangeIn(this)
fun KtNamedDeclaration.nameIdentifierTextRangeInThis(): TextRange? = nameIdentifier?.textRangeIn(this)
fun PsiElement.hasComments(): Boolean = anyDescendantOfType<PsiComment>()
@@ -1,4 +1,4 @@
// PROBLEM: 'do while' has empty body
// PROBLEM: none
// FIX: none
fun test(i: Int) {
@@ -1,4 +1,4 @@
// PROBLEM: 'while' has empty body
// PROBLEM: none
// FIX: none
fun test(i: Int) {