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)); }
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)); }