diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/InvertIfConditionIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/InvertIfConditionIntention.kt index 54167ad351e..958ebf6caa9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/InvertIfConditionIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/InvertIfConditionIntention.kt @@ -17,19 +17,18 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.quickfix.moveCaret import org.jetbrains.kotlin.idea.util.isUnit import org.jetbrains.kotlin.idea.util.psi.patternMatching.matches import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.endOffset -import org.jetbrains.kotlin.psi.psiUtil.lastBlockStatementOrThis -import org.jetbrains.kotlin.psi.psiUtil.siblings -import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull @@ -40,14 +39,20 @@ public class InvertIfConditionIntention : JetSelfTargetingIntention? { @@ -148,20 +164,23 @@ public class InvertIfConditionIntention : JetSelfTargetingIntention()!! - if (expression != lastStatement) { - if (lastStatement.isExitStatement() && expression.siblings(withItself = false).firstIsInstance() == lastStatement) { - return lastStatement + val parent = expression.getParent() + if (parent is JetBlockExpression) { + val lastStatement = parent.getStatements().lastIsInstanceOrNull()!! + if (expression == lastStatement) { + return exitStatementExecutedAfter(parent) + } + else { + if (lastStatement.isExitStatement() && expression.siblings(withItself = false).firstIsInstance() == lastStatement) { + return lastStatement + } + return null } - return null } - val parent = block.getParent() when (parent) { is JetNamedFunction -> { - if (parent.getBodyExpression() == block) { + if (parent.getBodyExpression() == expression) { if (!parent.hasBlockBody()) return null val returnType = (parent.resolveToDescriptor() as FunctionDescriptor).getReturnType() if (returnType == null || !returnType.isUnit()) return null @@ -173,13 +192,13 @@ public class InvertIfConditionIntention : JetSelfTargetingIntention { - if (block == pparent.getBody()) { + if (expression == pparent.getBody()) { return JetPsiFactory(expression).createExpression("continue") } } is JetIfExpression -> { - if (block == pparent.getThen() || block == pparent.getElse()) { + if (expression == pparent.getThen() || expression == pparent.getElse()) { return exitStatementExecutedAfter(pparent) } } diff --git a/idea/testData/intentions/invertIfCondition/lastStatementInLoop2.kt b/idea/testData/intentions/invertIfCondition/lastStatementInLoop2.kt new file mode 100644 index 00000000000..67dd5f862b5 --- /dev/null +++ b/idea/testData/intentions/invertIfCondition/lastStatementInLoop2.kt @@ -0,0 +1,6 @@ +fun foo() { + for (i in 1..10) + if (i > 1) bar() +} + +fun bar(){} \ No newline at end of file diff --git a/idea/testData/intentions/invertIfCondition/lastStatementInLoop2.kt.after b/idea/testData/intentions/invertIfCondition/lastStatementInLoop2.kt.after new file mode 100644 index 00000000000..dbcdac133dd --- /dev/null +++ b/idea/testData/intentions/invertIfCondition/lastStatementInLoop2.kt.after @@ -0,0 +1,8 @@ +fun foo() { + for (i in 1..10) { + if (i <= 1) continue + bar() + } +} + +fun bar(){} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index c67fafa6742..daf300446ab 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4747,6 +4747,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("lastStatementInLoop2.kt") + public void testLastStatementInLoop2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/invertIfCondition/lastStatementInLoop2.kt"); + doTest(fileName); + } + @TestMetadata("lastStatementNonUnitMethod.kt") public void testLastStatementNonUnitMethod() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/invertIfCondition/lastStatementNonUnitMethod.kt");