lambda completion: strip unnecessary parenthesis, generate parameter names as for override/implement (IDEA-121947)

(cherry picked from commit 273ae0329f28a5bec42847a8739faf8a815cab37)
This commit is contained in:
Anna Kozlova
2014-03-12 10:20:57 +01:00
parent f738b512a3
commit 88c7d65679
7 changed files with 77 additions and 7 deletions
@@ -16,13 +16,16 @@
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.codeInsight.generation.GenerateMembersUtil;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorModificationUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.Function;
import com.intellij.util.ProcessingContext;
@@ -43,8 +46,17 @@ public class LambdaCompletionProvider extends CompletionProvider<CompletionParam
if (LambdaUtil.isFunctionalType(defaultType)) {
final PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(defaultType);
if (method != null) {
final PsiParameter[] params = method.getParameterList().getParameters();
final String paramsString = "(" + StringUtil.join(params, new Function<PsiParameter, String>() {
PsiParameter[] params = method.getParameterList().getParameters();
final Project project = method.getProject();
final PsiElement originalPosition = parameters.getOriginalPosition();
final JVMElementFactory jvmElementFactory = originalPosition != null ? JVMElementFactories.getFactory(originalPosition.getLanguage(), project) : null;
if (jvmElementFactory != null) {
final PsiSubstitutor substitutor = LambdaUtil.getSubstitutor(method, PsiUtil.resolveGenericsClassInType(defaultType));
final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project);
params = GenerateMembersUtil.overriddenParameters(params, jvmElementFactory, codeStyleManager, substitutor, originalPosition);
}
final String paramsString = params.length == 1 ? params[0].getName() : "(" + StringUtil.join(params, new Function<PsiParameter, String>() {
@Override
public String fun(PsiParameter parameter) {
return parameter.getName();
@@ -385,10 +385,25 @@ public class GenerateMembersUtil {
@NotNull PsiParameterList sourceParameterList,
@NotNull PsiParameterList targetParameterList,
@NotNull PsiSubstitutor substitutor, PsiElement target) {
PsiParameter[] parameters = sourceParameterList.getParameters();
final PsiParameter[] parameters = sourceParameterList.getParameters();
final PsiParameter[] newParameters = overriddenParameters(parameters, factory, codeStyleManager, substitutor, target);
for (int i = 0; i < newParameters.length; i++) {
final PsiParameter newParameter = newParameters[i];
copyOrReplaceModifierList(parameters[i], newParameter);
targetParameterList.add(newParameter);
}
}
public static PsiParameter[] overriddenParameters(PsiParameter[] parameters,
@NotNull JVMElementFactory factory,
@NotNull JavaCodeStyleManager codeStyleManager,
@NotNull PsiSubstitutor substitutor,
PsiElement target) {
PsiParameter[] result = new PsiParameter[parameters.length];
UniqueNameGenerator generator = new UniqueNameGenerator();
for (PsiParameter parameter : parameters) {
for (int i = 0; i < parameters.length; i++) {
PsiParameter parameter = parameters[i];
final PsiType parameterType = parameter.getType();
final PsiType substituted = substituteType(substitutor, parameterType, (PsiMethod)parameter.getDeclarationScope());
@NonNls String paramName = parameter.getName();
@@ -413,10 +428,9 @@ public class GenerateMembersUtil {
paramName = generator.generateUniqueName(paramName);
}
generator.addExistingName(paramName);
final PsiParameter newParameter = factory.createParameter(paramName, substituted, target);
copyOrReplaceModifierList(parameter, newParameter);
targetParameterList.add(newParameter);
result[i] = factory.createParameter(paramName, substituted, target);
}
return result;
}
private static void substituteThrows(@NotNull JVMElementFactory factory,
@@ -0,0 +1,9 @@
interface I<T> {
void m(T t);
}
class Test {
public static void main(String[] args) {
I<String> i = s -> <caret>
}
}
@@ -0,0 +1,9 @@
interface I<T> {
void m(T t);
}
class Test {
public static void main(String[] args) {
I<String> i = <caret>
}
}
@@ -0,0 +1,9 @@
interface I {
void m(int x);
}
class Test {
public static void main(String[] args) {
I i = x -> <caret>
}
}
@@ -0,0 +1,9 @@
interface I {
void m(int x);
}
class Test {
public static void main(String[] args) {
I i = <caret>
}
}
@@ -73,6 +73,14 @@ public class SmartType18CompletionTest extends LightFixtureCompletionTestCase {
doTest();
}
public void testInLambdaPositionSingleParam() throws Exception {
doTest();
}
public void testInLambdaPositionNameSubstitution() throws Exception {
doTest();
}
public void testFilteredMethodReference() throws Exception {
doTest();
}