From afee1a227781605d9126d57eb34153bafbf3a61e Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Jun 2012 14:42:41 +0200 Subject: [PATCH] IDEA-87104 Code completion should remember and prefer chosen variants --- .../JavaCompletionStatistician.java | 24 ++++------------- .../intellij/psi/util/TypeConversionUtil.java | 4 +-- ...StatsForDifferentQualifiersJComponent.java | 9 +++++++ ...SameStatsForDifferentQualifiersJLabel.java | 9 +++++++ .../NormalCompletionOrderingTest.groovy | 27 +++++++++++++++++++ .../psi/statistics/JavaStatisticsManager.java | 4 +-- 6 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/SameStatsForDifferentQualifiersJComponent.java create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/SameStatsForDifferentQualifiersJLabel.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java index 9d0b5d02e854..2d0ba383c576 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java @@ -52,28 +52,14 @@ public class JavaCompletionStatistician extends CompletionStatistician{ if (item == null) return null; PsiType qualifierType = JavaCompletionUtil.getQualifierType(item); - if (qualifierType == null) { - if (infos != null && infos.length > 0) { - qualifierType = infos[0].getDefaultType(); - } - } - final CompletionType type = location.getCompletionType(); if (o instanceof PsiMember) { - final boolean isClass = o instanceof PsiClass; - if (qualifierType != null) { - String context; - if (isClass) { - context = JavaStatisticsManager.getAfterNewKey(qualifierType); - } else { - context = JavaStatisticsManager.getMemberUseKey1(qualifierType); - } - return new StatisticsInfo(context, JavaStatisticsManager.getMemberUseKey2((PsiMember)o)); - } - - if (isClass) { - return JavaStatisticsManager.createInfo(qualifierType, (PsiMember)o); + String key2 = JavaStatisticsManager.getMemberUseKey2((PsiMember)o); + if (o instanceof PsiClass) { + PsiType expectedType = infos != null && infos.length > 0 ? infos[0].getDefaultType() : null; + return new StatisticsInfo(JavaStatisticsManager.getAfterNewKey(expectedType), key2); } + return new StatisticsInfo(JavaStatisticsManager.getMemberUseKey2(((PsiMember)o).getContainingClass()), key2); } if (qualifierType != null) return StatisticsInfo.EMPTY; diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index 9a012978da9b..50467b80a89e 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -1186,11 +1186,11 @@ public class TypeConversionUtil { return PsiType.getJavaLangObject(typeParameter.getManager(), typeParameter.getResolveScope()); } - public static PsiType erasure(PsiType type) { + public static PsiType erasure(@Nullable PsiType type) { return erasure(type, PsiSubstitutor.EMPTY); } - public static PsiType erasure(final PsiType type, final PsiSubstitutor beforeSubstitutor) { + public static PsiType erasure(@Nullable final PsiType type, final PsiSubstitutor beforeSubstitutor) { if (type == null) return null; return type.accept(new PsiTypeVisitor() { @Override diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/SameStatsForDifferentQualifiersJComponent.java b/java/java-tests/testData/codeInsight/completion/normalSorting/SameStatsForDifferentQualifiersJComponent.java new file mode 100644 index 000000000000..4f4dfa789336 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/SameStatsForDifferentQualifiersJComponent.java @@ -0,0 +1,9 @@ +import javax.swing.*; + +public class MyFirstTestClassFoo { + + void foo(JComponent c) { + c.getComx + } + +} diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/SameStatsForDifferentQualifiersJLabel.java b/java/java-tests/testData/codeInsight/completion/normalSorting/SameStatsForDifferentQualifiersJLabel.java new file mode 100644 index 000000000000..defdba564584 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/SameStatsForDifferentQualifiersJLabel.java @@ -0,0 +1,9 @@ +import javax.swing.*; + +public class MyFirstTestClassFoo { + + void foo(JLabel l) { + l.getCompox + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy index 8894e780230a..f7bd4bab66a5 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -13,6 +13,7 @@ import com.intellij.codeInsight.lookup.impl.LookupImpl import com.intellij.ide.ui.UISettings import com.intellij.psi.PsiClass import com.intellij.psi.PsiMethod +import com.intellij.openapi.fileEditor.FileDocumentManager public class NormalCompletionOrderingTest extends CompletionSortingTestCase { private static final String BASE_PATH = "/codeInsight/completion/normalSorting"; @@ -148,6 +149,32 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { assertPreferredItems(0, "FooBee", "FooBar"); } + public void testSameStatsForDifferentQualifiers() throws Throwable { + invokeCompletion("SameStatsForDifferentQualifiersJLabel.java"); + assertPreferredItems(0, "getComponent"); + incUseCount(getLookup(), myFixture.lookupElementStrings.indexOf('getComponents')); + FileDocumentManager.instance.saveAllDocuments() + + invokeCompletion("SameStatsForDifferentQualifiersJLabel.java"); + assertPreferredItems(1, "getComponent", "getComponents"); + + invokeCompletion("SameStatsForDifferentQualifiersJComponent.java"); + assertPreferredItems(1, "getComponent", "getComponents"); + } + + public void testSameStatsForDifferentQualifiers2() throws Throwable { + invokeCompletion("SameStatsForDifferentQualifiersJComponent.java"); + assertPreferredItems(0, "getComponent"); + incUseCount(getLookup(), myFixture.lookupElementStrings.indexOf('getComponents')); + FileDocumentManager.instance.saveAllDocuments() + + invokeCompletion("SameStatsForDifferentQualifiersJComponent.java"); + assertPreferredItems(1, "getComponent", "getComponents"); + + invokeCompletion("SameStatsForDifferentQualifiersJLabel.java"); + assertPreferredItems(1, "getComponent", "getComponents"); + } + public void testDispreferFinalize() throws Throwable { checkPreferredItems(0, "final", "finalize"); } diff --git a/java/openapi/src/com/intellij/psi/statistics/JavaStatisticsManager.java b/java/openapi/src/com/intellij/psi/statistics/JavaStatisticsManager.java index ab04673cf36e..8d855d34c265 100644 --- a/java/openapi/src/com/intellij/psi/statistics/JavaStatisticsManager.java +++ b/java/openapi/src/com/intellij/psi/statistics/JavaStatisticsManager.java @@ -95,7 +95,7 @@ public abstract class JavaStatisticsManager { } @NonNls @NotNull - public static String getMemberUseKey1(PsiType qualifierType) { + public static String getMemberUseKey1(@Nullable PsiType qualifierType) { qualifierType = TypeConversionUtil.erasure(qualifierType); return "member#" + (qualifierType == null ? "" : qualifierType.getCanonicalText()); } @@ -140,7 +140,7 @@ public abstract class JavaStatisticsManager { return ArrayUtil.toStringArray(list); } - public static String getAfterNewKey(PsiType expectedType) { + public static String getAfterNewKey(@Nullable PsiType expectedType) { return getMemberUseKey1(expectedType) + "###smartAfterNew"; }