Delete paired > after deleting < after any identifier, not just a class-like one
#KT-13279 Fixed
This commit is contained in:
@@ -19,15 +19,20 @@ package org.jetbrains.kotlin.idea.editor;
|
|||||||
import com.intellij.codeInsight.editorActions.BackspaceHandlerDelegate;
|
import com.intellij.codeInsight.editorActions.BackspaceHandlerDelegate;
|
||||||
import com.intellij.openapi.editor.Editor;
|
import com.intellij.openapi.editor.Editor;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens;
|
||||||
import org.jetbrains.kotlin.psi.KtFile;
|
import org.jetbrains.kotlin.psi.KtFile;
|
||||||
|
|
||||||
|
import static org.jetbrains.kotlin.idea.editor.LtGtTypingUtils.isAfterToken;
|
||||||
|
|
||||||
public class KotlinBackspaceHandler extends BackspaceHandlerDelegate {
|
public class KotlinBackspaceHandler extends BackspaceHandlerDelegate {
|
||||||
private boolean deleteGt;
|
private boolean deleteGt;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeCharDeleted(char c, PsiFile file, Editor editor) {
|
public void beforeCharDeleted(char c, PsiFile file, Editor editor) {
|
||||||
int offset = editor.getCaretModel().getOffset() - 1;
|
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
|
@Override
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.intellij.openapi.editor.Editor;
|
|||||||
import com.intellij.openapi.editor.ex.EditorEx;
|
import com.intellij.openapi.editor.ex.EditorEx;
|
||||||
import com.intellij.openapi.editor.highlighter.HighlighterIterator;
|
import com.intellij.openapi.editor.highlighter.HighlighterIterator;
|
||||||
import com.intellij.psi.tree.TokenSet;
|
import com.intellij.psi.tree.TokenSet;
|
||||||
|
import org.jetbrains.kotlin.lexer.KtToken;
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens;
|
import org.jetbrains.kotlin.lexer.KtTokens;
|
||||||
|
|
||||||
final class LtGtTypingUtils {
|
final class LtGtTypingUtils {
|
||||||
@@ -43,7 +44,7 @@ final class LtGtTypingUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static boolean shouldAutoCloseAngleBracket(int offset, Editor editor) {
|
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) {
|
private static boolean isAfterClassIdentifier(int offset, Editor editor) {
|
||||||
@@ -59,7 +60,7 @@ final class LtGtTypingUtils {
|
|||||||
return JavaTypedHandler.isClassLikeIdentifier(offset, editor, iterator, KtTokens.IDENTIFIER);
|
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);
|
HighlighterIterator iterator = ((EditorEx) editor).getHighlighter().createIterator(offset);
|
||||||
if (iterator.atEnd()) {
|
if (iterator.atEnd()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -73,6 +74,6 @@ final class LtGtTypingUtils {
|
|||||||
iterator.retreat();
|
iterator.retreat();
|
||||||
}
|
}
|
||||||
|
|
||||||
return iterator.getTokenType() == KtTokens.FUN_KEYWORD;
|
return iterator.getTokenType() == tokenType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
val f = ContainerUtil.newArrayList<<caret>>()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
val f = ContainerUtil.newArrayList<caret>()
|
||||||
+6
@@ -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);
|
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")
|
@TestMetadata("idea/testData/editor/backspaceHandler/stringTemplate")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user