redundant lambda code block: do not suggest change void/value compatibility

This commit is contained in:
Anna Kozlova
2014-09-03 16:53:02 +04:00
parent 9097465506
commit 32448804ae
4 changed files with 33 additions and 7 deletions

View File

@@ -67,6 +67,9 @@ public class RedundantLambdaCodeBlockInspection extends BaseJavaBatchLocalInspec
if (body instanceof PsiCodeBlock) {
PsiExpression psiExpression = getExpression((PsiCodeBlock)body);
if (psiExpression != null) {
if (!expression.isVoidCompatible() && LambdaUtil.isExpressionStatementExpression(psiExpression)) {
return;
}
final PsiElement errorElement;
final PsiElement parent = psiExpression.getParent();
if (parent instanceof PsiReturnStatement) {

View File

@@ -477,6 +477,16 @@ public class LambdaUtil {
return true;
}
//JLS 14.8 Expression Statements
public static boolean isExpressionStatementExpression(PsiElement body) {
return body instanceof PsiAssignmentExpression ||
body instanceof PsiPrefixExpression &&
(((PsiPrefixExpression)body).getOperationTokenType() == JavaTokenType.PLUSPLUS ||
((PsiPrefixExpression)body).getOperationTokenType() == JavaTokenType.MINUSMINUS) ||
body instanceof PsiPostfixExpression ||
body instanceof PsiCallExpression;
}
public static class TypeParamsChecker extends PsiTypeVisitor<Boolean> {
private PsiMethod myMethod;
private final PsiClass myClass;

View File

@@ -225,13 +225,7 @@ public class PsiLambdaExpressionImpl extends ExpressionPsiElement implements Psi
if (body instanceof PsiCodeBlock) {
return isVoidCompatible();
} else {
//JLS 14.8 Expression Statements
return body instanceof PsiAssignmentExpression ||
body instanceof PsiPrefixExpression &&
(((PsiPrefixExpression)body).getOperationTokenType() == JavaTokenType.PLUSPLUS ||
((PsiPrefixExpression)body).getOperationTokenType() == JavaTokenType.MINUSMINUS) ||
body instanceof PsiPostfixExpression ||
body instanceof PsiCallExpression;
return LambdaUtil.isExpressionStatementExpression(body);
}
} else {
if (body instanceof PsiCodeBlock) {

View File

@@ -0,0 +1,19 @@
// "Replace with expression lambda" "false"
interface A {
int m(int x);
}
interface B {
void m(boolean x);
}
abstract class X {
abstract void foo(A j);
abstract void foo(B i);
void bar(Object o) {
foo(x -> {
retu<caret>rn x += 1;
});
}
}