diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/InstanceOfUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/InstanceOfUtils.java index 68eaa0c19b66..702d84d522ac 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/InstanceOfUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/InstanceOfUtils.java @@ -113,6 +113,9 @@ public class InstanceOfUtils { } else if (tokenType == JavaTokenType.OROR) { for (PsiExpression operand : expression.getOperands()) { + if (operand instanceof PsiPrefixExpression && ((PsiPrefixExpression)operand).getOperationTokenType() == JavaTokenType.EXCL) { + inElse = true; + } checkExpression(operand); } if (inElse && conflictingInstanceof != null) { @@ -125,8 +128,7 @@ public class InstanceOfUtils { public void visitIfStatement(PsiIfStatement ifStatement) { final PsiStatement branch = ifStatement.getElseBranch(); inElse = branch != null && - PsiTreeUtil.isAncestor(branch, referenceExpression, - true); + PsiTreeUtil.isAncestor(branch, referenceExpression, true); if (inElse) { if (branch instanceof PsiBlockStatement) { final PsiBlockStatement blockStatement = @@ -161,8 +163,7 @@ public class InstanceOfUtils { } @Override - public void visitConditionalExpression( - PsiConditionalExpression expression) { + public void visitConditionalExpression(PsiConditionalExpression expression) { final PsiExpression elseExpression = expression.getElseExpression(); inElse = elseExpression != null && diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/castConflictingInstanceof/notOr/NotOr.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/castConflictingInstanceof/notOr/NotOr.java new file mode 100644 index 000000000000..15c0199b3b0d --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/castConflictingInstanceof/notOr/NotOr.java @@ -0,0 +1,11 @@ +interface I1 {} +interface I2 extends I1{} +interface I3 extends I1 {} + +class PP { + void f(Object o) { + if (o instanceof I1) { + if (!(o instanceof I2) || ((I2)o).getClass() != null){} + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/castConflictingInstanceof/notOr/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/castConflictingInstanceof/notOr/expected.xml new file mode 100644 index 000000000000..580a889dbfd6 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/castConflictingInstanceof/notOr/expected.xml @@ -0,0 +1,3 @@ + + + diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/CastConflictsWithInstanceofInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/CastConflictsWithInstanceofInspectionTest.java index e7593bfa5d39..ff6d488a6fd9 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/CastConflictsWithInstanceofInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/CastConflictsWithInstanceofInspectionTest.java @@ -38,6 +38,10 @@ public class CastConflictsWithInstanceofInspectionTest extends IGInspectionTestC public void testPolyadic() throws Exception { doTest(); } + + public void testNotOr() throws Exception { + doTest(); + } private void doTest() throws Exception { doTest("com/siyeh/igtest/bugs/castConflictingInstanceof/" + getTestName(true), new CastConflictsWithInstanceofInspection());