From ef7909b5049e7478e64264bd76369b6f4a6a832f Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Fri, 17 Jul 2015 23:54:02 +0200 Subject: [PATCH] - IDEA-96179 Replace with a camel case string and Preserve Case on converts the string to lower case - IDEA-131854 Whole Word search matches partial occurrences --- .../com/intellij/find/FindManagerTest.java | 31 +++++++++++++ .../intellij/find/impl/FindManagerImpl.java | 43 +++++++++++++++---- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java index 4cf9e14247f8..5d2a68600e48 100644 --- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java @@ -590,6 +590,37 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { FindManagerTestUtils.runFindInCommentsAndLiterals(myFindManager, findModel, text); } + public void testReplacePreserveCase() { + configureByText(FileTypes.PLAIN_TEXT, "Bar bar BAR"); + FindModel model = new FindModel(); + model.setStringToFind("bar"); + model.setStringToReplace("foo"); + model.setPromptOnReplace(false); + model.setPreserveCase(true); + + FindUtil.replace(myProject, myEditor, 0, model); + assertEquals("Foo foo FOO", myEditor.getDocument().getText()); + + configureByText(FileTypes.PLAIN_TEXT, "Bar bar"); + + model.setStringToFind("bar"); + model.setStringToReplace("fooBar"); + + FindUtil.replace(myProject, myEditor, 0, model); + assertEquals("FooBar fooBar", myEditor.getDocument().getText()); + } + + public void testFindWholeWords() { + configureByText(FileTypes.PLAIN_TEXT, "-- -- ---"); + FindModel model = new FindModel(); + model.setStringToFind("--"); + model.setWholeWordsOnly(true); + + List usages = FindUtil.findAll(myProject, myEditor, model); + assertNotNull(usages); + assertEquals(2, usages.size()); + } + public void testFindInCurrentFileOutsideProject() throws Exception { final TempDirTestFixture tempDirFixture = new TempDirTestFixtureImpl(); tempDirFixture.setUp(); diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java index de950796c0cf..4cb6f1a24dfd 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java @@ -396,14 +396,32 @@ public class FindManagerImpl extends FindManager { } private static boolean isWholeWord(CharSequence text, int startOffset, int endOffset) { - boolean isWordStart = startOffset == 0 || - !Character.isJavaIdentifierPart(text.charAt(startOffset - 1)) || - !Character.isJavaIdentifierPart(text.charAt(startOffset)) || - startOffset > 1 && text.charAt(startOffset - 2) == '\\'; + boolean isWordStart; - boolean isWordEnd = endOffset == text.length() || - !Character.isJavaIdentifierPart(text.charAt(endOffset)) || - endOffset > 0 && !Character.isJavaIdentifierPart(text.charAt(endOffset - 1)); + if (startOffset != 0) { + boolean previousCharacterIsIdentifier = Character.isJavaIdentifierPart(text.charAt(startOffset - 1)) && + (startOffset <= 1 || text.charAt(startOffset - 2) != '\\'); + boolean previousCharacterIsWhitespace = Character.isWhitespace(text.charAt(startOffset - 1)); + + boolean firstCharacterIsIdentifier = Character.isJavaIdentifierPart(text.charAt(startOffset)); + isWordStart = !firstCharacterIsIdentifier && (previousCharacterIsIdentifier || previousCharacterIsWhitespace) || + firstCharacterIsIdentifier && !previousCharacterIsIdentifier; + } else { + isWordStart = true; + } + + boolean isWordEnd; + + if (endOffset != text.length()) { + boolean nextCharacterIsIdentifier = Character.isJavaIdentifierPart(text.charAt(endOffset)); + boolean nextCharacterIsWhitespace = Character.isWhitespace(text.charAt(endOffset)); + boolean lastSearchedCharacterIsIdentifier = endOffset > 0 && Character.isJavaIdentifierPart(text.charAt(endOffset - 1)); + + isWordEnd = lastSearchedCharacterIsIdentifier && !nextCharacterIsIdentifier || + !lastSearchedCharacterIsIdentifier && (nextCharacterIsIdentifier || nextCharacterIsWhitespace); + } else { + isWordEnd = true; + } return isWordStart && isWordEnd; } @@ -835,6 +853,7 @@ public class FindManagerImpl extends FindManager { else { buffer.append(Character.toLowerCase(toReplace.charAt(0))); } + if (toReplace.length() == 1) return buffer.toString(); if (foundString.length() == 1) { @@ -842,6 +861,12 @@ public class FindManagerImpl extends FindManager { return buffer.toString(); } + boolean isReplacementLowercase = true; + for (int i = 0; i < toReplace.length(); i++) { + isReplacementLowercase = Character.isLowerCase(toReplace.charAt(i)); + if (!isReplacementLowercase) break; + } + boolean isTailUpper = true; boolean isTailLower = true; for (int i = 1; i < foundString.length(); i++) { @@ -850,10 +875,10 @@ public class FindManagerImpl extends FindManager { if (!isTailUpper && !isTailLower) break; } - if (isTailUpper) { + if (isTailUpper && isReplacementLowercase) { buffer.append(StringUtil.toUpperCase(toReplace.substring(1))); } - else if (isTailLower) { + else if (isTailLower && isReplacementLowercase) { buffer.append(toReplace.substring(1).toLowerCase()); } else {