don't be smart, just calculate the common prefix based on lookup strings and insert it (IDEA-63646,IDEA-70503)

This commit is contained in:
peter
2011-06-01 16:20:04 +02:00
parent 045b5445b2
commit 648ebaaaa0
6 changed files with 48 additions and 50 deletions
@@ -0,0 +1,5 @@
class Bar {
{
SaxP<caret>
}
}
@@ -0,0 +1,5 @@
class Bar {
{
SAXParse<caret>
}
}
@@ -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('[') }
@@ -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<LookupElement, PrefixMatcher> 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();
}
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:layout_<caret>
<ImageView android:lay<caret>
</LinearLayout>
@@ -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");