Пример #1
0
        private IParseTreeValue EvaluateUnaryMinus(IParseTreeValue parseTreeValue)
        {
            var opProvider = new OperatorTypesProvider(parseTreeValue.ValueType, ArithmeticOperators.ADDITIVE_INVERSE);

            if (!parseTreeValue.ParsesToConstantValue)
            {
                //Unable to resolve to a value, return an expression
                var opTypeName = opProvider.OperatorDeclaredType;
                return(_valueFactory.CreateDeclaredType($"{ArithmeticOperators.ADDITIVE_INVERSE} {parseTreeValue.Token}", opTypeName));
            }

            var effTypeName = opProvider.OperatorEffectiveType;

            if (effTypeName.Equals(Tokens.Date))
            {
                var result = DateTime.FromOADate(0 - parseTreeValue.AsDouble());
                var date   = new DateValue(result);
                return(_valueFactory.CreateDeclaredType(date.AsDate.ToString(CultureInfo.InvariantCulture), effTypeName));
            }

            var declaredTypeName = opProvider.OperatorDeclaredType;

            if (parseTreeValue.TryLetCoerce(out decimal decValue))
            {
                return(_valueFactory.CreateDeclaredType((0 - decValue).ToString(CultureInfo.InvariantCulture), declaredTypeName));
            }
            return(_valueFactory.CreateDeclaredType((0 - parseTreeValue.AsDouble()).ToString(CultureInfo.InvariantCulture), declaredTypeName));
        }
Пример #2
0
        private IParseTreeValue EvaluateLogicalNot(IParseTreeValue parseTreeValue)
        {
            var opProvider = new OperatorTypesProvider(parseTreeValue.ValueType, LogicalOperators.NOT);

            if (!parseTreeValue.ParsesToConstantValue)
            {
                //Unable to resolve to a value, return an expression
                var opType = opProvider.OperatorDeclaredType;
                opType = opType.Equals(string.Empty) ? Tokens.Variant : opProvider.OperatorDeclaredType;
                return(_valueFactory.CreateExpression($"{LogicalOperators.NOT} {parseTreeValue.Token}", opType));
            }

            var value = parseTreeValue.AsLong();

            return(_valueFactory.CreateDeclaredType((~value).ToString(CultureInfo.InvariantCulture), opProvider.OperatorDeclaredType));
        }