mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
highlight brace after even if there's a non-whitespace (WEB-35454)
This commit is contained in:
+12
-17
@@ -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;
|
||||
}
|
||||
+61
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user