void (@NotNull PsiForStatement statement) { startElement(statement); PsiStatement body = statement.getBody(); myStartStatementStack.pushStatement(body == null ? statement : body, false); myEndStatementStack.pushStatement(statement, false); PsiStatement initialization = statement.getInitialization(); if (initialization != null) { initialization.accept(this); } PsiExpression condition = statement.getCondition(); if (condition != null) { condition.accept(this); } Object loopCondition = myConstantEvaluationHelper.computeConstantExpression(condition); if (loopCondition instanceof Boolean || condition == null) { boolean value = condition == null || ((Boolean)loopCondition).booleanValue(); if (value) { emitEmptyInstruction(); } else { myCurrentFlow.addInstruction(new GoToInstruction(0)); addElementOffsetLater(statement, false); } } else { Instruction instruction = new ConditionalGoToInstruction(0, statement.getCondition()); myCurrentFlow.addInstruction(instruction); addElementOffsetLater(statement, false); } if (body != null) { body.accept(this); } PsiStatement update = statement.getUpdate(); if (update != null) { update.accept(this); } int offset = initialization != null ? myCurrentFlow.getEndOffset(initialization) : myCurrentFlow.getStartOffset(statement); Instruction instruction = new GoToInstruction(offset); myCurrentFlow.addInstruction(instruction); myStartStatementStack.popStatement(); myEndStatementStack.popStatement(); finishElement(statement); }