From 648ebaaaa09d0a14eb778014afda791541567473 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 1 Jun 2011 16:18:28 +0200 Subject: [PATCH] don't be smart, just calculate the common prefix based on lookup strings and insert it (IDEA-63646,IDEA-70503) --- .../normal/SaxParserCommonPrefix.java | 5 ++ .../normal/SaxParserCommonPrefix_after.java | 5 ++ .../completion/NormalCompletionTest.groovy | 6 ++ .../codeInsight/lookup/impl/LookupImpl.java | 76 +++++++------------ .../layout/commonPrefixIdea63531_after.xml | 2 +- .../android/dom/AndroidLayoutDomTest.java | 4 +- 6 files changed, 48 insertions(+), 50 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/SaxParserCommonPrefix.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/SaxParserCommonPrefix_after.java diff --git a/java/java-tests/testData/codeInsight/completion/normal/SaxParserCommonPrefix.java b/java/java-tests/testData/codeInsight/completion/normal/SaxParserCommonPrefix.java new file mode 100644 index 000000000000..89ccb4dd88b3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/SaxParserCommonPrefix.java @@ -0,0 +1,5 @@ +class Bar { + { + SaxP + } +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/SaxParserCommonPrefix_after.java b/java/java-tests/testData/codeInsight/completion/normal/SaxParserCommonPrefix_after.java new file mode 100644 index 000000000000..c48238c338f1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/SaxParserCommonPrefix_after.java @@ -0,0 +1,5 @@ +class Bar { + { + SAXParse + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index fe3996789499..110a74567f77 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -958,6 +958,12 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { public void testStaticInnerExtendingOuter() throws Exception { doTest() } + public void testSaxParserCommonPrefix() throws Exception { + myFixture.addClass("package foo.bar; public class SAXParser {}") + myFixture.addClass("package foo.bar.goo; public class SAXParseException {}") + doTest() + } + public void testNewClassAngleBracket() throws Exception { doTest('<') } public void testNewClassSquareBracket() throws Exception { doTest('[') } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java index 2385d0219070..1940df86aa53 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java @@ -1032,15 +1032,6 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable } } - private static int divideString(String lookupString, PrefixMatcher matcher) { - for (int i = matcher.getPrefix().length(); i <= lookupString.length(); i++) { - if (matcher.prefixMatches(lookupString.substring(0, i))) { - return i; - } - } - return -1; - } - public boolean fillInCommonPrefix(boolean explicitlyInvoked) { if (explicitlyInvoked) { setFocused(true); @@ -1060,37 +1051,39 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable final PrefixMatcher firstItemMatcher = itemMatcher(firstItem); final String oldPrefix = firstItemMatcher.getPrefix(); final String presentPrefix = oldPrefix + myAdditionalPrefix; - final PrefixMatcher matcher = firstItemMatcher.cloneWithPrefix(presentPrefix); - String lookupString = firstItem.getLookupString(); - int div = divideString(lookupString, matcher); - if (div < 0) return false; - - String beforeCaret = lookupString.substring(0, div); - String afterCaret = lookupString.substring(div); - + String commonPrefix = firstItem.getLookupString(); for (int i = 1; i < listModel.getSize(); i++) { LookupElement item = (LookupElement)listModel.getElementAt(i); if (!oldPrefix.equals(itemMatcher(item).getPrefix())) return false; - lookupString = item.getLookupString(); - div = divideString(lookupString, itemMatcher(item).cloneWithPrefix(presentPrefix)); - if (div < 0) return false; - - String _afterCaret = lookupString.substring(div); - if (beforeCaret != null) { - if (div != beforeCaret.length() || !lookupString.startsWith(beforeCaret)) { - beforeCaret = null; - } + final String lookupString = item.getLookupString(); + final int length = Math.min(commonPrefix.length(), lookupString.length()); + if (length < commonPrefix.length()) { + commonPrefix = commonPrefix.substring(0, length); } - while (afterCaret.length() > 0) { - if (_afterCaret.startsWith(afterCaret)) { + for (int j = 0; j < length; j++) { + if (commonPrefix.charAt(j) != lookupString.charAt(j)) { + commonPrefix = lookupString.substring(0, j); break; } - afterCaret = afterCaret.substring(0, afterCaret.length() - 1); } - if (afterCaret.length() == 0) return false; + + if (commonPrefix.length() == 0 || commonPrefix.length() < presentPrefix.length()) { + return false; + } + } + + if (commonPrefix.equals(presentPrefix)) { + return false; + } + + for (int i = 0; i < listModel.getSize(); i++) { + LookupElement item = (LookupElement)listModel.getElementAt(i); + if (!itemMatcher(item).cloneWithPrefix(commonPrefix).prefixMatches(item)) { + return false; + } } if (myAdditionalPrefix.length() == 0 && myInitialPrefix == null && !explicitlyInvoked) { @@ -1100,31 +1093,21 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable myInitialPrefix = null; } - final String finalBeforeCaret = beforeCaret; - final String finalAfterCaret = afterCaret; + final String finalCommonPrefix = commonPrefix; Runnable runnable = new Runnable() { public void run() { - doInsertCommonPrefix(presentPrefix, finalBeforeCaret, finalAfterCaret); + doInsertCommonPrefix(presentPrefix, finalCommonPrefix); } }; performGuardedChange(runnable); return true; } - private void doInsertCommonPrefix(String presentPrefix, String beforeCaret, String afterCaret) { + private void doInsertCommonPrefix(String presentPrefix, String newPrefix) { EditorModificationUtil.deleteSelectedText(myEditor); int offset = myEditor.getCaretModel().getOffset(); - if (beforeCaret != null) { // correct case, expand camel-humps - final int start = offset - presentPrefix.length(); - myAdditionalPrefix = ""; - myEditor.getDocument().replaceString(start, offset, beforeCaret); - presentPrefix = beforeCaret; - } - - offset = myEditor.getCaretModel().getOffset(); - myEditor.getDocument().insertString(offset, afterCaret); - - final String newPrefix = presentPrefix + afterCaret; + final int start = offset - presentPrefix.length(); + myEditor.getDocument().replaceString(start, offset, newPrefix); Map newItems = myModel.retainMatchingItems(newPrefix, this); myMatchers.clear(); @@ -1132,8 +1115,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable myAdditionalPrefix = ""; - offset += afterCaret.length(); - myEditor.getCaretModel().moveToOffset(offset); + myEditor.getCaretModel().moveToOffset(start + newPrefix.length()); refreshUi(); } diff --git a/plugins/android/testData/dom/layout/commonPrefixIdea63531_after.xml b/plugins/android/testData/dom/layout/commonPrefixIdea63531_after.xml index bba0b9ce06d7..3d464ae0a3f5 100644 --- a/plugins/android/testData/dom/layout/commonPrefixIdea63531_after.xml +++ b/plugins/android/testData/dom/layout/commonPrefixIdea63531_after.xml @@ -1,5 +1,5 @@ - + diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java index 3ae359731c6b..2dc52e01bf13 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java @@ -53,9 +53,9 @@ public class AndroidLayoutDomTest extends AndroidDomTest { toTestCompletion("an5.xml", "an5_after.xml"); } - /*public void testCommonPrefixIdea63531() throws Throwable { + public void testCommonPrefixIdea63531() throws Throwable { toTestCompletion("commonPrefixIdea63531.xml", "commonPrefixIdea63531_after.xml"); - }*/ + } public void testHighlighting() throws Throwable { doTestHighlighting("hl.xml");