/// <summary>
        /// Factory method for class <see cref="ExpressionStatementASTWalker"/>.
        /// </summary>
        /// <param name="node"><see cref="CSharpSyntaxNode"/> Used to initialize the walker.</param>
        /// <param name="semanticModel">The semantic model.</param>
        /// <returns></returns>
        public static ExpressionStatementASTWalker Create(CSharpSyntaxNode node, SemanticModel semanticModel = null)
        {
            // TODO: Use TranslationUnitFactory in order to have AST walkers decoupled from helpers
            //       via factories (which will be using helpers)

            ExpressionStatementTranslationUnit statement;

            // Return statement
            if (node as ReturnStatementSyntax != null)
            {
                var helper = new ReturnStatement(node as ReturnStatementSyntax, semanticModel);
                statement = CreateReturnStatement(helper, semanticModel);
            }
            // Throw statement
            else if (node as ThrowStatementSyntax != null)
            {
                var helper = new ThrowStatement(node as ThrowStatementSyntax, semanticModel);
                statement = CreateThrowStatement(helper, semanticModel);
            }
            // Other
            else if (node as ExpressionStatementSyntax != null)
            {
                var helper     = new ExpressionStatement(node as ExpressionStatementSyntax, semanticModel);
                var expression = new ExpressionTranslationUnitBuilder(helper.Expression, semanticModel).Build();
                statement = ExpressionStatementTranslationUnit.Create(expression as ExpressionTranslationUnit);
            }
            else
            {
                throw new InvalidOperationException("Unrecognized statement!");
            }

            return(new ExpressionStatementASTWalker(node, statement, semanticModel));
        }
        private IASTWalker BuildExpressionStatementTranslationUnit(CSharpSyntaxNode node)
        {
            var expressionStatementNode   = node as ExpressionStatementSyntax;
            var expressionTranslationUnit = new ExpressionTranslationUnitBuilder(expressionStatementNode.Expression, this.semanticModel).Build();

            return(null);
        }
        private static ExpressionStatementTranslationUnit CreateThrowStatement(ThrowStatement helper, SemanticModel semanticModel)
        {
            if (helper.Expression == null)
            {
                // Void return
                return(ExpressionStatementTranslationUnit.CreateThrow());
            }

            var expression = new ExpressionTranslationUnitBuilder(helper.Expression, semanticModel).Build();

            return(ExpressionStatementTranslationUnit.CreateThrow(expression as ExpressionTranslationUnit));
        }
        private static void Test(string expectedExpression, string expression)
        {
            // Create expression node
            ExpressionSyntax expressionNode = SyntaxFactory.ParseExpression(expression);

            // Generate
            ITranslationUnit translationUnit = new ExpressionTranslationUnitBuilder(expressionNode).Build();
            string           translation     = translationUnit.Translate();

            // Asserting
            Assert.AreEqual(expectedExpression, translation,
                            $"Expression '{translation}' does not match with expected '{expectedExpression}'");
        }
        private static ExpressionStatementTranslationUnit CreateThrowStatement(ThrowStatement helper, SemanticModel semanticModel)
        {
            if (helper.Expression == null)
            {
                // Void return
                return ExpressionStatementTranslationUnit.CreateThrow();
            }

            var expression = new ExpressionTranslationUnitBuilder(helper.Expression, semanticModel).Build();
            return ExpressionStatementTranslationUnit.CreateThrow(expression as ExpressionTranslationUnit);
        }
        /// <summary>
        /// Factory method for class <see cref="ExpressionStatementASTWalker"/>.
        /// </summary>
        /// <param name="node"><see cref="CSharpSyntaxNode"/> Used to initialize the walker.</param>
        /// <param name="semanticModel">The semantic model.</param>
        /// <returns></returns>
        public static ExpressionStatementASTWalker Create(CSharpSyntaxNode node, SemanticModel semanticModel = null)
        {
            // TODO: Use TranslationUnitFactory in order to have AST walkers decoupled from helpers
            //       via factories (which will be using helpers)

            ExpressionStatementTranslationUnit statement;

            // Return statement
            if (node as ReturnStatementSyntax != null)
            {
                var helper = new ReturnStatement(node as ReturnStatementSyntax, semanticModel);
                statement = CreateReturnStatement(helper, semanticModel);
            }
            // Throw statement
            else if (node as ThrowStatementSyntax != null)
            {
                var helper = new ThrowStatement(node as ThrowStatementSyntax, semanticModel);
                statement = CreateThrowStatement(helper, semanticModel);
            }
            // Other
            else if (node as ExpressionStatementSyntax != null)
            {
                var helper = new ExpressionStatement(node as ExpressionStatementSyntax, semanticModel);
                var expression = new ExpressionTranslationUnitBuilder(helper.Expression, semanticModel).Build();
                statement = ExpressionStatementTranslationUnit.Create(expression as ExpressionTranslationUnit);
            }
            else
            {
                throw new InvalidOperationException("Unrecognized statement!");
            }

            return new ExpressionStatementASTWalker(node, statement, semanticModel);
        }