From ab8abc9c620ace467d69f2bd75108b302d699b22 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 18 Nov 2016 13:28:51 +0100 Subject: [PATCH] Delete paired > after deleting < after any identifier, not just a class-like one #KT-13279 Fixed --- .../kotlin/idea/editor/KotlinBackspaceHandler.java | 7 ++++++- .../org/jetbrains/kotlin/idea/editor/LtGtTypingUtils.java | 7 ++++--- idea/testData/editor/backspaceHandler/typeArguments.kt | 1 + .../editor/backspaceHandler/typeArguments.kt.after | 1 + .../backspaceHandler/BackspaceHandlerTestGenerated.java | 6 ++++++ 5 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 idea/testData/editor/backspaceHandler/typeArguments.kt create mode 100644 idea/testData/editor/backspaceHandler/typeArguments.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/editor/KotlinBackspaceHandler.java b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinBackspaceHandler.java index 7aadd2b90a2..eaab16194f8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/editor/KotlinBackspaceHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinBackspaceHandler.java @@ -19,15 +19,20 @@ package org.jetbrains.kotlin.idea.editor; import com.intellij.codeInsight.editorActions.BackspaceHandlerDelegate; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiFile; +import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.psi.KtFile; +import static org.jetbrains.kotlin.idea.editor.LtGtTypingUtils.isAfterToken; + public class KotlinBackspaceHandler extends BackspaceHandlerDelegate { private boolean deleteGt; @Override public void beforeCharDeleted(char c, PsiFile file, Editor editor) { int offset = editor.getCaretModel().getOffset() - 1; - deleteGt = c =='<' && file instanceof KtFile && LtGtTypingUtils.shouldAutoCloseAngleBracket(offset, editor); + deleteGt = c =='<' && file instanceof KtFile && + (isAfterToken(offset, editor, KtTokens.FUN_KEYWORD) || + isAfterToken(offset, editor, KtTokens.IDENTIFIER)); } @Override diff --git a/idea/src/org/jetbrains/kotlin/idea/editor/LtGtTypingUtils.java b/idea/src/org/jetbrains/kotlin/idea/editor/LtGtTypingUtils.java index 0df4cd0acbb..9aaedfb45d2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/editor/LtGtTypingUtils.java +++ b/idea/src/org/jetbrains/kotlin/idea/editor/LtGtTypingUtils.java @@ -22,6 +22,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.psi.tree.TokenSet; +import org.jetbrains.kotlin.lexer.KtToken; import org.jetbrains.kotlin.lexer.KtTokens; final class LtGtTypingUtils { @@ -43,7 +44,7 @@ final class LtGtTypingUtils { } static boolean shouldAutoCloseAngleBracket(int offset, Editor editor) { - return isAfterClassIdentifier(offset, editor) || isAfterFunKeyword(offset, editor); + return isAfterClassIdentifier(offset, editor) || isAfterToken(offset, editor, KtTokens.FUN_KEYWORD); } private static boolean isAfterClassIdentifier(int offset, Editor editor) { @@ -59,7 +60,7 @@ final class LtGtTypingUtils { return JavaTypedHandler.isClassLikeIdentifier(offset, editor, iterator, KtTokens.IDENTIFIER); } - private static boolean isAfterFunKeyword(int offset, Editor editor) { + static boolean isAfterToken(int offset, Editor editor, KtToken tokenType) { HighlighterIterator iterator = ((EditorEx) editor).getHighlighter().createIterator(offset); if (iterator.atEnd()) { return false; @@ -73,6 +74,6 @@ final class LtGtTypingUtils { iterator.retreat(); } - return iterator.getTokenType() == KtTokens.FUN_KEYWORD; + return iterator.getTokenType() == tokenType; } } diff --git a/idea/testData/editor/backspaceHandler/typeArguments.kt b/idea/testData/editor/backspaceHandler/typeArguments.kt new file mode 100644 index 00000000000..0573bd92108 --- /dev/null +++ b/idea/testData/editor/backspaceHandler/typeArguments.kt @@ -0,0 +1 @@ +val f = ContainerUtil.newArrayList<>() \ No newline at end of file diff --git a/idea/testData/editor/backspaceHandler/typeArguments.kt.after b/idea/testData/editor/backspaceHandler/typeArguments.kt.after new file mode 100644 index 00000000000..fc18cb69611 --- /dev/null +++ b/idea/testData/editor/backspaceHandler/typeArguments.kt.after @@ -0,0 +1 @@ +val f = ContainerUtil.newArrayList() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/backspaceHandler/BackspaceHandlerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/editor/backspaceHandler/BackspaceHandlerTestGenerated.java index 4cbb1f93f7d..a36be65458f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/editor/backspaceHandler/BackspaceHandlerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/backspaceHandler/BackspaceHandlerTestGenerated.java @@ -36,6 +36,12 @@ public class BackspaceHandlerTestGenerated extends AbstractBackspaceHandlerTest KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/editor/backspaceHandler"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("typeArguments.kt") + public void testTypeArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/backspaceHandler/typeArguments.kt"); + doTest(fileName); + } + @TestMetadata("idea/testData/editor/backspaceHandler/stringTemplate") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)