KT-5927 Join Lines could merge nested if's

#KT-5927 Fixed
This commit is contained in:
Valentin Kipyatkov
2014-12-16 14:28:56 +01:00
parent bc631d7aee
commit 3db51cfcd8
11 changed files with 91 additions and 7 deletions
@@ -300,12 +300,11 @@ public class JetPsiFactory(private val project: Project) {
return createExpression("$" + fieldName)
}
public fun createBinaryExpression(lhs: String, op: String, rhs: String): JetBinaryExpression {
return createExpression(lhs + " " + op + " " + rhs) as JetBinaryExpression
}
public fun createBinaryExpression(lhs: JetExpression?, op: String, rhs: JetExpression?): JetBinaryExpression {
return createBinaryExpression(JetPsiUtil.getText(lhs), op, JetPsiUtil.getText(rhs))
public fun createBinaryExpression(lhs: JetExpression, op: String, rhs: JetExpression): JetBinaryExpression {
val expression = createExpression("a $op b") as JetBinaryExpression
expression.getLeft().replace(lhs)
expression.getRight().replace(rhs)
return expression
}
public fun createTypeCodeFragment(text: String, context: PsiElement?): JetTypeCodeFragment {
@@ -24,6 +24,8 @@ import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.lang.psi.JetBlockExpression
import org.jetbrains.jet.lang.psi.JetContainerNode
import org.jetbrains.jet.lang.psi.JetWhenEntry
import org.jetbrains.jet.lang.psi.JetIfExpression
import org.jetbrains.jet.lang.psi.JetPsiFactory
public class JoinBlockIntoSingleStatementHandler : JoinRawLinesHandlerDelegate {
override fun tryJoinRawLines(document: Document, file: PsiFile, start: Int, end: Int): Int {
@@ -42,6 +44,20 @@ public class JoinBlockIntoSingleStatementHandler : JoinRawLinesHandlerDelegate {
if (parent !is JetContainerNode && parent !is JetWhenEntry) return -1
if (block.getNode().getChildren(JetTokens.COMMENTS).isNotEmpty()) return -1 // otherwise we will loose comments
// handle nested if's
val pparent = parent.getParent()
if (pparent is JetIfExpression && block == pparent.getThen() && statement is JetIfExpression && statement.getElse() == null) {
val condition1 = pparent.getCondition()
val condition2 = statement.getCondition()
val body = statement.getThen()
if (condition1 != null && condition2 != null && body != null) {
val newCondition = JetPsiFactory(pparent).createBinaryExpression(condition1, "&&", condition2)
condition1.replace(newCondition)
val newBody = block.replace(body)
return newBody.getTextRange()!!.getStartOffset()
}
}
val newStatement = block.replace(statement)
return newStatement.getTextRange()!!.getStartOffset()
}
@@ -0,0 +1,7 @@
fun foo() {
<caret>if (a) {
if (b) {
foo()
}
}
}
@@ -0,0 +1,5 @@
fun foo() {
if (a && b) <caret>{
foo()
}
}
@@ -0,0 +1,5 @@
fun foo() {
<caret>if (a && b) {
if (c && d) foo()
}
}
@@ -0,0 +1,3 @@
fun foo() {
if (a && b && c && d) <caret>foo()
}
@@ -0,0 +1,5 @@
fun foo() {
<caret>if (a && b) {
if (c || d) foo()
}
}
@@ -0,0 +1,3 @@
fun foo() {
if (a && b && (c || d)) <caret>foo()
}
@@ -0,0 +1,5 @@
fun foo() {
<caret>if (a) {
if (b) foo()
}
}
@@ -0,0 +1,3 @@
fun foo() {
if (a && b) <caret>foo()
}
@@ -30,7 +30,7 @@ import java.util.regex.Pattern;
@SuppressWarnings("all")
@TestMetadata("idea/testData/joinLines")
@TestDataPath("$PROJECT_ROOT")
@InnerTestClasses({JoinLinesTestGenerated.DeclarationAndAssignment.class, JoinLinesTestGenerated.RemoveBraces.class})
@InnerTestClasses({JoinLinesTestGenerated.DeclarationAndAssignment.class, JoinLinesTestGenerated.NestedIfs.class, JoinLinesTestGenerated.RemoveBraces.class})
@RunWith(JUnit3RunnerWithInners.class)
public class JoinLinesTestGenerated extends AbstractJoinLinesTest {
public void testAllFilesPresentInJoinLines() throws Exception {
@@ -148,6 +148,39 @@ public class JoinLinesTestGenerated extends AbstractJoinLinesTest {
}
}
@TestMetadata("idea/testData/joinLines/nestedIfs")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class NestedIfs extends AbstractJoinLinesTest {
public void testAllFilesPresentInNestedIfs() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/joinLines/nestedIfs"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("BlockBody.kt")
public void testBlockBody() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/joinLines/nestedIfs/BlockBody.kt");
doTest(fileName);
}
@TestMetadata("ComplexCondition1.kt")
public void testComplexCondition1() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/joinLines/nestedIfs/ComplexCondition1.kt");
doTest(fileName);
}
@TestMetadata("ComplexCondition2.kt")
public void testComplexCondition2() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/joinLines/nestedIfs/ComplexCondition2.kt");
doTest(fileName);
}
@TestMetadata("Simple.kt")
public void testSimple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/joinLines/nestedIfs/Simple.kt");
doTest(fileName);
}
}
@TestMetadata("idea/testData/joinLines/removeBraces")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)