lambda -> method ref: allow pure method call chain (IDEA-164223)

This commit is contained in:
Anna.Kozlova
2016-11-21 16:28:18 +01:00
parent ee2d4d2c84
commit 7d1f9d1e7b
3 changed files with 54 additions and 1 deletions
@@ -17,6 +17,7 @@ package com.intellij.codeInspection;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.GroupNames;
import com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer;
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
@@ -326,7 +327,13 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp
if (qualifier == null) {
return true;
}
final Condition<PsiElement> callExpressionCondition = Conditions.instanceOf(PsiCallExpression.class);
final Condition<PsiElement> callExpressionCondition = element -> {
if (element instanceof PsiCallExpression) {
PsiMethod method = ((PsiCallExpression)element).resolveMethod();
return !(method != null && ControlFlowAnalyzer.isPure(method));
}
return false;
};
final Condition<PsiElement> nonFinalFieldRefCondition = expression -> {
if (expression instanceof PsiReferenceExpression) {
PsiElement element = ((PsiReferenceExpression)expression).resolve();
@@ -0,0 +1,23 @@
// "Replace lambda with method reference" "true"
import java.util.*;
import java.util.function.Predicate;
class Main {
public static void main(String[] args) {
final Test test = new Test();
final List<Sub> subs = Arrays.asList(new Sub(), new Sub());
subs.forEach(test.getSubs()::add);
}
private static class Test {
private final List<Sub> subs = new ArrayList<>();
private List<Sub> getSubs() {
return subs;
}
}
private static class Sub {
}
}
@@ -0,0 +1,23 @@
// "Replace lambda with method reference" "true"
import java.util.*;
import java.util.function.Predicate;
class Main {
public static void main(String[] args) {
final Test test = new Test();
final List<Sub> subs = Arrays.asList(new Sub(), new Sub());
subs.forEach(t -> test.getSubs().a<caret>dd(t));
}
private static class Test {
private final List<Sub> subs = new ArrayList<>();
private List<Sub> getSubs() {
return subs;
}
}
private static class Sub {
}
}