diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreselectLastChosen.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreselectLastChosen.java new file mode 100644 index 000000000000..1ba055805277 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreselectLastChosen.java @@ -0,0 +1,7 @@ +import java.util.Set; + +public class Foo { + void foo(Set set) { + set.adx + } +} \ No newline at end of file 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 22e5a39ef44e..ed394a8e9cda 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -453,4 +453,14 @@ import java.lang.annotation.Target; assert lookup.items[1].object instanceof PsiMethod } + public void testPreselectLastChosen() { + checkPreferredItems(0, 'add', 'addAll') + for (i in 0..10) { + incUseCount(lookup, 1) + } + assertPreferredItems 1, 'add', 'addAll' + incUseCount(lookup, 0) + assertPreferredItems 0, 'add', 'addAll' + } + } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/StatisticsWeigher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/StatisticsWeigher.java index fe45af2e81e8..3958e67fb744 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/StatisticsWeigher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/StatisticsWeigher.java @@ -51,15 +51,17 @@ public class StatisticsWeigher extends CompletionWeigher { @Override public Integer weigh(@NotNull LookupElement item) { - final StatisticsInfo info = getBaseStatisticsInfo(item, myLocation); - if (info == StatisticsInfo.EMPTY) { + final StatisticsInfo baseInfo = getBaseStatisticsInfo(item, myLocation); + if (baseInfo == StatisticsInfo.EMPTY) { return 0; } - int max = 0; - for (StatisticsInfo statisticsInfo : composeStatsWithPrefix(info, myLocation.getCompletionParameters().getLookup().itemPattern(item))) { - max = Math.max(max, ourStatManager.getUseCount(statisticsInfo)); + int maxUseCount = 0; + int minRecency = Integer.MAX_VALUE; + for (StatisticsInfo eachInfo : composeStatsWithPrefix(baseInfo, myLocation.getCompletionParameters().getLookup().itemPattern(item))) { + maxUseCount = Math.max(maxUseCount, ourStatManager.getUseCount(eachInfo)); + minRecency = Math.min(minRecency, ourStatManager.getLastUseRecency(eachInfo)); } - return max; + return minRecency == Integer.MAX_VALUE ? maxUseCount : 100 - minRecency; } } diff --git a/platform/platform-api/src/com/intellij/psi/statistics/StatisticsManager.java b/platform/platform-api/src/com/intellij/psi/statistics/StatisticsManager.java index ca0a203f6484..87361ef86aad 100644 --- a/platform/platform-api/src/com/intellij/psi/statistics/StatisticsManager.java +++ b/platform/platform-api/src/com/intellij/psi/statistics/StatisticsManager.java @@ -46,6 +46,7 @@ public abstract class StatisticsManager implements SettingsSavingComponent { } public abstract int getUseCount(@NotNull StatisticsInfo info); + public abstract int getLastUseRecency(@NotNull StatisticsInfo info); public abstract void incUseCount(@NotNull StatisticsInfo info); public int getUseCount(final Key> key, final T element, final Loc location) { diff --git a/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsManagerImpl.java b/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsManagerImpl.java index 16b6967f9e4f..71a3a7933c77 100644 --- a/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsManagerImpl.java @@ -58,6 +58,18 @@ public class StatisticsManagerImpl extends StatisticsManager { } } + @Override + public int getLastUseRecency(@NotNull StatisticsInfo info) { + if (info == StatisticsInfo.EMPTY) return 0; + + String key1 = info.getContext(); + int unitNumber = getUnitNumber(key1); + synchronized (LOCK) { + StatisticsUnit unit = getUnit(unitNumber); + return unit.getRecency(key1, info.getValue()); + } + } + public void incUseCount(@NotNull final StatisticsInfo info) { if (info == StatisticsInfo.EMPTY) return; if (ApplicationManager.getApplication().isUnitTestMode() && !myTestingStatistics) { diff --git a/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsUnit.java b/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsUnit.java index 5099260d1851..635a437946ff 100644 --- a/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsUnit.java +++ b/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsUnit.java @@ -33,6 +33,14 @@ class StatisticsUnit { myNumber = number; } + public int getRecency(String key1, String key2) { + final List list = myDataMap.get(key1); + if (list == null) return Integer.MAX_VALUE; + + int i = list.indexOf(key2); + return i >= 0 ? i : Integer.MAX_VALUE; + } + public int getData(String key1, String key2) { final List list = myDataMap.get(key1); if (list == null) return 0; diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/english.dic b/plugins/spellchecker/src/com/intellij/spellchecker/english.dic index 969921ac609b..5753c8e2deaf 100644 --- a/plugins/spellchecker/src/com/intellij/spellchecker/english.dic +++ b/plugins/spellchecker/src/com/intellij/spellchecker/english.dic @@ -108015,6 +108015,7 @@ receivership receivership's receives receiving +recency recension recension's recent