java completion: suggest only denotable method return types (IDEA-194462)

This commit is contained in:
peter
2018-07-02 17:09:29 +02:00
parent 8d183dee3a
commit d98f2c7409
3 changed files with 14 additions and 1 deletions
@@ -21,6 +21,7 @@ import com.intellij.codeInsight.lookup.PsiTypeLookupItem;
import com.intellij.patterns.ElementPattern;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiTypesUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.Consumer;
import com.intellij.util.ProcessingContext;
@@ -60,7 +61,7 @@ class MethodReturnTypeProvider extends CompletionProvider<CompletionParameters>
@Nullable
@Override
public PsiType visitType(PsiType type) {
if (!(type instanceof PsiPrimitiveType) && myProcessed.add(type)) {
if (!(type instanceof PsiPrimitiveType) && PsiTypesUtil.isDenotableType(type, position) && myProcessed.add(type)) {
int priority = type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT) ? 1 : 1000 - myProcessed.size();
consumer.consume(PrioritizedLookupElement.withPriority(PsiTypeLookupItem.createLookupItem(type, position), priority));
}
@@ -0,0 +1,7 @@
public class Main {
public <caret>x main() {
return new Object(){};
}
}
@@ -1170,6 +1170,11 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
myFixture.assertPreferredCompletionItems(0, "Serializable", "CharSequence", "Object");
}
public void testSuggestMethodReturnTypeAnonymous() {
configureByTestName();
assertOrderedEquals(myFixture.getLookupElementStrings(), "Object");
}
public void testSuggestCastReturnTypeByCalledMethod() { doTest(); }
public void testOnlyInterfacesInImplements() { doTest(); }