From 8f24ff6e790c3c8d0c2c3d7f21b32d2bebc23b7b Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 23 Feb 2012 14:07:39 +0100 Subject: [PATCH] prefer null and new to the void methods in expression context --- .../completion/JavaCompletionSorting.java | 41 ++++++++++++++----- ...rdsToVoidMethodsInExpectedTypeContext.java | 11 +++++ .../NormalCompletionOrderingTest.groovy | 4 ++ 3 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/PreferKeywordsToVoidMethodsInExpectedTypeContext.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 0a274ef446d5..c2ce0ef0da3e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java @@ -135,23 +135,40 @@ public class JavaCompletionSorting { private static ExpectedTypeMatching getExpectedTypeMatching(LookupElement item, ExpectedTypeInfo[] expectedInfos) { PsiType itemType = JavaCompletionUtil.getLookupElementType(item); - if (itemType == null) return ExpectedTypeMatching.normal; - for (final ExpectedTypeInfo expectedInfo : expectedInfos) { - final PsiType defaultType = expectedInfo.getDefaultType(); - final PsiType expectedType = expectedInfo.getType(); - if (!expectedType.isValid()) { - return ExpectedTypeMatching.normal; - } + if (itemType != null) { + for (final ExpectedTypeInfo expectedInfo : expectedInfos) { + final PsiType defaultType = expectedInfo.getDefaultType(); + final PsiType expectedType = expectedInfo.getType(); - if (defaultType != expectedType && defaultType.isAssignableFrom(itemType)) { - return ExpectedTypeMatching.ofDefaultType; + if (defaultType != expectedType && defaultType.isAssignableFrom(itemType)) { + return ExpectedTypeMatching.ofDefaultType; + } + if (expectedType.isAssignableFrom(itemType)) { + return ExpectedTypeMatching.expected; + } } - if (expectedType.isAssignableFrom(itemType)) { - return ExpectedTypeMatching.expected; + } + + boolean hasNonVoid = false; + for (ExpectedTypeInfo info : expectedInfos) { + if (!PsiType.VOID.equals(info.getType())) { + hasNonVoid = true; } } + if (hasNonVoid) { + if (item.getObject() instanceof PsiKeyword) { + String keyword = ((PsiKeyword)item.getObject()).getText(); + if (PsiKeyword.NEW.equals(keyword) || PsiKeyword.NULL.equals(keyword)) { + return ExpectedTypeMatching.maybeExpected; + } + } + } + else if (expectedInfos.length > 0) { + return ExpectedTypeMatching.unexpected; + } + return ExpectedTypeMatching.normal; } @@ -391,7 +408,9 @@ public class JavaCompletionSorting { private enum ExpectedTypeMatching { ofDefaultType, expected, + maybeExpected, normal, + unexpected, } private static class PreferAccessible extends LookupElementWeigher { diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferKeywordsToVoidMethodsInExpectedTypeContext.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferKeywordsToVoidMethodsInExpectedTypeContext.java new file mode 100644 index 000000000000..bc89fefeab44 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferKeywordsToVoidMethodsInExpectedTypeContext.java @@ -0,0 +1,11 @@ +class Foo { + java.io.File f; + + { + f = n + } + + java.io.File noo() {} + Object noo2() {} + +} \ 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 43e49fc42e02..cc17fc46d057 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -298,4 +298,8 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { } } + public void testPreferKeywordsToVoidMethodsInExpectedTypeContext() { + checkPreferredItems 0, 'noo', 'new', 'null', 'noo2', 'notify', 'notifyAll' + } + }