public override void VisitIfStatement(IfStatementSyntax node)
        {
            TState trueState;
            TState falseState;

            this.VisitCondition(node.Condition, out trueState, out falseState);

            // statement only executes on true
            this.SetState(node.Statement.StartLocation(), trueState);
            this.Visit(node.Statement);
            var statementEndState = this.lexicalState;

            var elseEndState = falseState;

            if (node.Else != null)
            {
                // else only executes on false
                this.SetState(node.Else.StartLocation(), falseState);
                this.Visit(node.Else);
                elseEndState = this.lexicalState;
            }

            if (!Exits(node.Statement))
            {
                this.SetState(node.EndLocation(), elseEndState);
            }
            else if (node.Else != null && !Exits(node.Else.Statement))
            {
                this.SetState(node.EndLocation(), statementEndState);
            }
            else
            {
                this.SetState(node.EndLocation(), (TState)statementEndState.Join(elseEndState));
            }
        }