mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -0,0 +1,5 @@
|
||||
class Bar {
|
||||
{
|
||||
SaxP<caret>
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
class Bar {
|
||||
{
|
||||
SAXParse<caret>
|
||||
}
|
||||
}
|
||||
+6
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user