From 27c4a581ad868fa4e9f37a0211497e405d99e856 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Fri, 25 Jul 2014 19:28:29 +0400 Subject: [PATCH] IDEA-127198 New smart backspace feature is not good for deletion of blank line before --- .../editorActions/IndentingBackspaceHandler.java | 12 ++++++++++-- .../editor/indentingBackspace/beforeBrace-after.java | 4 ++++ .../editor/indentingBackspace/beforeBrace.java | 5 +++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 platform/lang-impl/testData/editor/indentingBackspace/beforeBrace-after.java create mode 100644 platform/lang-impl/testData/editor/indentingBackspace/beforeBrace.java diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/IndentingBackspaceHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/IndentingBackspaceHandler.java index 345cb80bae69..fe4fc716a5fb 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/IndentingBackspaceHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/IndentingBackspaceHandler.java @@ -23,8 +23,10 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; import com.intellij.util.text.CharArrayUtil; @@ -37,10 +39,12 @@ public class IndentingBackspaceHandler extends BackspaceHandlerDelegate { private static final Logger LOG = Logger.getInstance(IndentingBackspaceHandler.class); private boolean caretWasAtLineStart; + private int initialCaretOffset; @Override public void beforeCharDeleted(char c, PsiFile file, Editor editor) { caretWasAtLineStart = editor.getCaretModel().getLogicalPosition().column == 0; + initialCaretOffset = editor.getCaretModel().getOffset(); } @Override @@ -68,8 +72,12 @@ public class IndentingBackspaceHandler extends BackspaceHandlerDelegate { return false; } - CodeStyleFacade codeStyleFacade = CodeStyleFacade.getInstance(editor.getProject()); - String indent = codeStyleFacade.getLineIndent(document, lineStartOffset); + Project project = file.getProject(); + CodeStyleFacade codeStyleFacade = CodeStyleFacade.getInstance(project); + PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project); + // We should calculate indent at line containing the text after caret, cause that text might affect the result (e.g. closing brace in Java) + String indent = codeStyleFacade.getLineIndent(document, caretWasAtLineStart && psiDocumentManager.isUncommited(document) + ? initialCaretOffset : lineStartOffset); if (indent == null) { return false; } diff --git a/platform/lang-impl/testData/editor/indentingBackspace/beforeBrace-after.java b/platform/lang-impl/testData/editor/indentingBackspace/beforeBrace-after.java new file mode 100644 index 000000000000..f1733f5e6d06 --- /dev/null +++ b/platform/lang-impl/testData/editor/indentingBackspace/beforeBrace-after.java @@ -0,0 +1,4 @@ +class A { + void foo() { + } +} diff --git a/platform/lang-impl/testData/editor/indentingBackspace/beforeBrace.java b/platform/lang-impl/testData/editor/indentingBackspace/beforeBrace.java new file mode 100644 index 000000000000..5fd42398e146 --- /dev/null +++ b/platform/lang-impl/testData/editor/indentingBackspace/beforeBrace.java @@ -0,0 +1,5 @@ +class A { + void foo() { + } + +}