private void CreateIfStatement(int i, JumpIfNotToken jumpToken, int ifEnd) { int ifCount = ifEnd - i - 1; int ifEndOffset = jumpToken.TargetOffset; CompositeStatement elseStatement = null; bool isWhile = false; if (this[ifEnd - 1].Token is UncondJumpToken) { var endToken = (UncondJumpToken)this[ifEnd - 1].Token; if (endToken.TargetOffset == this[i].StartOffset) { isWhile = true; } else if (FindBreakTarget(endToken.TargetOffset) == null) { int elseEnd = FindByTargetOffset(endToken.TargetOffset, ifEnd + 1); if (elseEnd >= 0) { ifEndOffset = this[ifEnd - 1].StartOffset; elseStatement = new ElseStatement(this[ifEnd].StartOffset, this[ifEnd - 1].Token, GetRange(ifEnd, elseEnd - ifEnd), endToken.TargetOffset); ifCount--; } } } CompositeStatement statement = isWhile ? (CompositeStatement) new WhileStatement(this[i].StartOffset, jumpToken.Condition, GetRange(i + 1, ifCount), ifEndOffset) : new IfStatement(this[i].StartOffset, jumpToken.Condition, GetRange(i + 1, ifCount), ifEndOffset); ReplaceRange(i, ifEnd - i, statement); statement.ProcessChildren(); if (elseStatement != null) { ReplaceRange(i + 1, elseStatement.Children, elseStatement); elseStatement.Children.CreateControlStatements(); } }