private object CalculateToString(ScriptBinaryOperator op, object left, object right)
{
switch (op)
{
case ScriptBinaryOperator.Add:
return ScriptValueConverter.ToString(Span, left) + ScriptValueConverter.ToString(Span, right);
case ScriptBinaryOperator.Multiply:
if (right is int)
{
var temp = left;
left = right;
right = temp;
}
if (left is int)
{
var rightText = ScriptValueConverter.ToString(Span, right);
var builder = new StringBuilder();
for (int i = 0; i < (int) left; i++)
{
builder.Append(rightText);
}
return builder.ToString();
}
throw new ScriptRuntimeException(Span, $"Operator [{op.ToText()}] is not supported for the expression [{this}]. Only working on string x int or int x string"); // unit test: 112-binary-string-error1.txt
case ScriptBinaryOperator.CompareEqual:
return ScriptValueConverter.ToString(Span, left) == ScriptValueConverter.ToString(Span, right);
case ScriptBinaryOperator.CompareNotEqual:
return ScriptValueConverter.ToString(Span, left) != ScriptValueConverter.ToString(Span, right);
case ScriptBinaryOperator.CompareGreater:
return ScriptValueConverter.ToString(Span, left).CompareTo(ScriptValueConverter.ToString(Span, right)) > 0;
case ScriptBinaryOperator.CompareLess:
return ScriptValueConverter.ToString(Span, left).CompareTo(ScriptValueConverter.ToString(Span, right)) < 0;
case ScriptBinaryOperator.CompareGreaterOrEqual:
return ScriptValueConverter.ToString(Span, left).CompareTo(ScriptValueConverter.ToString(Span, right)) >= 0;
case ScriptBinaryOperator.CompareLessOrEqual:
return ScriptValueConverter.ToString(Span, left).CompareTo(ScriptValueConverter.ToString(Span, right)) <= 0;
}
// unit test: 150-range-expression-error1.out.txt
throw new ScriptRuntimeException(Span, $"Operator [{op.ToText()}] is not supported on string objects"); // unit test: 112-binary-string-error2.txt
}