void (@NotNull PsiAssignmentExpression expression) { super.visitAssignmentExpression(expression); final PsiExpression rhs = PsiUtil.skipParenthesizedExprDown(expression.getRExpression()); if (rhs == null) { return; } final PsiExpression lhs = expression.getLExpression(); final PsiReferenceExpression volatileFieldRef = findNonSynchronizedVolatileFieldRef(lhs); if (volatileFieldRef == null) { return; } final PsiElement referenceNameElement = volatileFieldRef.getReferenceNameElement(); if (referenceNameElement == null) { return; } final IElementType tokenType = expression.getOperationTokenType(); if (tokenType.equals(JavaTokenType.PLUSEQ) || tokenType.equals(JavaTokenType.MINUSEQ) || tokenType.equals(JavaTokenType.ASTERISKEQ) || tokenType.equals(JavaTokenType.DIVEQ) || tokenType.equals(JavaTokenType.ANDEQ) || tokenType.equals(JavaTokenType.OREQ) || tokenType.equals(JavaTokenType.XOREQ) || tokenType.equals(JavaTokenType.PERCEQ) || tokenType.equals(JavaTokenType.LTLTEQ) || tokenType.equals(JavaTokenType.GTGTEQ) || tokenType.equals(JavaTokenType.GTGTGTEQ)) { registerError(referenceNameElement); return; } rhs.accept(new JavaRecursiveElementWalkingVisitor() { @Override public void visitReferenceExpression(@NotNull PsiReferenceExpression reference) { if (EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(lhs, reference)) { stopWalking(); registerError(referenceNameElement); return; } super.visitReferenceExpression(reference); } }); }