diff --git a/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfContext.java b/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfContext.java index 0b1340c24fef..a4c554c11b8d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfContext.java +++ b/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfContext.java @@ -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); } diff --git a/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfInspection.java b/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfInspection.java index 017d7180a5b8..3aadb9bb2521 100644 --- a/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/optionalToIf/OptionalToIfInspection.java @@ -39,7 +39,9 @@ public class OptionalToIfInspection extends AbstractBaseJavaLocalInspectionTool String methodName = terminalCall.getMethodExpression().getReferenceName(); if (methodName == null || !SUPPORTED_TERMINALS.contains(methodName)) return; List 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()); } };