anonymous -> lambda: fix anonymous classes in enum constants

This commit is contained in:
Anna.Kozlova
2016-04-20 17:36:41 +02:00
parent 5f72c7380c
commit 22c8d0f9ce
4 changed files with 38 additions and 1 deletions

View File

@@ -161,7 +161,8 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaBatchLocalInspection
final PsiCall call = LambdaUtil.treeWalkUp(topExpr);
if (call != null && call.resolveMethod() != null) {
final int offsetInTopCall = aClass.getTextRange().getStartOffset() - call.getTextRange().getStartOffset();
final PsiCall copyCall = (PsiCall)call.copy();
PsiCall copyCall = LambdaUtil.copyTopLevelCall(call);
if (copyCall == null) return null;
final PsiAnonymousClass classArg = PsiTreeUtil.getParentOfType(copyCall.findElementAt(offsetInTopCall), PsiAnonymousClass.class);
if (classArg != null) {
PsiExpression lambda = JavaPsiFacade.getElementFactory(aClass.getProject())

View File

@@ -775,6 +775,28 @@ public class LambdaUtil {
return top;
}
public static PsiCall copyTopLevelCall(@NotNull PsiCall call) {
PsiCall copyCall = (PsiCall)call.copy();
if (call instanceof PsiEnumConstant) {
PsiClass containingClass = ((PsiEnumConstant)call).getContainingClass();
if (containingClass == null) {
return null;
}
String enumName = containingClass.getName();
if (enumName == null) {
return null;
}
PsiMethod resolveMethod = call.resolveMethod();
if (resolveMethod == null) {
return null;
}
PsiClass anEnum = JavaPsiFacade.getElementFactory(call.getProject()).createEnum(enumName);
anEnum.add(resolveMethod);
return (PsiCall)anEnum.add(copyCall);
}
return copyCall;
}
public static class TypeParamsChecker extends PsiTypeVisitor<Boolean> {
private PsiMethod myMethod;
private final PsiClass myClass;

View File

@@ -0,0 +1,6 @@
// "Replace with lambda" "true"
enum E {
A(() -> {});
public E(Runnable r) {}
}

View File

@@ -0,0 +1,8 @@
// "Replace with lambda" "true"
enum E {
A(new Runna<caret>ble() {
public void run(){}
});
public E(Runnable r) {}
}