prioritize lambdas in basic code completion (IDEA-135296)

This commit is contained in:
peter
2015-03-11 14:49:37 +01:00
parent 4ddd214f43
commit e867d80ea9
3 changed files with 21 additions and 9 deletions
@@ -225,6 +225,12 @@ public class JavaCompletionContributor extends CompletionContributor {
new TypeArgumentCompletionProvider(false, inheritors).addCompletions(parameters, new ProcessingContext(), result);
}
if (JavaSmartCompletionContributor.LAMBDA.accepts(parameters.getPosition())) {
for (LookupElement element : LambdaCompletionProvider.getLambdaVariants(parameters)) {
result.addElement(PrioritizedLookupElement.withPriority(element, 1));
}
}
PrefixMatcher matcher = result.getPrefixMatcher();
if (JavaSmartCompletionContributor.AFTER_NEW.accepts(position)) {
new JavaInheritorsGetter(ConstructorInsertHandler.BASIC_INSTANCE).generateVariants(parameters, matcher, inheritors);
@@ -247,10 +253,6 @@ public class JavaCompletionContributor extends CompletionContributor {
JavaGenerateMemberCompletionContributor.fillCompletionVariants(parameters, result);
if (JavaSmartCompletionContributor.LAMBDA.accepts(parameters.getPosition())) {
new LambdaCompletionProvider().addCompletions(parameters, new ProcessingContext(), result);
}
addAllClasses(parameters, result, inheritors);
final PsiElement parent = position.getParent();
@@ -31,8 +31,12 @@ import com.intellij.psi.impl.source.resolve.graphInference.FunctionalInterfacePa
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.Function;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
/**
* User: anna
*/
@@ -41,9 +45,14 @@ public class LambdaCompletionProvider extends CompletionProvider<CompletionParam
protected void addCompletions(@NotNull CompletionParameters parameters,
ProcessingContext context,
@NotNull CompletionResultSet result) {
if (!PsiUtil.isLanguageLevel8OrHigher(parameters.getOriginalFile())) return;
final ExpectedTypeInfo[] expectedTypes = JavaSmartCompletionContributor.getExpectedTypes(parameters);
for (ExpectedTypeInfo expectedType : expectedTypes) {
result.addAllElements(getLambdaVariants(parameters));
}
static List<LookupElement> getLambdaVariants(@NotNull CompletionParameters parameters) {
if (!PsiUtil.isLanguageLevel8OrHigher(parameters.getOriginalFile())) return Collections.emptyList();
List<LookupElement> result = ContainerUtil.newArrayList();
for (ExpectedTypeInfo expectedType : JavaSmartCompletionContributor.getExpectedTypes(parameters)) {
final PsiType defaultType = expectedType.getDefaultType();
if (LambdaUtil.isFunctionalType(defaultType)) {
final PsiType functionalInterfaceType = FunctionalInterfaceParameterizationUtil.getGroundTargetType(defaultType);
@@ -80,10 +89,11 @@ public class LambdaCompletionProvider extends CompletionProvider<CompletionParam
EditorModificationUtil.insertStringAtCaret(editor, " -> ");
}
});
result.addElement(builder.withAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE));
result.add(builder.withAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE));
}
}
}
return result;
}
private static String getParamName(PsiParameter param, JavaCodeStyleManager javaCodeStyleManager, PsiElement originalPosition) {
@@ -71,7 +71,7 @@ class Test {
}
}"""
def items = myFixture.completeBasic()
assert items.find { LookupElementPresentation.renderElement(it).itemText == 'x -> {}' }
assert LookupElementPresentation.renderElement(items[0]).itemText == 'x -> {}'
}
}