public override void VisitIdentifierName(IdentifierNameSyntax node)
 {
     Expression = new IdentifierExpressionCPPModel()
     {
         Identifier = node.Identifier.ToString()
     };
 }
 public override void VisitParenthesizedExpression(ParenthesizedExpressionSyntax node)
 {
     Expression = new ParenthesizedExpressionCPPModel()
     {
         Expression = Invoke <ExpressionVisitor>(node.Expression).Expression,
     };
 }
 public override void VisitLiteralExpression(LiteralExpressionSyntax node)
 {
     Expression = new LiteralExpressionCPPModel()
     {
         Value = node.Token.ToString()
     };
 }
 public override void VisitPrefixUnaryExpression(PrefixUnaryExpressionSyntax node)
 {
     Expression = new PrefixUnaryExpressionCPPModel()
     {
         Operand = Invoke <ExpressionVisitor>(node.Operand).Expression,
         Type    = ToUnaryExpressionType(node, node.OperatorToken.ToString())
     };
 }
 public override void VisitCastExpression(CastExpressionSyntax node)
 {
     Expression = new CastCPPModel()
     {
         Type       = TypeResolver.ResolveType(node.Type),
         Expression = Invoke <ExpressionVisitor>(node.Expression).Expression,
     };
 }
 public override void VisitBinaryExpression(BinaryExpressionSyntax node)
 {
     Expression = new BinaryExpressionCPPModel()
     {
         Left  = Invoke <ExpressionVisitor>(node.Left).Expression,
         Right = Invoke <ExpressionVisitor>(node.Right).Expression,
         Type  = ToBinaryExpressionType(node, node.OperatorToken.ToString())
     };
 }
        public override void VisitElementAccessExpression(ElementAccessExpressionSyntax node)
        {
            var member = Invoke <ExpressionVisitor>(node.Expression);
            var access = node.ArgumentList.Arguments.Select(arg => Invoke <ExpressionVisitor>(arg).Expression);

            Expression = new ElementAccessCPPModel()
            {
                Expression = Invoke <ExpressionVisitor>(node.Expression).Expression,
                Arguments  = node.ArgumentList.Arguments.Select(arg => Invoke <ExpressionVisitor>(arg.Expression).Expression).ToList()
            };
        }
        public override void VisitInvocationExpression(InvocationExpressionSyntax node)
        {
            var methodInfo = TypeResolver.ResolveMethodInfo(node);

            Expression = new LocalInvocationCPPModel()
            {
                Method    = methodInfo.Name,
                Arguments = node
                            .ArgumentList
                            .Arguments
                            .Select(arg =>
                                    new ArgumentCPPModel()
                {
                    Expression = Invoke <ExpressionVisitor>(arg.Expression).Expression
                })
                            .ToList()
            };
        }
        public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            // check if access to DMA property
            var identifiers = node.RecursiveFlatIdentifiers();

            if (identifiers.Any() && identifiers[0].ToString() == "SOC")
            {
                var dmaType = TypeResolver.ResolveType(identifiers[0]);
                Expression = new IdentifierExpressionCPPModel()
                {
                    Identifier = $"{dmaType.Namespace}_{dmaType.Name}_{identifiers.Last().Identifier}"
                };

                return;
            }

            if (BuiltInValues.IsBuiltInValue(node.ToString()))
            {
                var type = TypeResolver.ResolveType(node);
                if (type == typeof(char))
                {
                    Expression = new LiteralExpressionCPPModel()
                    {
                        Value = $"'{BuiltInValues.BuiltInValue(node.ToString())}'"
                    };
                }
                else
                {
                    Expression = new LiteralExpressionCPPModel()
                    {
                        Value = BuiltInValues.BuiltInValue(node.ToString()).ToString()
                    };
                }

                return;
            }

            Unsupported(node, "Unsupported member access expression");
        }
 public override void VisitObjectCreationExpression(ObjectCreationExpressionSyntax node)
 {
     Expression = Invoke <ObjectCreationVisitor>(node).Expression;
 }