mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
OptionalToIfInspection: handle parenthesized chain expression, ignore partial chains
GitOrigin-RevId: 671362371ac599455c195cfcfd325515f617d602
This commit is contained in:
committed by
intellij-monorepo-bot
parent
cf0252ac9b
commit
3053abb353
+9
-5
@@ -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);
|
||||
}
|
||||
|
||||
+3
-1
@@ -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());
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user