diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/StructuralSearchTypedHandler.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/StructuralSearchTypedHandler.java index e0aab11eea0e..689c1f4343af 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/StructuralSearchTypedHandler.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/StructuralSearchTypedHandler.java @@ -84,23 +84,28 @@ public class StructuralSearchTypedHandler extends TypedHandlerDelegate { final Caret caret = caretModel.getCurrentCaret(); final LogicalPosition position = caret.getLogicalPosition(); final int lineStart = document.getLineStartOffset(position.line); + final int lineEnd = document.getLineEndOffset(position.line); final CharSequence text = document.getCharsSequence(); - final int index = lineStart + position.column; - if (index < text.length() && text.charAt(index) == '$') { - caret.setSelection(index, index + 1); + final int offset = lineStart + position.column; + final boolean nextIsDollar = offset < text.length() && text.charAt(offset) == '$'; + if (hasOddDollar(text, lineStart, offset) && nextIsDollar) { + caret.setSelection(offset, offset + 1); } - final CharSequence line = text.subSequence(lineStart, lineStart + position.column); - boolean $ = false; - for (int i = 0, max = line.length(); i < max; i++) { - if (line.charAt(i) == '$') { - $ = !$; - } - } - if (!$) { - document.insertString(lineStart + position.column, "$"); + else if (!hasOddDollar(text, lineStart, lineEnd)) { + document.insertString(offset, "$"); } } } return Result.CONTINUE; } + + static boolean hasOddDollar(CharSequence text, int start, int end) { + boolean $ = false; + for (int i = start; i < end; i++) { + if (text.charAt(i) == '$') { + $ = !$; + } + } + return $; + } } diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/plugin/ui/StructuralSearchTypedHandlerTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/plugin/ui/StructuralSearchTypedHandlerTest.java index c4c48dee2b9e..dd7e51e994cd 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/plugin/ui/StructuralSearchTypedHandlerTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/plugin/ui/StructuralSearchTypedHandlerTest.java @@ -33,6 +33,18 @@ public class StructuralSearchTypedHandlerTest extends BasePlatformTestCase { "$x$ y$$z $abc$"); } + public void testOneDollar() { + doTest("asdf$asdf", "asdf$$asdf"); + } + + public void testOddDollar1() { + doTest("ba$", "$ba$"); + } + + public void testOddDollar2() { + doTest("$ietske", "$ietske$"); + } + private void doTest(@NotNull String before, @NotNull String after) { myFixture.configureByText(FileTypes.PLAIN_TEXT, before); final Editor editor = myFixture.getEditor();