diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 1e8b089b9625..9cc1320dfa64 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1157,19 +1157,31 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { PsiExpression lExpr = operands[0]; lExpr.accept(this); PsiType lType = lExpr.getType(); + boolean hasAssignment = containsAssignments(lExpr); for (int i = 1; i < operands.length; i++) { PsiExpression rExpr = operands[i]; PsiType rType = rExpr.getType(); acceptBinaryRightOperand(op, type, lExpr, lType, rExpr, rType); - addInstruction(new BinopInstruction(op, expression.isPhysical() ? expression : null, expression.getProject())); + if (hasAssignment || containsAssignments(rExpr)) { + addInstruction(new PopInstruction()); + addInstruction(new PopInstruction()); + pushUnknown(); + hasAssignment = false; + } else { + addInstruction(new BinopInstruction(op, expression.isPhysical() ? expression : null, expression.getProject())); + } lExpr = rExpr; lType = rType; } } + private static boolean containsAssignments(@Nullable PsiElement element) { + return PsiTreeUtil.findChildOfType(element, PsiAssignmentExpression.class) != null; + } + @Nullable private static IElementType substituteBinaryOperation(IElementType op, PsiType type) { if (JavaTokenType.PLUS == op && (type == null || !type.equalsToText(JAVA_LANG_STRING))) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java index 9f2c106b576a..aa55c769286b 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java @@ -590,9 +590,7 @@ public class StandardInstructionVisitor extends InstructionVisitor { return true; } } - if (PsiTreeUtil.findChildOfType(element, PsiAssignmentExpression.class) != null) { - return true; - } return false; } + } diff --git a/java/java-tests/testData/inspection/dataFlow/IDEADEV11033/expected.xml b/java/java-tests/testData/inspection/dataFlow/IDEADEV11033/expected.xml deleted file mode 100644 index 4704d91e891d..000000000000 --- a/java/java-tests/testData/inspection/dataFlow/IDEADEV11033/expected.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/IDEADEV11033/src/RightAssociativeAssignment.java b/java/java-tests/testData/inspection/dataFlow/IDEADEV11033/src/RightAssociativeAssignment.java deleted file mode 100644 index c3b1aff34257..000000000000 --- a/java/java-tests/testData/inspection/dataFlow/IDEADEV11033/src/RightAssociativeAssignment.java +++ /dev/null @@ -1,6 +0,0 @@ -public class NonconstantCondition { - void test(boolean flag) { - if (flag == (flag = true)) { - } - } -} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/SkipConstantConditionsWithAssignmentsInside.java b/java/java-tests/testData/inspection/dataFlow/fixture/SkipConstantConditionsWithAssignmentsInside.java new file mode 100644 index 000000000000..67d1f0503bf6 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/SkipConstantConditionsWithAssignmentsInside.java @@ -0,0 +1,16 @@ +class Contracts { + + void test(boolean flag) { + if (flag == (flag = true)) System.out.println(); + + int x = 1; + boolean y = x == (x +=1); // returns false + if (y) System.out.println(); + + int k = 1; + boolean z = (k +=1) == k; // returns true + if (z) System.out.println(); + } + + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionAncientTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionAncientTest.java index 57a38f4b015f..e8a6bba5e623 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionAncientTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionAncientTest.java @@ -118,5 +118,4 @@ public class DataFlowInspectionAncientTest extends InspectionTestCase { public void testSwitchEnumCases() { doTest15(); } public void testSCR15406() { doTest(); } - public void testIDEADEV11033() { doTest15(); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index a9fb4ee828b3..3e8b46f428a4 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -385,4 +385,6 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { } public void _testNullCheckBeforeInstanceof() { doTest(); } // https://youtrack.jetbrains.com/issue/IDEA-113220 + + public void testSkipConstantConditionsWithAssignmentsInside() { doTest(); } }