remember completion method statistics per qualifier type (alas, undoing IDEA-87104)

otherwise methods from base classes get preferred over more relevant ones

example: Object methods like equals/getClass would be preselected when invoking a completion in a just created class, instead of its own methods
This commit is contained in:
peter
2017-01-17 09:24:44 +01:00
parent f85b52691f
commit 9ccfc30d74
5 changed files with 21 additions and 50 deletions
@@ -48,8 +48,6 @@ public class JavaCompletionStatistician extends CompletionStatistician{
LookupItem item = element.as(LookupItem.CLASS_CONDITION_KEY);
if (item == null) return null;
PsiType qualifierType = JavaCompletionUtil.getQualifierType(item);
if (o instanceof PsiMember) {
final ExpectedTypeInfo[] infos = JavaCompletionUtil.EXPECTED_TYPES.getValue(location);
final ExpectedTypeInfo firstInfo = infos != null && infos.length > 0 ? infos[0] : null;
@@ -62,7 +60,9 @@ public class JavaCompletionStatistician extends CompletionStatistician{
PsiClass containingClass = ((PsiMember)o).getContainingClass();
if (containingClass != null) {
String expectedName = firstInfo instanceof ExpectedTypeInfoImpl ? ((ExpectedTypeInfoImpl)firstInfo).getExpectedName() : null;
String contextPrefix = expectedName == null ? "" : "expectedName=" + expectedName + "###";
PsiType qualifierType = JavaCompletionUtil.getQualifierType(item);
String contextPrefix = (qualifierType == null ? "" : JavaStatisticsManager.getMemberUseKey1(qualifierType) + "###") +
(expectedName == null ? "" : "expectedName=" + expectedName + "###");
if (o instanceof PsiMethod) {
String memberValue = JavaStatisticsManager.getMemberUseKey2(RecursionWeigher.findDeepestSuper((PsiMethod)o));
@@ -73,8 +73,6 @@ public class JavaCompletionStatistician extends CompletionStatistician{
}
}
if (qualifierType != null) return StatisticsInfo.EMPTY;
return null;
}
@@ -0,0 +1,8 @@
public class Usage<T extends Usage<T>> {
void foo(T t) {
"".<caret>
}
void someMethod() {}
}
@@ -1,9 +0,0 @@
import javax.swing.*;
public class MyFirstTestClassFoo {
void foo(JComponent c) {
c.getCom<caret>x
}
}
@@ -1,9 +0,0 @@
import javax.swing.*;
public class MyFirstTestClassFoo {
void foo(JLabel l) {
l.getCompo<caret>x
}
}
@@ -23,7 +23,6 @@ import com.intellij.codeInsight.lookup.LookupElementPresentation
import com.intellij.codeInsight.lookup.impl.LookupImpl
import com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor
import com.intellij.ide.ui.UISettings
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiField
import com.intellij.psi.PsiMethod
@@ -172,32 +171,6 @@ class NormalCompletionOrderingTest extends CompletionSortingTestCase {
assertPreferredItems(0, "FooBee", "FooBar")
}
void testSameStatsForDifferentQualifiers() throws Throwable {
invokeCompletion("SameStatsForDifferentQualifiersJLabel.java")
assertPreferredItems(0, "getComponent")
incUseCount(getLookup(), myFixture.lookupElementStrings.indexOf('getComponents'))
FileDocumentManager.instance.saveAllDocuments()
invokeCompletion("SameStatsForDifferentQualifiersJLabel.java")
assertPreferredItems(0, "getComponents", "getComponent")
invokeCompletion("SameStatsForDifferentQualifiersJComponent.java")
assertPreferredItems(0, "getComponents", "getComponent")
}
void testSameStatsForDifferentQualifiers2() throws Throwable {
invokeCompletion("SameStatsForDifferentQualifiersJComponent.java")
assertPreferredItems(0, "getComponent")
incUseCount(getLookup(), myFixture.lookupElementStrings.indexOf('getComponents'))
FileDocumentManager.instance.saveAllDocuments()
invokeCompletion("SameStatsForDifferentQualifiersJComponent.java")
assertPreferredItems(0, "getComponents", "getComponent")
invokeCompletion("SameStatsForDifferentQualifiersJLabel.java")
assertPreferredItems(0, "getComponents", "getComponent")
}
void testDispreferFinalize() throws Throwable {
checkPreferredItems(0, "final", "finalize")
}
@@ -732,4 +705,14 @@ class ContainerUtil extends ContainerUtilRt {
assert LookupElementPresentation.renderElement(myFixture.lookupElements[1]).tailText.contains('pack2')
}
void testMethodStatisticsPerQualifierType() {
checkPreferredItems 0, 'charAt'
myFixture.type('eq\n);\n')
assert myFixture.editor.document.text.contains('equals();\n')
myFixture.type('this.')
myFixture.completeBasic()
assertPreferredItems 0, 'someMethod'
}
}