From c8a9c6fcb8d63f012a1ab7865ad319d5825a3783 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Mon, 23 May 2011 11:08:17 +0400 Subject: [PATCH] IDEA-69972 Smart Complete Statement: Leave code block if the action is called for the complete statement Don't leave method code block on smart completion --- .../LeaveCodeBlockEnterProcessor.java | 29 ++++++++++++++----- .../completeStatement/CompleteCall_after.java | 2 +- .../CompleteStringLiteral_after.java | 2 +- .../completeStatement/NoErrors_after.java | 2 +- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/LeaveCodeBlockEnterProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/LeaveCodeBlockEnterProcessor.java index b874ac626c1b..44f6f7a90991 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/LeaveCodeBlockEnterProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/LeaveCodeBlockEnterProcessor.java @@ -51,7 +51,12 @@ public class LeaveCodeBlockEnterProcessor implements EnterProcessor { if (!(parent instanceof PsiCodeBlock)) { return false; } - + + final ASTNode node = psiElement.getNode(); + if (node != null && CONTROL_FLOW_ELEMENT_TYPES.contains(node.getElementType())) { + return false; + } + boolean leaveCodeBlock = isControlFlowBreak(psiElement) || isValidStatementInsideControlFlowOperator(psiElement, isModified); if (!leaveCodeBlock) { return false; @@ -106,15 +111,25 @@ public class LeaveCodeBlockEnterProcessor implements EnterProcessor { return element instanceof PsiReturnStatement || element instanceof PsiThrowStatement; } - private static boolean isValidStatementInsideControlFlowOperator(@Nullable PsiElement element, boolean modified) { + private static boolean isValidStatementInsideControlFlowOperator(final @Nullable PsiElement element, boolean modified) { if (modified || element == null || PsiTreeUtil.hasErrorElements(element)) { return false; } - final ASTNode node = element.getNode(); - if (node == null) { - return false; - } + + for (PsiElement e = element; e != null; e = e.getParent()) { + final ASTNode node = e.getNode(); + if (node == null) { + return false; + } - return !CONTROL_FLOW_ELEMENT_TYPES.contains(node.getElementType()); + if (node.getElementType() == JavaElementType.METHOD) { + return false; + } + + if (CONTROL_FLOW_ELEMENT_TYPES.contains(node.getElementType())) { + return true; + } + } + return false; } } diff --git a/java/java-tests/testData/codeInsight/completeStatement/CompleteCall_after.java b/java/java-tests/testData/codeInsight/completeStatement/CompleteCall_after.java index 9d6c26a7a37f..1c714c27b0e5 100644 --- a/java/java-tests/testData/codeInsight/completeStatement/CompleteCall_after.java +++ b/java/java-tests/testData/codeInsight/completeStatement/CompleteCall_after.java @@ -2,6 +2,6 @@ public class Foo { { foo(x); + } - } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completeStatement/CompleteStringLiteral_after.java b/java/java-tests/testData/codeInsight/completeStatement/CompleteStringLiteral_after.java index 3f2a4df9b6be..7109341a7591 100644 --- a/java/java-tests/testData/codeInsight/completeStatement/CompleteStringLiteral_after.java +++ b/java/java-tests/testData/codeInsight/completeStatement/CompleteStringLiteral_after.java @@ -1,6 +1,6 @@ public class Foo { public void foo() { String s = "abcdef"; + } - } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completeStatement/NoErrors_after.java b/java/java-tests/testData/codeInsight/completeStatement/NoErrors_after.java index e5996b094fe3..43dc309a7abe 100644 --- a/java/java-tests/testData/codeInsight/completeStatement/NoErrors_after.java +++ b/java/java-tests/testData/codeInsight/completeStatement/NoErrors_after.java @@ -2,6 +2,6 @@ public class Test { public void foo() { int x = 2; + } - } \ No newline at end of file