prefer local variables over NULL_PSI_ELEMENT in smart completion

This commit is contained in:
peter
2017-06-07 13:35:28 +02:00
parent d937be6504
commit b8588d2006
4 changed files with 31 additions and 9 deletions
@@ -75,12 +75,14 @@ public class JavaCompletionSorting {
sorter = ((CompletionSorterImpl)sorter).withClassifier("liftShorterClasses", true, new LiftShorterClasses(position));
}
if (smart) {
sorter = sorter.weighAfter("priority", new PreferDefaultTypeWeigher(expectedTypes, parameters));
sorter = sorter.weighAfter("priority", new PreferDefaultTypeWeigher(expectedTypes, parameters, false));
}
List<LookupElementWeigher> afterStats = ContainerUtil.newArrayList();
afterStats.add(new PreferByKindWeigher(type, position, expectedTypes));
if (!smart) {
if (smart) {
afterStats.add(new PreferDefaultTypeWeigher(expectedTypes, parameters, true));
} else {
if (preferMostUsedWeigher == null) {
ContainerUtil.addIfNotNull(afterStats, preferStatics(position, expectedTypes));
}
@@ -298,10 +300,11 @@ public class JavaCompletionSorting {
private final PsiTypeParameter myTypeParameter;
private final ExpectedTypeInfo[] myExpectedTypes;
private final CompletionParameters myParameters;
private final boolean myPreferExact;
private final CompletionLocation myLocation;
public PreferDefaultTypeWeigher(@NotNull ExpectedTypeInfo[] expectedTypes, CompletionParameters parameters) {
super("defaultType");
PreferDefaultTypeWeigher(@NotNull ExpectedTypeInfo[] expectedTypes, CompletionParameters parameters, boolean preferExact) {
super("defaultType" + (preferExact ? "Exact" : ""));
myExpectedTypes = ContainerUtil.map2Array(expectedTypes, ExpectedTypeInfo.class, info -> {
PsiType type = removeClassWildcard(info.getType());
PsiType defaultType = removeClassWildcard(info.getDefaultType());
@@ -311,6 +314,7 @@ public class JavaCompletionSorting {
return new ExpectedTypeInfoImpl(type, info.getKind(), defaultType, info.getTailType(), null, ExpectedTypeInfoImpl.NULL);
});
myParameters = parameters;
myPreferExact = preferExact;
final Pair<PsiTypeParameterListOwner,Integer> pair = TypeArgumentCompletionProvider.getTypeParameterInfo(parameters.getPosition());
myTypeParameter = pair == null ? null : pair.first.getTypeParameters()[pair.second.intValue()];
@@ -333,7 +337,7 @@ public class JavaCompletionSorting {
if (returnsUnboundType(item)) return MyResult.normal;
PsiType itemType = JavaCompletionUtil.getLookupElementType(item);
if (isExactlyExpected(item, itemType)) {
if ((myPreferExact || object instanceof PsiClass) && isExactlyExpected(item, itemType)) {
return AbstractExpectedTypeSkipper.skips(item, myLocation) ? MyResult.expectedNoSelect : MyResult.exactlyExpected;
}
@@ -344,7 +348,7 @@ public class JavaCompletionSorting {
final PsiType expectedType = expectedInfo.getType();
if (defaultType != expectedType) {
if (defaultType.equals(itemType)) {
if (myPreferExact && defaultType.equals(itemType)) {
return MyResult.exactlyDefault;
}
@@ -0,0 +1,14 @@
class Usage {
void foo(PsiMethod method) {
PsiUtil.ensureValid(<caret>);
}
}
class PsiUtil {
static final PsiElement NULL_PSI_ELEMENT;
static void ensureValid(PsiElement e) {}
}
interface PsiElement {}
interface PsiMethod extends PsiElement {}
@@ -324,7 +324,7 @@ class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase {
}
void testPreferLocalOverThis() {
checkPreferredItems 0, 'value', 'hashCode', 'this'
checkPreferredItems 0, 'value', 'this', 'hashCode'
}
void testGetLogger() {
@@ -340,7 +340,7 @@ class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase {
}
void testPreferLocalWildcardClassOverObject() {
checkPreferredItems 0, 'type', 'forName', 'forName', 'Object.class'
checkPreferredItems 0, 'type', 'Object.class', 'forName', 'forName'
}
void testPreferStringsInStringConcatenation() {
@@ -369,6 +369,10 @@ class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase {
assert LookupElementPresentation.renderElement(items[1]).itemText == 'BiMap.builder'
}
void testPreferExpectedLocalOverExactlyDefaultMember() {
checkPreferredItems 0, 'method', 'PsiUtil.NULL_PSI_ELEMENT'
}
@Override
protected String getBasePath() {
return JavaTestUtil.getRelativeJavaTestDataPath() + BASE_PATH
@@ -833,7 +833,7 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
}
public void testNoClassLiteral() throws Exception {
doActionTest();
assertStringItems("forName", "forName", "Object.class", "getClass");
assertStringItems("Object.class", "getClass", "forName", "forName");
}
public void testClassLiteralInAnno2() throws Throwable {