From cf262822d492992b180b3e1a1d9aae3a3dcfd605 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Fri, 29 Aug 2014 15:01:34 +0400 Subject: [PATCH] java: handle { after if/while statement condition and insert new block statement if needed: complicated conditions case --- .../codeInsight/editorActions/JavaTypedHandler.java | 7 +++++-- .../typing/fixIfByBraceCompositeCondition_after.java | 5 +++++ .../typing/fixIfByBraceCompositeCondition_before.java | 5 +++++ .../codeInsight/typing/fixIfByBraceNewObject_after.java | 5 +++++ .../codeInsight/typing/fixIfByBraceNewObject_before.java | 5 +++++ .../testSrc/com/intellij/codeInsight/JavaTypingTest.java | 8 ++++++++ 6 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/typing/fixIfByBraceCompositeCondition_after.java create mode 100644 java/java-tests/testData/codeInsight/typing/fixIfByBraceCompositeCondition_before.java create mode 100644 java/java-tests/testData/codeInsight/typing/fixIfByBraceNewObject_after.java create mode 100644 java/java-tests/testData/codeInsight/typing/fixIfByBraceNewObject_before.java diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaTypedHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaTypedHandler.java index 70698d4ad609..4905877a9a11 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaTypedHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaTypedHandler.java @@ -134,8 +134,9 @@ public class JavaTypedHandler extends TypedHandlerDelegate { return Result.CONTINUE; } PsiElement st = leaf != null ? leaf.getParent() : null; + PsiElement prev = offset > 1 ? file.findElementAt(offset - 1) : null; if (CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET && isRparenth(leaf) && - (st instanceof PsiWhileStatement || st instanceof PsiIfStatement) && noBody(st, doc)) { + (st instanceof PsiWhileStatement || st instanceof PsiIfStatement) && shouldInsertStatementBody(st, doc, prev)) { new JavaSmartEnterProcessor().process(project, editor, file); return Result.STOP; } @@ -149,9 +150,11 @@ public class JavaTypedHandler extends TypedHandlerDelegate { return Result.CONTINUE; } - private static boolean noBody(@NotNull PsiElement statement, @NotNull Document doc) { + private static boolean shouldInsertStatementBody(@NotNull PsiElement statement, @NotNull Document doc, @Nullable PsiElement prev) { PsiStatement block = statement instanceof PsiWhileStatement ? ((PsiWhileStatement)statement).getBody() : ((PsiIfStatement)statement).getThenBranch(); PsiExpression condition = PsiTreeUtil.getChildOfType(statement, PsiExpression.class); + PsiExpression latestExpression = PsiTreeUtil.getParentOfType(prev, PsiExpression.class); + if (latestExpression instanceof PsiNewExpression && ((PsiNewExpression)latestExpression).getAnonymousClass() == null) return false; return !(block instanceof PsiBlockStatement) && (block == null || startLine(doc, block) != startLine(doc, statement) || condition == null); } diff --git a/java/java-tests/testData/codeInsight/typing/fixIfByBraceCompositeCondition_after.java b/java/java-tests/testData/codeInsight/typing/fixIfByBraceCompositeCondition_after.java new file mode 100644 index 000000000000..d57959a1485a --- /dev/null +++ b/java/java-tests/testData/codeInsight/typing/fixIfByBraceCompositeCondition_after.java @@ -0,0 +1,5 @@ +class C { + boolean f() { + if (f() && new Object(){) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/typing/fixIfByBraceCompositeCondition_before.java b/java/java-tests/testData/codeInsight/typing/fixIfByBraceCompositeCondition_before.java new file mode 100644 index 000000000000..9718c041c2e0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/typing/fixIfByBraceCompositeCondition_before.java @@ -0,0 +1,5 @@ +class C { + boolean f() { + if (f() && new Object()) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/typing/fixIfByBraceNewObject_after.java b/java/java-tests/testData/codeInsight/typing/fixIfByBraceNewObject_after.java new file mode 100644 index 000000000000..f85e4d676ead --- /dev/null +++ b/java/java-tests/testData/codeInsight/typing/fixIfByBraceNewObject_after.java @@ -0,0 +1,5 @@ +class C { + boolean f() { + if (new Object(){) + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/typing/fixIfByBraceNewObject_before.java b/java/java-tests/testData/codeInsight/typing/fixIfByBraceNewObject_before.java new file mode 100644 index 000000000000..f536c7eba9a3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/typing/fixIfByBraceNewObject_before.java @@ -0,0 +1,5 @@ +class C { + boolean f() { + if (new Object()) + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java index 6b12df69216b..37aa8852136b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java @@ -78,6 +78,14 @@ public class JavaTypingTest extends LightPlatformCodeInsightFixtureTestCase { doTest('{'); } + public void testFixIfByBraceNewObject() { + doTest('{'); + } + + public void testFixIfByBraceCompositeCondition() { + doTest('{'); + } + public void testFixWhileByBrace() { doTest('{'); }