From 80548595d38783fb1d879c2c8f13a7b04abfdef3 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 10 Apr 2017 15:54:38 +0300 Subject: [PATCH] PreferMostUsedWeigher is moved down --- .../completion/JavaCompletionSorting.java | 13 ++++--- .../completion/PreferMostUsedWeigher.java | 10 +++--- .../testExpectedByTypeAreFirst/Foo.java | 35 +++++++++++++++++++ ...CompilerReferenceDataInCompletionTest.java | 7 ++++ 4 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/compiler/completionOrdering/testExpectedByTypeAreFirst/Foo.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java index e84265cdbb6b..f0c07886e73d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java @@ -72,18 +72,21 @@ public class JavaCompletionSorting { sorter = sorter.weighAfter("priority", new PreferDefaultTypeWeigher(expectedTypes, parameters)); } + final PreferMostUsedWeigher preferMostUsedWeigher = PreferMostUsedWeigher.create(position); List afterStats = ContainerUtil.newArrayList(); afterStats.add(new PreferByKindWeigher(type, position, expectedTypes)); - final PreferMostUsedWeigher preferMostUsedWeigher = PreferMostUsedWeigher.create(position); - if (preferMostUsedWeigher != null) { - afterStats.add(preferMostUsedWeigher); - } if (!smart) { - ContainerUtil.addIfNotNull(afterStats, preferStatics(position, expectedTypes)); + if (preferMostUsedWeigher == null) { + ContainerUtil.addIfNotNull(afterStats, preferStatics(position, expectedTypes)); + } if (!afterNew) { afterStats.add(new PreferExpected(false, expectedTypes, position)); } } + if (preferMostUsedWeigher != null) { + afterStats.add(preferMostUsedWeigher); + ContainerUtil.addIfNotNull(afterStats, preferStatics(position, expectedTypes)); + } ContainerUtil.addIfNotNull(afterStats, recursion(parameters, expectedTypes)); afterStats.add(new PreferSimilarlyEnding(expectedTypes)); if (ContainerUtil.or(expectedTypes, info -> !info.getType().equals(PsiType.VOID))) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferMostUsedWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferMostUsedWeigher.java index 1c4949539d4e..eb70ab28f935 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferMostUsedWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferMostUsedWeigher.java @@ -60,7 +60,7 @@ class PreferMostUsedWeigher extends LookupElementWeigher { if (OBJECT_METHOD_PATTERN.accepts(psi)) { return null; } - if (looksLikeHelperMethod(psi)) { + if (looksLikeHelperMethodOrConst(psi)) { return null; } final Integer occurrenceCount = myCompilerReferenceService.getCompileTimeOccurrenceCount(psi, myConstructorSuggestion); @@ -69,7 +69,7 @@ class PreferMostUsedWeigher extends LookupElementWeigher { } //Objects.requireNonNull is an example - private static boolean looksLikeHelperMethod(@NotNull PsiElement element) { + private static boolean looksLikeHelperMethodOrConst(@NotNull PsiElement element) { if (!(element instanceof PsiMethod)) return false; PsiMethod method = (PsiMethod)element; if (method.isConstructor()) return false; @@ -78,11 +78,11 @@ class PreferMostUsedWeigher extends LookupElementWeigher { if (parameters.length == 0) return false; for (PsiParameter parameter : parameters) { PsiType paramType = parameter.getType(); - if (!isRawDeepTypeEqualToObject(paramType)) { - return false; + if (isRawDeepTypeEqualToObject(paramType)) { + return true; } } - return true; + return false; } private static boolean isRawDeepTypeEqualToObject(@Nullable PsiType type) { diff --git a/java/java-tests/testData/compiler/completionOrdering/testExpectedByTypeAreFirst/Foo.java b/java/java-tests/testData/compiler/completionOrdering/testExpectedByTypeAreFirst/Foo.java new file mode 100644 index 000000000000..269aa3ca9741 --- /dev/null +++ b/java/java-tests/testData/compiler/completionOrdering/testExpectedByTypeAreFirst/Foo.java @@ -0,0 +1,35 @@ +class Foo { + public String someMethod1() { + return null; + } + + public String someMethod2(String s) { + return null; + } + + public Runnable someMethod3() { + return null; + } + + void m() { + someMethod1(); + someMethod1(); + someMethod1(); + + someMethod2(""); + someMethod2(""); + someMethod2(""); + someMethod2(""); + + someMethod3(); + someMethod3(); + someMethod3(); + someMethod3(); + someMethod3(); + } + + void mm(Foo f) { + + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/compiler/CompilerReferenceDataInCompletionTest.java b/java/java-tests/testSrc/com/intellij/compiler/CompilerReferenceDataInCompletionTest.java index 21259d0f7928..3df72b2fe78d 100644 --- a/java/java-tests/testSrc/com/intellij/compiler/CompilerReferenceDataInCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/compiler/CompilerReferenceDataInCompletionTest.java @@ -76,6 +76,13 @@ public class CompilerReferenceDataInCompletionTest extends CompilerReferencesTes doTestStaticMemberCompletionOrdering(new String[] {"Foo.java"}, "someMethod2(1)", "someMethod1(0)", "m(0)", "nonNull(1)"); } + public void testExpectedByTypeAreFirst() { + doTestCompletion(new String[] {"Foo.java"}, "String s = ", new String[] {"someMethod2(1)", "someMethod1(0)", "someMethod3(0)", "m(0)", "mm(1)"}, m -> { + PsiClass aClass = m.getContainingClass(); + return aClass != null && "Foo".equals(aClass.getName()); + }); + } + private void doTestConstructorCompletionOrdering(@NotNull String[] files, @NotNull String phraseToComplete, String... expectedOrder) {