private object AssignSwitch(string @operator, object target, Node suffix,
Func<object> lvThunk, Func<object> rvThunk,
bool staticDotNetAssign = false)
{
switch (@operator)
{
case "=":
{
return PerformAssign(target, suffix, rvThunk(), staticDotNetAssign);
}
case "*=":
{
var result = OpMultiply(lvThunk(), rvThunk());
return PerformAssign(target, suffix, result, staticDotNetAssign);
}
case "/=":
{
var result = OpDivide(lvThunk(), rvThunk());
return PerformAssign(target, suffix, result, staticDotNetAssign);
}
case "%=":
{
var result = Modulus(lvThunk(), rvThunk());
return PerformAssign(target, suffix, result, staticDotNetAssign);
}
case "+=":
{
var rv = rvThunk();
if (rv is BikeFunction)
{
var fieldName = suffix.SuffixValue(this);
AddHandler(target, fieldName, (BikeFunction)rv, this, staticDotNetAssign);
var eventInfo = staticDotNetAssign
? ((Type)target).GetEvent(fieldName)
: target.GetType().GetEvent(fieldName);
// if delegate, return its value; if event, return null
return eventInfo != null ? null : lvThunk();
}
var result = OpAdd(lvThunk(), rv);
return PerformAssign(target, suffix, result, staticDotNetAssign);
}
case "-=":
{
var result = OpMinus(lvThunk(), rvThunk());
return PerformAssign(target, suffix, result, staticDotNetAssign);
}
case "||=":
{
var result = OpOr(lvThunk(), rvThunk);
return PerformAssign(target, suffix, result, staticDotNetAssign);
}
case "&&=":
{
var result = OpAnd(lvThunk(), rvThunk);
return PerformAssign(target, suffix, result, staticDotNetAssign);
}
default:
throw ErrorFactory.CreateInvalidProgramError(string.Format("Invalid operator {0}", @operator));
}
}