public static void True(bool expression) { ExpressionSyntax expr = GetExpression(); CallBinder.StatementSyntax = MakeThrowSyntax( expr.GetLocation(), F.PrefixUnaryExpression(K.LogicalNotExpression, F.ParenthesizedExpression(expr)), "Expected expression to be true.", expr.ToString() ); }
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}"); }