private Tristate EvaluateExpression(ExpressionSyntax expression) { expression.Accept(_symbolTracker); return(_expressionEvaluator.EvaluateExpression(expression)); }
public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node) { Tristate leftState = _expressionEvaluator.EvaluateExpression(node.Left); Tristate rightState = _expressionEvaluator.EvaluateExpression(node.Right); var left = (ExpressionSyntax)node.Left.Accept(this); var right = (ExpressionSyntax)node.Right.Accept(this); if (node.Left != left) { node = node.WithLeft(left); } if (node.Right != right) { node = node.WithRight(right); } if (leftState != Tristate.Varying && rightState != Tristate.Varying) { return(node); } ExpressionSyntax newExpression = null; if (node.Kind() == SyntaxKind.LogicalAndExpression) { if (leftState == Tristate.True) { // true && varying == varying newExpression = right; } else if (rightState == Tristate.True) { // varying && true == varying newExpression = left; } } else if (node.Kind() == SyntaxKind.LogicalOrExpression) { if (leftState == Tristate.False) { // false || varying == varying newExpression = right; } else if (rightState == Tristate.False) { // varying || false == varying newExpression = left; } } if (newExpression != null) { return(newExpression .WithLeadingTrivia(node.GetLeadingTrivia()) .WithTrailingTrivia(node.GetTrailingTrivia())); } return(node); }