Exemple #1
0
        private ExpressionSyntax VisitExpression(ExpressionSyntax node)
        {
            if (node is BinaryExpressionSyntax binaryExpresson)
            {
                var left  = Simplify(binaryExpresson.Left);
                var right = Simplify(binaryExpresson.Right);
                return(SF.BinaryExpression(node.Kind(), left, right));
            }
            if (node is IdentifierNameSyntax identifierName)
            {
                var value = Variables[identifierName.Identifier.Text];
                return(value);
            }
            if (node is LiteralExpressionSyntax)
            {
                return(node);
            }
            // Consider:
            // https://stackoverflow.com/a/3346729/2869093
            // https://stackoverflow.com/a/7812241/2869093
            if (node is PrefixUnaryExpressionSyntax prefixUnaryExpression)
            {
                if (prefixUnaryExpression.Operand is IdentifierNameSyntax operantIdentifierName)
                {
                    operantIdentifierName = (IdentifierNameSyntax)prefixUnaryExpression.Operand;
                    var value = Variables[operantIdentifierName.Identifier.Text];
                    switch (node.Kind())
                    {
                    case SK.PreDecrementExpression:
                        return(SF.BinaryExpression(SK.SubtractExpression, value, SF.LiteralExpression(SK.NumericLiteralExpression, SF.Literal(1))));

                    case SK.PreIncrementExpression:
                        return(SF.BinaryExpression(SK.AddExpression, value, SF.LiteralExpression(SK.NumericLiteralExpression, SF.Literal(1))));

                    case SK.UnaryMinusExpression:
                    case SK.UnaryPlusExpression:
                        return(node);

                    default:
                        throw new NotImplementedException($"Unsupported expression type: {prefixUnaryExpression.Operand.GetType().Name} ({operantIdentifierName.Kind().ToString()})");
                    }
                }
                if (prefixUnaryExpression.Operand is LiteralExpressionSyntax)
                {
                    return(node);
                }
                if (prefixUnaryExpression.Operand is ParenthesizedExpressionSyntax operandParenthesizedExpression)
                {
                    return(SF.PrefixUnaryExpression(prefixUnaryExpression.Kind(), Simplify(operandParenthesizedExpression)));
                }
                throw new NotImplementedException($"Unsupported expression type: {prefixUnaryExpression.Operand.GetType().Name}");
            }
            if (node is PostfixUnaryExpressionSyntax postfixUnaryExpression)
            {
                if (postfixUnaryExpression.Operand is IdentifierNameSyntax operandIdentifierName)
                {
                    var value = Variables[operandIdentifierName.Identifier.Text];
                    switch (node.Kind())
                    {
                    case SK.PostDecrementExpression:
                        return(SF.BinaryExpression(SK.SubtractExpression, value, SF.LiteralExpression(SK.NumericLiteralExpression, SF.Literal(1))));

                    case SK.PostIncrementExpression:
                        return(SF.BinaryExpression(SK.AddExpression, value, SF.LiteralExpression(SK.NumericLiteralExpression, SF.Literal(1))));

                    default:
                        throw new NotImplementedException($"Unsupported expression type: {postfixUnaryExpression.Operand.GetType().Name} ({operandIdentifierName.Kind().ToString()})");
                    }
                }
                if (postfixUnaryExpression.Operand is LiteralExpressionSyntax)
                {
                    return(node);
                }
                if (postfixUnaryExpression.Operand is ParenthesizedExpressionSyntax operandParenthesizedExpression)
                {
                    return(SF.PostfixUnaryExpression(postfixUnaryExpression.Kind(), Simplify(operandParenthesizedExpression)));
                }
                throw new NotImplementedException($"Unsupported expression type: {postfixUnaryExpression.Operand.GetType().Name}");
            }
            if (node is ParenthesizedExpressionSyntax parenthesizedExpression)
            {
                return(SF.ParenthesizedExpression(Simplify(parenthesizedExpression.Expression)));
            }
            throw new NotImplementedException($"Unsupported expression type:  {node.GetType().Name}");
        }