예제 #1
0
        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");
            }
        }
예제 #2
0
        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);
        }