void (@NotNull GrUnaryExpression expression) { super.visitUnaryExpression(expression); IElementType opType = expression.getOperationTokenType(); if (opType != GroovyTokenTypes.mINC && opType != GroovyTokenTypes.mDEC) return; GrExpression operand = expression.getOperand(); if (!(operand instanceof GrReferenceExpression)) return; PsiElement resolved = ((GrReferenceExpression)operand).resolve(); if (!(resolved instanceof GrVariable) || resolved instanceof GrField) return; final GrControlFlowOwner owner = ControlFlowUtils.findControlFlowOwner(expression); assert owner != null; GrControlFlowOwner ownerOfDeclaration = ControlFlowUtils.findControlFlowOwner(resolved); if (ownerOfDeclaration != owner) return; GroovyControlFlow groovyFlow = ControlFlowUtils.getGroovyControlFlow(owner); final Instruction cur = ControlFlowUtils.findInstruction(operand, groovyFlow.getFlow()); if (cur == null) { LOG.error("no instruction found in flow." + "operand: " + operand.getText(), new Attachment("", owner.getText())); } //get write access for inc or dec Iterable<? extends Instruction> successors = cur.allSuccessors(); Iterator<? extends Instruction> iterator = successors.iterator(); LOG.assertTrue(iterator.hasNext()); Instruction writeAccess = iterator.next(); LOG.assertTrue(!iterator.hasNext()); int variableIndex = groovyFlow.getIndex(createDescriptor((GrVariable)resolved)); List<ReadWriteVariableInstruction> accesses = ControlFlowUtils.findAccess(variableIndex, true, false, writeAccess); boolean allAreWrite = true; for (ReadWriteVariableInstruction access : accesses) { if (!access.isWrite()) { allAreWrite = false; break; } } if (allAreWrite) { if (expression.isPostfix() && PsiUtil.isExpressionUsed(expression)) { registerError(expression.getOperationToken(), GroovyBundle.message("unused.0", expression.getOperationToken().getText()), new LocalQuickFix[]{new ReplacePostfixIncWithPrefixFix(expression), new RemoveIncOrDecFix(expression)}, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); } else if (!PsiUtil.isExpressionUsed(expression)) { registerError(expression.getOperationToken(), GroovyBundle.message("unused.0", expression.getOperationToken().getText()), LocalQuickFix.EMPTY_ARRAY, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); } } }