ICLS_Expression OptimizeSingle(ICLS_Expression expr, CLS_Content content)
{
if (expr is CLS_Expression_Math2Value || expr is CLS_Expression_Math2ValueAndOr || expr is CLS_Expression_Math2ValueLogic)
{
if (expr.listParam[0] is ICLS_Value &&
expr.listParam[1] is ICLS_Value)
{
CLS_Content.Value result = expr.ComputeValue(content);
if ((Type)result.type == typeof(bool))
{
CLS_Value_Value<bool> value = new CLS_Value_Value<bool>();
value.value_value = (bool)result.value;
value.tokenBegin = expr.listParam[0].tokenBegin;
value.tokenEnd = expr.listParam[1].tokenEnd;
value.lineBegin = expr.listParam[0].lineBegin;
value.lineEnd = expr.listParam[1].lineEnd;
return value;
}
else
{
ICLS_Type v = content.environment.GetType(result.type);
ICLS_Value value = v.MakeValue(result.value);
value.tokenBegin = expr.listParam[0].tokenBegin;
value.tokenEnd = expr.listParam[1].tokenEnd;
value.lineBegin = expr.listParam[0].lineBegin;
value.lineEnd = expr.listParam[1].lineEnd;
return value;
}
}
}
if (expr is CLS_Expression_Math3Value)
{
CLS_Content.Value result = expr.listParam[0].ComputeValue(content);
if ((Type)result.type == typeof(bool))
{
bool bv = (bool)result.value;
if (bv)
return expr.listParam[1];
else
return expr.listParam[2];
}
}
return expr;
}