Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private BaseValue handleOperatorPlus(BaseValue op1, BaseValue op2, out bool err)
- {
- //Ошибки пока нет))
- err = false;
- //Нам суют какое-то сложное дермецо?
- if (!op1.IsSimpleValue || !op2.IsSimpleValue)
- {
- //Правда здесь еще могут быть enumы
- if (op1.IsEnum && op2.IsEnum)
- {
- var a = (EnumValue) op1;
- var b = (EnumValue) op2;
- //Если у правого операнда другой тип - нам насрать. Один фиг все кастуется в целые числа
- return new EnumValue(a.Value + b.Value, a.ActualType);
- }
- if (op1.IsEnum && op2.IsInteger)
- {
- var a = (EnumValue)op1;
- var b = (IntegerValue)op2;
- return new EnumValue(a.Value + b.Value, a.ActualType);
- }
- if (op2.IsEnum && op1.IsInteger)
- {
- var a = (EnumValue)op2;
- var b = (IntegerValue)op1;
- return new EnumValue(a.Value + b.Value, a.ActualType);
- }
- //Пользователь не дружит с головой. Или испытывает синтаксический анализатор
- err = true;
- Error.PostRuntime(
- Error.RT_WRONG_ARGUMENTS,
- Error.Make_RT_WRONG_ARGUMENTS("+", op1.IsSimpleValue ? 2 : 1, "<simple-type>"),
- CurrentFile);
- return null;//динахуй!
- }
- //Целочисленное сложение
- if (op1.IsInteger && op2.IsInteger)
- {
- var a = (IntegerValue)op1;
- var b = (IntegerValue)op2;
- return new IntegerValue(a.Value + b.Value);
- }
- //float + int (вещественное сложение)
- if (op1.IsFloat && op2.IsInteger)
- {
- var a = (FloatValue)op1;
- var b = (IntegerValue)op2;
- return new FloatValue(a.Value + b.Value);
- }
- //(вещественное сложение)
- if (op2.IsFloat && op1.IsInteger)
- {
- var a = (FloatValue)op2;
- var b = (IntegerValue)op1;
- return new FloatValue(a.Value + b.Value);
- }
- //(вещественное сложение)
- if (op1.IsFloat && op2.IsFloat)
- {
- var a = (FloatValue)op1;
- var b = (FloatValue)op2;
- return new FloatValue(a.Value + b.Value);
- }
- //string + ? (конкатенация строк)
- if (op1.IsString)
- {
- var a = (StringValue)op1;
- StringValue b;
- if (op2.IsString)
- b = (StringValue) op2;
- else if (op2.IsInteger)
- b = (StringValue)DefaultCasts.Cast_Int_to_String(op2);
- else if (op2.IsFloat)
- b = (StringValue)DefaultCasts.Cast_Float_to_String(op2);
- else if (op2.ActualType.SimpleType == ESimpleType.Type)
- b = (StringValue) DefaultCasts.Cast_Type_to_String(op2);
- else if (op2.ActualType.SimpleType == ESimpleType.Bool)
- b = (StringValue)DefaultCasts.Cast_Bool_to_String(op2);
- else
- {
- //О-оу. пользователь чудит
- err = true;
- Error.PostRuntime(
- Error.RT_WRONG_ARGUMENTS,
- Error.Make_RT_WRONG_ARGUMENTS("+", 2, "<simple-type, convertable to string>"),
- CurrentFile);
- return null;//Убейся апстену
- }
- return new StringValue(a.Value + b.Value);
- }
- //(конкатенация строк)
- if (op2.IsString)
- {
- var a = (StringValue)op2;
- StringValue b;
- if (op1.IsInteger)
- b = (StringValue)DefaultCasts.Cast_Int_to_String(op1);
- else if (op1.IsFloat)
- b = (StringValue)DefaultCasts.Cast_Float_to_String(op1);
- else if (op1.ActualType.SimpleType == ESimpleType.Type)
- b = (StringValue)DefaultCasts.Cast_Type_to_String(op1);
- else if (op1.ActualType.SimpleType == ESimpleType.Bool)
- b = (StringValue)DefaultCasts.Cast_Bool_to_String(op1);
- else
- {
- //Опять какое то гавно суют :((
- err = true;
- Error.PostRuntime(
- Error.RT_WRONG_ARGUMENTS,
- Error.Make_RT_WRONG_ARGUMENTS("+", 1, "<simple-type, convertable to string>"),
- CurrentFile);
- return null;
- }
- return new StringValue(a.Value + b.Value);
- }
- //ЛОЛШТО? bool + type? type + undefined? Очевидно, пользователь поехавший.
- err = true;
- Error.PostRuntime(
- Error.RT_WRONG_ARGUMENTS,//Error.RT_USER_IS_DUMBASS,
- Error.Make_RT_WRONG_ARGUMENTS("+", 1, "<simple-type>"),
- CurrentFile);
- return null;//засосите, бля
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement