public class Class { @Annotation1(1 + 2 + 3) // Compliant @Annotation2(1 & 2 | 3) // Noncompliant [[sc=16;ec=21]] {{Add parentheses to make the operator precedence explicit.}} @Annotation3(key = 1 + 2 + 3) // Compliant @Annotation4(key = 1 & 2 | 3) // Noncompliant [[sc=22;ec=27]] {{Add parentheses to make the operator precedence explicit.}} public void method(int[] array, int value) { int a; ; // should raise an issue in initializer int b = 1 & 2 | 3 & 4; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} // should raise an issue in operand of unary / parenthesized expression // nested kind should not leak outside b = +(1 & 2 | 3) + 2; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} // should raise an issue in operand of array acces expression // nested kind should not leak outside b = array[1 & 2 | 3] + 2; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} // should raise an issue in operand of method invocation expression // nested kind should not leak outside b = method(array, 1 & 2 | 3) + 1; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} int[][] c = {{1 & 2 | 3, 2 | 3, 3}, { 1 << 2, 1 + 2 }}; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} b = 1 | new Object() { @Override public int method() { return 1 & 2; // Compliant } }.hashCode(); b = 1 == 2 ? 1 + 1 : 1 - 1; // Noncompliant b = 1 == 2 ? (1 + 1) : (1 - 1); // compliant a ? a ? b : c : c; // Noncompliant a ? foo(): bar(); // Compliant a ? foo(): new bar(); // Compliant a ? foo(): (Type) casted; // Compliant a ? foo[1]: b; // Compliant a ? -1: b; // Compliant a ? +1: b; // Compliant a ? ++i: b; // Compliant a ? i: i++; // Compliant b = b = 1; // Compliant int d = b = a; // Compliant do { 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } while (1 & 2 | 3); // Noncompliant {{Add parentheses to make the operator precedence explicit.}} for (1 & 2 | 3;;) { // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } for (; 1 & 2 | 3;) { // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } for (;; 1 & 2 | 3) { // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } for (;;) { 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } if (1 & 2 | 3) { // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } else { 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } return 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} return a; // Compliant switch (1 & 2 | 3) { // Noncompliant {{Add parentheses to make the operator precedence explicit.}} case 0: 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } throw 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} throw new RuntimeException(); // Compliant while (1 & 2 | 3) { // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } 1 + 2 << 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 + 2 & 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 + 2 ^ 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 + 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 << 2 & 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 << 2 ^ 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 << 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 & 2 ^ 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 & 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 ^ 2 | 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} 1 && 2 || 3; // Noncompliant {{Add parentheses to make the operator precedence explicit.}} if ( a = b = c) { // Compliant } if ( a = b == c) { // Noncompliant {{Add parentheses to make the operator precedence explicit.}} } String[] array = (value > 0) ? getValue() : new String[0]; // Compliant } }