private IExpression CompileExpression(IExpressionSyntax expressionSyntax, int parentOpPrecedence = int.MaxValue) { if (expressionSyntax.GetType() == typeof(ExpressionBinOpSyntax)) { var expressionBinOpSyntax = (ExpressionBinOpSyntax)expressionSyntax; var left = CompileExpression(expressionBinOpSyntax.leftExpressionSyntax); var right = CompileExpression(expressionBinOpSyntax.rightExpressionSyntax); Type type; switch (expressionBinOpSyntax.op.value) { case "<": case ">": type = typeResolver.boolType; break; default: // TODO handle type conversions type = left.Type; break; } return(new ExpressionBinOp(expressionBinOpSyntax.op, left, right, type)); } else if (expressionSyntax.GetType() == typeof(ExpressionParenthesizedSyntax)) { var expressionParenthesizedSyntax = (ExpressionParenthesizedSyntax)expressionSyntax; return(new ExpressionParenthesized(CompileExpression(expressionParenthesizedSyntax.expression))); } else if (expressionSyntax.GetType() == typeof(ExpressionLiteralSyntax)) { var expressionLiteralSyntax = (ExpressionLiteralSyntax)expressionSyntax; return(CompileExpressionLiteral(expressionLiteralSyntax)); } else if (expressionSyntax.GetType() == typeof(VarOrCallChainSyntax)) { var varOrCallChainSyntax = (VarOrCallChainSyntax)expressionSyntax; return(CompileVarOrCallChain(varOrCallChainSyntax)); } else { throw new CompilerException($"Could not determine type of expression"); } }
public static void AreEqual(IExpressionSyntax expected, IExpressionSyntax actual) { var expectedString = expected.ToString(); var actualString = actual.ToString(); var expectedType = expected.GetType().Name; var actualType = actual.GetType().Name; var isStringCorrect = string.Equals(expectedString, actualString, StringComparison.Ordinal); var isTypeCorrect = string.Equals(expectedType, actualType, StringComparison.Ordinal); var message = isStringCorrect == isTypeCorrect ? $"\r\nExpected: '{expectedString}'<{expected.GetType().Name}>.\r\n Actual: '{actualString}'<{actual.GetType().Name}>" : isStringCorrect ? $"\r\nExpected: <{expectedType}>.\r\n Actual: <{actualType}>." : $"\r\nExpected: '{expectedString}'.\r\n Actual: '{actualString}'."; Assert.IsTrue(expected.Equals(actual), message); }