in src/extensions/template_extension/ExpressionCalculator.cs [400:452]
private dynamic Unary()
{
var negate = false;
var bitwiseNot = false;
var logicalNot = false;
if (_tokenType == TokenType.Minus)
{
NextToken();
negate = true;
}
else if (_tokenType == TokenType.Plus)
{
NextToken();
negate = false;
}
else if (_tokenType == TokenType.BitwiseNot)
{
NextToken();
bitwiseNot = true;
}
else if (_tokenType == TokenType.LogicalNot)
{
NextToken();
logicalNot = true;
}
var value = Exponent();
if (negate)
{
value = value * -1.0;
}
if (logicalNot)
{
if (!(value is bool))
{
throw new CalcException("Expected boolean", _position);
}
value = !(bool)value;
}
if (bitwiseNot)
{
if (value >= double.MinValue && value <= double.MaxValue)
{
long l = (long)value;
l = ~l;
value = (double)l;
}
else
{
throw new CalcException("Result to large. Bitwise operation impossible.", _position);
}
}
return value;
}