eliminate duplicates

This commit is contained in:
Anna Kozlova
2014-11-11 18:24:47 +01:00
parent 0506cb77bc
commit 80c0cd1a42
3 changed files with 31 additions and 54 deletions
@@ -156,37 +156,8 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp
}
public static PsiCallExpression extractMethodCallFromBlock(PsiElement body) {
PsiCallExpression methodCall = null;
if (body instanceof PsiCallExpression) {
methodCall = (PsiCallExpression)body;
}
else if (body instanceof PsiCodeBlock) {
final PsiStatement[] statements = ((PsiCodeBlock)body).getStatements();
if (statements.length == 1) {
if (statements[0] instanceof PsiReturnStatement) {
final PsiExpression returnValue = ((PsiReturnStatement)statements[0]).getReturnValue();
if (returnValue instanceof PsiCallExpression) {
methodCall = (PsiCallExpression)returnValue;
}
}
else if (statements[0] instanceof PsiExpressionStatement) {
final PsiExpression expr = ((PsiExpressionStatement)statements[0]).getExpression();
if (expr instanceof PsiCallExpression) {
methodCall = (PsiCallExpression)expr;
}
}
}
}
else if (body instanceof PsiBlockStatement) {
return extractMethodCallFromBlock(((PsiBlockStatement)body).getCodeBlock());
}
else if (body instanceof PsiExpressionStatement) {
final PsiExpression expression = ((PsiExpressionStatement)body).getExpression();
if (expression instanceof PsiCallExpression) {
methodCall = (PsiCallExpression)expression;
}
}
return methodCall;
final PsiExpression expression = LambdaUtil.extractSingleExpressionFromBody(body);
return expression instanceof PsiCallExpression ? (PsiCallExpression)expression : null;
}
@Nullable
@@ -28,7 +28,6 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -75,7 +74,7 @@ public class RedundantLambdaCodeBlockInspection extends BaseJavaBatchLocalInspec
super.visitLambdaExpression(expression);
final PsiElement body = expression.getBody();
if (body instanceof PsiCodeBlock) {
PsiExpression psiExpression = getExpression((PsiCodeBlock)body);
PsiExpression psiExpression = LambdaUtil.extractSingleExpressionFromBody(body);
if (psiExpression != null && !findCommentsOutsideExpression(body, psiExpression)) {
if (LambdaUtil.isExpressionStatementExpression(psiExpression)) {
final PsiElement parent = PsiUtil.skipParenthesizedExprUp(expression.getParent());
@@ -122,26 +121,6 @@ public class RedundantLambdaCodeBlockInspection extends BaseJavaBatchLocalInspec
};
}
@Nullable
private static PsiExpression getExpression(PsiCodeBlock body) {
final PsiStatement[] statements = body.getStatements();
if (statements.length == 1) {
if (statements[0] instanceof PsiBlockStatement) {
return getExpression(((PsiBlockStatement)statements[0]).getCodeBlock());
}
if (statements[0] instanceof PsiReturnStatement || statements[0] instanceof PsiExpressionStatement) {
if (statements[0] instanceof PsiReturnStatement) {
final PsiReturnStatement returnStatement = (PsiReturnStatement)statements[0];
return returnStatement.getReturnValue();
}
else {
return ((PsiExpressionStatement)statements[0]).getExpression();
}
}
}
return null;
}
private static class ReplaceWithExprFix implements LocalQuickFix, HighPriorityAction {
@NotNull
@Override
@@ -164,7 +143,7 @@ public class RedundantLambdaCodeBlockInspection extends BaseJavaBatchLocalInspec
if (lambdaExpression != null) {
final PsiElement body = lambdaExpression.getBody();
if (body != null) {
PsiExpression expression = getExpression((PsiCodeBlock)body);
PsiExpression expression = LambdaUtil.extractSingleExpressionFromBody(body);
if (expression != null) {
body.replace(expression);
}
@@ -468,6 +468,33 @@ public class LambdaUtil {
body instanceof PsiReferenceExpression && !body.isPhysical();
}
public static PsiExpression extractSingleExpressionFromBody(PsiElement body) {
PsiExpression expression = null;
if (body instanceof PsiExpression) {
expression = (PsiExpression)body;
}
else if (body instanceof PsiCodeBlock) {
final PsiStatement[] statements = ((PsiCodeBlock)body).getStatements();
if (statements.length == 1) {
if (statements[0] instanceof PsiReturnStatement) {
expression = ((PsiReturnStatement)statements[0]).getReturnValue();
}
else if (statements[0] instanceof PsiExpressionStatement) {
expression = ((PsiExpressionStatement)statements[0]).getExpression();
} else if (statements[0] instanceof PsiBlockStatement) {
return extractSingleExpressionFromBody(((PsiBlockStatement)statements[0]).getCodeBlock());
}
}
}
else if (body instanceof PsiBlockStatement) {
return extractSingleExpressionFromBody(((PsiBlockStatement)body).getCodeBlock());
}
else if (body instanceof PsiExpressionStatement) {
expression = ((PsiExpressionStatement)body).getExpression();
}
return expression;
}
public static class TypeParamsChecker extends PsiTypeVisitor<Boolean> {
private PsiMethod myMethod;
private final PsiClass myClass;