private VisitResult VisitIfElseStatement(ASTIfElse node)
        {
            var condition = Visit(node.Condition).Value;

            if (condition)
            {
                var result = Visit(node.IfTrue);
                if (result != null && result.ControlType != ControlType.None)
                {
                    return(result);
                }
            }
            else
            {
                foreach (var elif in node.Elifs)
                {
                    var elifCondition = Visit(elif.Condition).Value;
                    if (elifCondition)
                    {
                        var result = Visit(elif.IfTrue);
                        if (result != null && result.ControlType != ControlType.None)
                        {
                            return(result);
                        }
                    }
                }

                if (node.Else != null)
                {
                    var result = Visit(node.Else);
                    if (result != null && result.ControlType != ControlType.None)
                    {
                        return(result);
                    }
                }
            }

            return(null);
        }
        private Symbol VisitIfElseStatement(ASTIfElse node)
        {
            var conditionType = Visit(node.Condition);

            if (conditionType.Name != "bool")
            {
                ThrowIncompatibleTypesException(node.Token, conditionType.Name, "bool");
            }

            Logger.DebugScope($"Enter scope : if");
            var ifScope = new ScopedSymbolTable("if", _currentScope.Level + 1, _currentScope);

            _currentScope = ifScope;

            var returnType = Visit(node.IfTrue);

            DebugPrintSymbolTable();

            _currentScope = _currentScope.EnclosingScope;
            Logger.DebugScope($"Leave scope : if");

            foreach (var elif in node.Elifs)
            {
                var elifType = Visit(elif);

                if (returnType is null)
                {
                    returnType = elifType;
                }

                if (returnType != elifType)
                {
                    ThrowIncompatibleTypesException(node.Token, returnType.Name, elifType.Name);
                }
            }

            if (node.Else != null)
            {
                Logger.DebugScope($"Enter scope : else");
                var elseScope = new ScopedSymbolTable("else", _currentScope.Level + 1, _currentScope);
                _currentScope = elseScope;

                var elseType = Visit(node.Else);

                if (returnType is null)
                {
                    returnType = elseType;
                }

                if (returnType != elseType)
                {
                    ThrowIncompatibleTypesException(node.Token, returnType.Name, elseType.Name);
                }

                DebugPrintSymbolTable();

                _currentScope = _currentScope.EnclosingScope;
                Logger.DebugScope($"Leave scope : else");
            }

            return(returnType);
        }