OptionalToIfInspection: handle parenthesized chain expression, ignore partial chains

GitOrigin-RevId: 671362371ac599455c195cfcfd325515f617d602
This commit is contained in:
Artemiy Sartakov
2019-09-25 08:31:20 +00:00
committed by intellij-monorepo-bot
parent cf0252ac9b
commit 3053abb353
2 changed files with 12 additions and 6 deletions
@@ -5,6 +5,7 @@ import com.intellij.codeInspection.streamToLoop.ChainContext;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.siyeh.ig.psiutils.BoolUtils;
import com.siyeh.ig.psiutils.ComparisonUtils;
import com.siyeh.ig.psiutils.ExpressionUtils;
@@ -112,11 +113,13 @@ class OptionalToIfContext extends ChainContext {
PsiReturnStatement returnStatement = tryCast(chainStatement, PsiReturnStatement.class);
if (returnStatement != null) return ChainReturn.create(returnStatement, chainExpression);
PsiAssignmentExpression assignment = ExpressionUtils.getAssignment(chainStatement);
if (assignment != null && assignment.getRExpression() == chainExpression) return ChainAssignment.create(assignment);
if (assignment != null) return ChainAssignment.create(assignment, chainExpression);
PsiDeclarationStatement declaration = tryCast(chainStatement, PsiDeclarationStatement.class);
if (declaration != null) return ChainDeclaration.create(declaration, chainExpression);
PsiExpressionStatement expressionStatement = tryCast(chainStatement, PsiExpressionStatement.class);
if (expressionStatement != null && expressionStatement.getExpression() == chainExpression) return new ChainStatement();
if (expressionStatement != null && PsiUtil.skipParenthesizedExprDown(expressionStatement.getExpression()) == chainExpression) {
return new ChainStatement();
}
return null;
}
}
@@ -175,7 +178,7 @@ class OptionalToIfContext extends ChainContext {
@Nullable
private static ChainReturn create(@NotNull PsiReturnStatement chainReturn, @NotNull PsiExpression chainExpression) {
if (chainReturn.getReturnValue() != chainExpression) return null;
if (PsiUtil.skipParenthesizedExprDown(chainReturn.getReturnValue()) != chainExpression) return null;
Object mark = new Object();
PsiTreeUtil.mark(chainExpression, mark);
PsiReturnStatement chainReturnCopy = tryCast(chainReturn.copy(), PsiReturnStatement.class);
@@ -213,7 +216,8 @@ class OptionalToIfContext extends ChainContext {
}
@Nullable
static ChainExpressionModel create(@NotNull PsiAssignmentExpression assignment) {
static ChainExpressionModel create(@NotNull PsiAssignmentExpression assignment, @NotNull PsiExpression chainExpression) {
if (PsiUtil.skipParenthesizedExprDown(assignment.getRExpression()) != chainExpression) return null;
PsiReferenceExpression ref = tryCast(assignment.getLExpression(), PsiReferenceExpression.class);
if (ref == null) return null;
PsiVariable variable = tryCast(ref.resolve(), PsiVariable.class);
@@ -256,7 +260,7 @@ class OptionalToIfContext extends ChainContext {
PsiElement[] elements = declaration.getDeclaredElements();
if (elements.length != 1) return null;
PsiVariable variable = tryCast(elements[0], PsiVariable.class);
if (variable == null || variable.getInitializer() != chainExpression) return null;
if (variable == null || PsiUtil.skipParenthesizedExprDown(variable.getInitializer()) != chainExpression) return null;
String name = variable.getName();
return name == null ? null : new ChainDeclaration(name, variable);
}
@@ -39,7 +39,9 @@ public class OptionalToIfInspection extends AbstractBaseJavaLocalInspectionTool
String methodName = terminalCall.getMethodExpression().getReferenceName();
if (methodName == null || !SUPPORTED_TERMINALS.contains(methodName)) return;
List<Operation> operations = extractOperations(terminalCall, true);
if (operations == null || OptionalToIfContext.create(terminalCall) == null) return;
if (operations == null || operations.size() < 1 || !(operations.get(0) instanceof SourceOperation)) return;
OptionalToIfContext context = OptionalToIfContext.create(terminalCall);
if (context == null) return;
holder.registerProblem(terminalCall, "Replace Optional with if statements", new ReplaceOptionalWithIfFix());
}
};