highlight brace after even if there's a non-whitespace (WEB-35454)

This commit is contained in:
Dennis Ushakov
2018-11-01 18:10:57 +03:00
parent 50bf50fa0e
commit b20bff7c87
10 changed files with 103 additions and 17 deletions
@@ -59,6 +59,7 @@ public class BraceHighlightingHandler {
private static final Key<RangeHighlighter> LINE_MARKER_IN_EDITOR_KEY = Key.create("BraceHighlighter.LINE_MARKER_IN_EDITOR_KEY");
private static final Key<LightweightHint> HINT_IN_EDITOR_KEY = Key.create("BraceHighlighter.HINT_IN_EDITOR_KEY");
private static final Key<Boolean> PROCESSED = Key.create("BraceHighlighter.PROCESSED");
static final int LAYER = HighlighterLayer.LAST + 1;
@NotNull private final Project myProject;
@NotNull private final EditorEx myEditor;
@@ -68,7 +69,7 @@ public class BraceHighlightingHandler {
private final PsiFile myPsiFile;
private final CodeInsightSettings myCodeInsightSettings;
private BraceHighlightingHandler(@NotNull Project project, @NotNull EditorEx editor, @NotNull Alarm alarm, PsiFile psiFile) {
BraceHighlightingHandler(@NotNull Project project, @NotNull EditorEx editor, @NotNull Alarm alarm, PsiFile psiFile) {
myProject = project;
myEditor = editor;
@@ -251,10 +252,7 @@ public class BraceHighlightingHandler {
if (iterator.atEnd()) {
offset--;
}
else if (BraceMatchingUtil.isRBraceToken(iterator, chars, fileType)) {
offset--;
}
else if (!BraceMatchingUtil.isLBraceToken(iterator, chars, fileType)) {
else if (!BraceMatchingUtil.isRBraceToken(iterator, chars, fileType) && !BraceMatchingUtil.isLBraceToken(iterator, chars, fileType)) {
offset--;
if (offset >= 0) {
@@ -286,17 +284,14 @@ public class BraceHighlightingHandler {
boolean searchForward = c != '\n';
// Try to find matched brace backwards.
if (offset >= originalOffset && (c == ' ' || c == '\t' || c == '\n')) {
int backwardNonWsOffset = CharArrayUtil.shiftBackward(chars, offset - 1, "\t ");
if (backwardNonWsOffset >= 0) {
iterator = highlighter.createIterator(backwardNonWsOffset);
FileType newFileType = getFileTypeByIterator(iterator);
if (BraceMatchingUtil.isLBraceToken(iterator, chars, newFileType) ||
BraceMatchingUtil.isRBraceToken(iterator, chars, newFileType)) {
offset = backwardNonWsOffset;
searchForward = false;
doHighlight(backwardNonWsOffset, originalOffset, newFileType);
}
if (offset >= originalOffset) {
iterator = highlighter.createIterator(offset - 1);
FileType newFileType = getFileTypeByIterator(iterator);
if (BraceMatchingUtil.isLBraceToken(iterator, chars, newFileType) ||
BraceMatchingUtil.isRBraceToken(iterator, chars, newFileType)) {
offset--;
searchForward = false;
doHighlight(offset, originalOffset, newFileType);
}
}
@@ -446,7 +441,7 @@ public class BraceHighlightingHandler {
RangeHighlighter rbraceHighlighter =
myEditor.getMarkupModel().addRangeHighlighter(
braceRange.getStartOffset(), braceRange.getEndOffset(), HighlighterLayer.LAST + 1, attributes, HighlighterTargetArea.EXACT_RANGE);
braceRange.getStartOffset(), braceRange.getEndOffset(), LAYER, attributes, HighlighterTargetArea.EXACT_RANGE);
rbraceHighlighter.setGreedyToLeft(false);
rbraceHighlighter.setGreedyToRight(false);
registerHighlighter(rbraceHighlighter);
@@ -0,0 +1,3 @@
class Foo <pair>{<caret>
int field;
<pair>}
@@ -0,0 +1,3 @@
class Foo <pair>{
int field;
<pair>}<caret>
@@ -0,0 +1,3 @@
class Foo <caret>{
int field;
<pair>}
@@ -0,0 +1,3 @@
class Foo <pair>{
int field;
<caret>}
@@ -0,0 +1,5 @@
class Foo {
void foo() {
call(<pair>{<caret>});
}
}
@@ -0,0 +1,5 @@
class Foo {
void foo() {
call<caret>({}<pair>);
}
}
@@ -0,0 +1,5 @@
class Foo {
void foo() {
call(<caret>{<pair>});
}
}
@@ -0,0 +1,3 @@
class Foo {
<caret>int field;
}
@@ -0,0 +1,61 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInsight.highlighting;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.markup.RangeHighlighter;
import com.intellij.testFramework.FileBasedTestCaseHelper;
import com.intellij.testFramework.LightPlatformCodeInsightTestCase;
import com.intellij.testFramework.TestDataPath;
import com.intellij.util.Alarm;
import org.jetbrains.annotations.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.intellij.testFramework.EdtTestUtil.runInEdtAndWait;
@RunWith(com.intellij.testFramework.Parameterized.class)
@TestDataPath("/testData/../../../platform/lang-impl/testData/editor/braceHighlighter/")
public class BraceHighlightingHandlerTest extends LightPlatformCodeInsightTestCase implements FileBasedTestCaseHelper {
private static final String PAIR_MARKER = "<pair>";
@Test
public void testAction() {
runInEdtAndWait(() -> {
configureByFile(myFileSuffix);
Editor editor = getEditor();
final Document document = editor.getDocument();
int second = document.getText().indexOf(PAIR_MARKER);
if (second >= 0) {
WriteCommandAction.runWriteCommandAction(null, () -> document.replaceString(second, second + PAIR_MARKER.length(), ""));
}
int first;
int firstBraceCandidate = document.getText().indexOf(PAIR_MARKER);
if (firstBraceCandidate >= 0) {
WriteCommandAction.runWriteCommandAction(null, () -> document.replaceString(firstBraceCandidate, firstBraceCandidate + PAIR_MARKER.length(), ""));
first = firstBraceCandidate;
} else {
first = editor.getCaretModel().getOffset();
}
new BraceHighlightingHandler(getProject(), (EditorEx)editor, new Alarm(), getFile()).updateBraces();
RangeHighlighter[] highlighters = editor.getMarkupModel().getAllHighlighters();
int braceHighlighters = 0;
for (RangeHighlighter highlighter : highlighters) {
if (highlighter.getLayer() == BraceHighlightingHandler.LAYER) {
braceHighlighters++;
assertTrue(first == highlighter.getStartOffset() || second == highlighter.getStartOffset());
}
}
assertEquals(second >= 0 ? 2 : 0, braceHighlighters);
});
}
@Nullable
@Override
public String getFileSuffix(String fileName) {
return fileName.contains("-after.") ? null : fileName;
}
}