prefer local variables over static method references in completion

This commit is contained in:
peter
2017-02-01 17:53:15 +01:00
parent bb6beb2e05
commit 4e71366f3b
7 changed files with 32 additions and 17 deletions
@@ -21,7 +21,6 @@ import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.editor.EditorModificationUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
@@ -105,9 +104,8 @@ public class FunctionalExpressionCompletionProvider extends CompletionProvider<C
lambdaExpression = (PsiLambdaExpression)codeStyleManager.reformat(lambdaExpression);
paramsString = lambdaExpression.getParameterList().getText();
final LookupElementBuilder builder =
LookupElementBuilder.create(functionalInterfaceMethod, paramsString)
LookupElementBuilder.create(functionalInterfaceMethod, paramsString + " -> ")
.withPresentableText(paramsString + " -> {}")
.withInsertHandler((context, item) -> EditorModificationUtil.insertStringAtCaret(context.getEditor(), " -> "))
.withTypeText(functionalInterfaceType.getPresentableText())
.withIcon(AllIcons.Nodes.Function);
LookupElement lambdaElement = builder.withAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
@@ -279,7 +277,7 @@ public class FunctionalExpressionCompletionProvider extends CompletionProvider<C
JavaResolveUtil.isAccessible(psiMethod, null, psiMethod.getModifierList(), originalPosition, null, null)) {
LookupElement methodRefLookupElement = createMethodRefOnClass(functionalInterfaceType, psiMethod, qualifierClass);
if (prioritize && containingClass == paramClass) {
methodRefLookupElement = PrioritizedLookupElement.withPriority(methodRefLookupElement, 1);
methodRefLookupElement = PrioritizedLookupElement.withExplicitProximity(methodRefLookupElement, 1);
}
result.add(methodRefLookupElement);
}
@@ -0,0 +1,11 @@
import java.util.function.*;
class Foo {
void foo(PsiElement psiElement) {
Function<PsiElement, PsiElement> f = psi<caret>
}
}
interface PsiElement {
PsiElement getParent();
}
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.codeInsight.lookup.impl.LookupImpl;
@@ -48,7 +47,6 @@ public abstract class CompletionSortingTestCase extends LightFixtureCompletionTe
try {
LookupManager.getInstance(getProject()).hideActiveLookup();
UISettings.getInstance().setSortLookupElementsLexicographically(false);
CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE = CodeInsightSettings.FIRST_LETTER;
}
finally {
super.tearDown();
@@ -16,6 +16,7 @@
package com.intellij.codeInsight.completion
import com.intellij.JavaTestUtil
import com.intellij.codeInsight.CodeInsightSettings
import com.intellij.codeInsight.lookup.LookupElementPresentation
import com.intellij.testFramework.LightProjectDescriptor
@@ -271,4 +272,11 @@ class Test88 {
myFixture.type(':')
checkResultByFile(getTestName(false) + "_after.java")
}
void testPreferLocalsOverMethodRefs() {
CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE
configureByTestName()
myFixture.assertPreferredCompletionItems 0, "psiElement1 -> ", "psiElement", "getParent", "PsiElement"
}
}
@@ -81,14 +81,8 @@ class NormalCompletionOrderingTest extends CompletionSortingTestCase {
}
void testUppercaseMatters2() throws Throwable {
final int old = CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE
try {
CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE = CodeInsightSettings.ALL
checkPreferredItems(0, "classLoader", "classLoader2")
}
finally {
CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE = old
}
CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE = CodeInsightSettings.ALL
checkPreferredItems(0, "classLoader", "classLoader2")
}
void testShorterShouldBePreselected() throws Throwable {
@@ -108,7 +108,7 @@ public class SmartType18CompletionTest extends LightFixtureCompletionTestCase {
myFixture.addClass("package foo; class ImplInaccessible implements intf.Intf<String> {}");
configureByTestName();
myFixture.assertPreferredCompletionItems(0, "ImplBar::new", "ImplFoo::new", "()");
myFixture.assertPreferredCompletionItems(0, "ImplBar::new", "ImplFoo::new", "() -> ");
myFixture.type('\n');
checkResultByFile("/" + getTestName(false) + "-out.java");
}
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupEvent;
import com.intellij.codeInsight.lookup.LookupManager;
@@ -40,8 +41,13 @@ public abstract class LightFixtureCompletionTestCase extends LightCodeInsightFix
@Override
protected void tearDown() throws Exception {
myItems = null;
super.tearDown();
try {
myItems = null;
CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE = CodeInsightSettings.FIRST_LETTER;
}
finally {
super.tearDown();
}
}
protected void configureByFile(String path) {