From cc4b9403b675efdaa2a97847c5da6b097aaa9d90 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Thu, 26 Mar 2015 15:11:28 +0300 Subject: [PATCH] IDEA-137725 Move by word (option-arrow key) is not working in find dialog if regexp option is enabled --- .../openapi/editor/actions/EditorActionUtil.java | 13 ++++++++++++- .../openapi/editor/actions/NextPrevWordTest.java | 10 ++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java index 0e561c81b526..b08b0c4b41ba 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java @@ -39,11 +39,13 @@ import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.editor.impl.EditorImpl; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.tree.IElementType; import com.intellij.util.EditorPopupHandler; import org.jetbrains.annotations.NotNull; @@ -252,11 +254,20 @@ public class EditorActionUtil { return isWordEnd(chars, offset, isCamel) || !isWordStart(chars, offset, isCamel) && isLexemeBoundary(editor, offset); } + /** + * Finds out whether there's a boundary between two lexemes of different type at given offset. + */ public static boolean isLexemeBoundary(@NotNull Editor editor, int offset) { if (!(editor instanceof EditorEx) || offset <= 0 || offset >= editor.getDocument().getTextLength()) return false; EditorHighlighter highlighter = ((EditorEx)editor).getHighlighter(); HighlighterIterator it = highlighter.createIterator(offset); - return it.getStart() == offset; + if (it.getStart() != offset) { + return false; + } + IElementType rightToken = it.getTokenType(); + it.retreat(); + IElementType leftToken = it.getTokenType(); + return !Comparing.equal(leftToken, rightToken); } public static boolean isWordStart(@NotNull CharSequence text, int offset, boolean isCamel) { diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/NextPrevWordTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/NextPrevWordTest.java index c9cea52f0cc0..89ffe687d2d2 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/NextPrevWordTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/actions/NextPrevWordTest.java @@ -17,6 +17,8 @@ package com.intellij.openapi.editor.actions; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.FoldRegion; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.ex.FileTypeManagerEx; import com.intellij.testFramework.EditorTestUtil; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; @@ -94,4 +96,12 @@ public class NextPrevWordTest extends LightPlatformCodeInsightFixtureTestCase { assertEquals(1, foldRegions.length); assertFalse(foldRegions[0].isExpanded()); } + + public void testRegexpCharsAreNotTreatedAsSeparateWords() { + FileType regExpFileType = FileTypeManagerEx.getInstanceEx().findFileTypeByName("RegExp"); + assertNotNull(regExpFileType); + myFixture.configureByText(regExpFileType, "abc"); + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_NEXT_WORD); + myFixture.checkResult("abc"); + } }