Creating indent by CodeStyleManager.adjustLineIndent when surrounding with try-finally (IDEA-128859)

This commit is contained in:
Yaroslav Lepenkin
2014-09-01 19:16:37 +04:00
parent 6d64c26e4f
commit 8d7040e88e
4 changed files with 34 additions and 10 deletions
@@ -19,10 +19,8 @@ import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorModificationUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.util.IncorrectOperationException;
@@ -65,16 +63,14 @@ class JavaWithTryFinallySurrounder extends JavaStatementsSurrounder{
if (finallyBlock == null) {
return null;
}
int offset = finallyBlock.getTextRange().getStartOffset() + 2;
editor.getCaretModel().moveToOffset(offset);
final Document document = editor.getDocument();
Document document = editor.getDocument();
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document);
TextRange finallyBlockRange = finallyBlock.getTextRange();
int newLineOffset = finallyBlockRange.getStartOffset() + 2;
editor.getCaretModel().moveToOffset(newLineOffset);
editor.getSelectionModel().removeSelection();
final PsiStatement[] tryBlockStatements = tryBlock.getStatements();
LOG.assertTrue(tryBlockStatements.length > 0, tryBlock.getText());
final PsiStatement firstTryStmt = tryBlockStatements[0];
final int indent = firstTryStmt.getTextOffset() - document.getLineStartOffset(document.getLineNumber(firstTryStmt.getTextOffset()));
EditorModificationUtil.insertStringAtCaret(editor, StringUtil.repeat(" ", indent), false, true);
CodeStyleManager.getInstance(project).adjustLineIndent(document, newLineOffset);
PsiDocumentManager.getInstance(project).commitDocument(document);
return new TextRange(editor.getCaretModel().getOffset(), editor.getCaretModel().getOffset());
}
}
@@ -0,0 +1,5 @@
class Test {
void test() {
<selection> int a = 2;</selection>
}
}
@@ -0,0 +1,9 @@
class Test {
void test() {
try {
int a = 2;
} finally {
<caret>
}
}
}
@@ -17,6 +17,7 @@ package com.intellij.codeInsight.generation.surroundWith;
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateState;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.lang.LanguageSurrounders;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.surroundWith.SurroundDescriptor;
@@ -24,6 +25,7 @@ import com.intellij.lang.surroundWith.Surrounder;
import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.testFramework.LightCodeInsightTestCase;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -156,6 +158,18 @@ public class JavaSurroundWithTest extends LightCodeInsightTestCase {
doTest(getTestName(false), new JavaWithIfElseExpressionSurrounder());
}
public void testSurroundWithTryFinallyUsingIndents() {
CommonCodeStyleSettings.IndentOptions indentOptions = getCurrentCodeStyleSettings().getIndentOptions(JavaFileType.INSTANCE);
boolean oldUseTabs = indentOptions.USE_TAB_CHARACTER;
try {
indentOptions.USE_TAB_CHARACTER = true;
doTest(getTestName(false), new JavaWithTryFinallySurrounder());
}
finally {
indentOptions.USE_TAB_CHARACTER = oldUseTabs;
}
}
private void doTest(@NotNull String fileName, final Surrounder surrounder) {
configureByFile(BASE_PATH + fileName + ".java");