Don't insert {} after 'else' and 'try' in infinished statements

This commit is contained in:
Nikolay Krasko
2015-11-27 16:13:18 +03:00
committed by Nikolay Krasko
parent 5301f3eb46
commit 9e0e3aaebb
2 changed files with 130 additions and 14 deletions
@@ -52,8 +52,16 @@ import org.jetbrains.kotlin.psi.KtSimpleNameStringTemplateEntry;
public class KotlinTypedHandler extends TypedHandlerDelegate {
private final static TokenSet CONTROL_FLOW_EXPRESSIONS = TokenSet.create(
KtNodeTypes.IF,
KtNodeTypes.ELSE,
KtNodeTypes.FOR,
KtNodeTypes.WHILE);
KtNodeTypes.WHILE,
KtNodeTypes.TRY);
private final static TokenSet SUPPRESS_AUTO_INSERT_CLOSE_BRACE_AFTER = TokenSet.create(
KtTokens.RPAR,
KtTokens.ELSE_KEYWORD,
KtTokens.TRY_KEYWORD
);
private boolean kotlinLTTyped;
@@ -90,10 +98,12 @@ public class KotlinTypedHandler extends TypedHandlerDelegate {
iterator.retreat();
}
if (iterator.atEnd() || iterator.getTokenType() != KtTokens.RPAR) {
if (iterator.atEnd() || !(SUPPRESS_AUTO_INSERT_CLOSE_BRACE_AFTER.contains(iterator.getTokenType()))) {
return Result.CONTINUE;
}
int tokenBeforeBraceOffset = iterator.getStart();
PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument());
PsiElement leaf = file.findElementAt(offset);
@@ -101,9 +111,7 @@ public class KotlinTypedHandler extends TypedHandlerDelegate {
PsiElement parent = leaf.getParent();
if (parent != null && CONTROL_FLOW_EXPRESSIONS.contains(parent.getNode().getElementType())) {
ASTNode nonWhitespaceSibling = FormatterUtil.getPreviousNonWhitespaceSibling(leaf.getNode());
if (nonWhitespaceSibling != null && nonWhitespaceSibling.getText().equals(")")) {
// Check that ')' belongs to same parent
if (nonWhitespaceSibling != null && nonWhitespaceSibling.getStartOffset() == tokenBeforeBraceOffset) {
EditorModificationUtil.insertStringAtCaret(editor, "{", false, true);
indentBrace(project, editor, '{');
@@ -21,12 +21,12 @@ import com.intellij.testFramework.LightCodeInsightTestCase
import com.intellij.testFramework.LightPlatformCodeInsightTestCase
public class TypedHandlerTest : LightCodeInsightTestCase() {
val amp = '$'
val dollar = '$'
public fun testTypeStringTemplateStart(): Unit = doCharTypeTest(
'{',
"""val x = "$<caret>" """,
"""val x = "$amp{}" """
"""val x = "$dollar{}" """
)
public fun testAutoIndentRightOpenBrace(): Unit = doCharTypeTest(
@@ -56,19 +56,19 @@ public class TypedHandlerTest : LightCodeInsightTestCase() {
public fun testTypeStringTemplateStartWithCloseBraceAfter(): Unit = doCharTypeTest(
'{',
"""fun foo() { "$<caret>" }""",
"""fun foo() { "$amp{}" }"""
"""fun foo() { "$dollar{}" }"""
)
public fun testTypeStringTemplateStartBeforeString(): Unit = doCharTypeTest(
'{',
"""fun foo() { "$<caret>something" }""",
"""fun foo() { "$amp{}something" }"""
"""fun foo() { "$dollar{}something" }"""
)
public fun testKT3575(): Unit = doCharTypeTest(
'{',
"""val x = "$<caret>]" """,
"""val x = "$amp{}]" """
"""val x = "$dollar{}]" """
)
public fun testAutoCloseBraceInFunctionDeclaration(): Unit = doCharTypeTest(
@@ -112,6 +112,54 @@ public class TypedHandlerTest : LightCodeInsightTestCase() {
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedElseSurroundOnSameLine(): Unit = doCharTypeTest(
'{',
"fun foo() {\n" +
" if(true) {} else <caret>foo()\n" +
"}",
"fun foo() {\n" +
" if(true) {} else {foo()\n" +
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedTryOnSameLine(): Unit = doCharTypeTest(
'{',
"fun foo() {\n" +
" try <caret>foo()\n" +
"}",
"fun foo() {\n" +
" try {foo()\n" +
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedCatchOnSameLine(): Unit = doCharTypeTest(
'{',
"fun foo() {\n" +
" try {} catch (e: Exception) <caret>foo()\n" +
"}",
"fun foo() {\n" +
" try {} catch (e: Exception) {foo()\n" +
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedFinallyOnSameLine(): Unit = doCharTypeTest(
'{',
"fun foo() {\n" +
" try {} catch (e: Exception) finally <caret>foo()\n" +
"}",
"fun foo() {\n" +
" try {} catch (e: Exception) finally {foo()\n" +
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedWhileSurroundOnSameLine(): Unit = doCharTypeTest(
'{',
@@ -154,6 +202,34 @@ public class TypedHandlerTest : LightCodeInsightTestCase() {
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedElseSurroundOnOtherLine(): Unit = doCharTypeTest(
'{',
"fun foo() {\n" +
" if(true) {} else <caret>\n" +
" foo()\n" +
"}",
"fun foo() {\n" +
" if(true) {} else {<caret>\n" +
" foo()\n" +
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedTryOnOtherLine(): Unit = doCharTypeTest(
'{',
"fun foo() {\n" +
" try <caret>\n" +
" foo()\n" +
"}",
"fun foo() {\n" +
" try {<caret>\n" +
" foo()\n" +
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedIfSurroundOnNewLine(): Unit = doCharTypeTest(
'{',
@@ -170,6 +246,38 @@ public class TypedHandlerTest : LightCodeInsightTestCase() {
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedElseSurroundOnNewLine(): Unit = doCharTypeTest(
'{',
"fun foo() {\n" +
" if(true) {} else\n" +
" <caret>\n" +
" foo()\n" +
"}",
"fun foo() {\n" +
" if(true) {} else\n" +
" {<caret>\n" +
" foo()\n" +
"}"
)
public fun testDoNotAutoCloseBraceInUnfinishedTryOnNewLine(): Unit = doCharTypeTest(
'{',
"fun foo() {\n" +
" try\n" +
" <caret>\n" +
" foo()\n" +
"}",
"fun foo() {\n" +
" try\n" +
" {<caret>\n" +
" foo()\n" +
"}"
)
public fun testAutoCloseBraceInsideFor(): Unit = doCharTypeTest(
'{',
@@ -224,8 +332,8 @@ public class TypedHandlerTest : LightCodeInsightTestCase() {
public fun testAutoInsertParenInStringLiteral(): Unit = doCharTypeTest(
'(',
"""fun f() { println("$amp{f<caret>}") }""",
"""fun f() { println("$amp{f(<caret>)}") }"""
"""fun f() { println("$dollar{f<caret>}") }""",
"""fun f() { println("$dollar{f(<caret>)}") }"""
)
public fun testAutoInsertParenInCode(): Unit = doCharTypeTest(
@@ -257,9 +365,9 @@ public class TypedHandlerTest : LightCodeInsightTestCase() {
public fun testSplitStringByEnter_BeforeSubstitution(): Unit = doCharTypeTest(
'\n',
"""val s = "foo<caret>${amp}bar"""",
"""val s = "foo<caret>${dollar}bar"""",
"val s = \"foo\" +\n" +
" \"${amp}bar\""
" \"${dollar}bar\""
)
public fun testSplitStringByEnter_AddParentheses(): Unit = doCharTypeTest(