Skip to content

Commit

Permalink
Merge pull request #1503 from Mr-Rm/v2/refl-1424
Browse files Browse the repository at this point in the history
v2, к #1424: исправлено получение свойств для Структур
  • Loading branch information
EvilBeaver authored Feb 9, 2025
2 parents 264a41d + 7f1689d commit 7a3239d
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 33 deletions.
27 changes: 13 additions & 14 deletions src/OneScript.StandardLibrary/Collections/FixedStructureImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ public override int GetPropertyNumber(string name)
return _structure.GetPropertyNumber(name);
}

public override int GetPropCount()
{
return _structure.GetPropCount();
}

public override BslMethodInfo GetMethodInfo(int methodNumber)
{
return _methods.GetRuntimeMethod(methodNumber);
Expand Down Expand Up @@ -163,21 +168,15 @@ private static FixedStructureImpl Constructor(StructureImpl structObject)
[ScriptConstructor(Name = "По ключам и значениям")]
public static FixedStructureImpl Constructor(IValue param1, IValue[] args)
{
var rawArgument = param1?.GetRawValue();
if (rawArgument == null)
return new FixedStructureImpl("");

if (rawArgument is BslStringValue s)
{
return new FixedStructureImpl((string)s, args);
}
else if (rawArgument is StructureImpl)
return param1?.GetRawValue() switch
{
return new FixedStructureImpl(rawArgument as StructureImpl);
}
null => new FixedStructureImpl(""),
BslStringValue s => new FixedStructureImpl((string)s, args),
StructureImpl structure => new FixedStructureImpl(structure),

_ => throw new RuntimeException("В качестве параметра для конструктора можно передавать только Структура или Ключи и Значения")
};
}

throw new RuntimeException("В качестве параметра для конструктора можно передавать только Структура или Ключи и Значения");
}

}
}
42 changes: 23 additions & 19 deletions src/OneScript.StandardLibrary/Collections/StructureImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,10 @@ public StructureImpl()

public StructureImpl(string strProperties, params IValue[] values)
{
var props = strProperties.Split(',');

for (int i = 0, nprop = 0; i < props.Length; i++)
var nprop = 0;
foreach (var item in strProperties.Split(','))
{
var prop = props[i].Trim();
var prop = item.Trim();
if (prop.Equals(string.Empty))
continue;

Expand All @@ -48,7 +47,7 @@ public StructureImpl(FixedStructureImpl structure)
Insert(keyValue.Key.AsString(), keyValue.Value);
}
}

[ContextMethod("Вставить")]
public void Insert(string name, IValue val = null)
{
Expand All @@ -65,7 +64,7 @@ public void Insert(string name, IValue val = null)
{
val = ValueFactory.Create();
}

SetPropValue(num, val);
}

Expand Down Expand Up @@ -133,6 +132,17 @@ public override string GetPropName(int propNum)
return GetPropertyName(propNum);
}

public override BslPropertyInfo GetPropertyInfo(int propNum)
{
return BslPropertyBuilder.Create()
.Name(GetPropName(propNum))
.CanRead(true)
.CanWrite(true)
.ReturnType(_values[propNum].GetType())
.DeclaringType(GetType())
.Build();
}

public override BslMethodInfo GetMethodInfo(int methodNumber)
{
return _methods.GetRuntimeMethod(methodNumber);
Expand Down Expand Up @@ -243,20 +253,14 @@ private static StructureImpl Constructor(FixedStructureImpl fixedStruct)
[ScriptConstructor(Name = "По ключам и значениям")]
public static StructureImpl Constructor(IValue param1, IValue[] args)
{
var rawArgument = param1?.GetRawValue();
if (rawArgument == null)
return new StructureImpl();

if (rawArgument is BslStringValue s)
{
return new StructureImpl((string)s, args);
}
else if (rawArgument is FixedStructureImpl)
return param1?.GetRawValue() switch
{
return new StructureImpl(rawArgument as FixedStructureImpl);
}

throw new RuntimeException("В качестве параметра для конструктора можно передавать только ФиксированнаяСтруктура или Ключи и Значения");
null => new StructureImpl(),
BslStringValue s => new StructureImpl((string)s, args),
FixedStructureImpl fixedstr => new StructureImpl(fixedstr),

_ => throw new RuntimeException("В качестве параметра для конструктора можно передавать только ФиксированнаяСтруктура или Ключи и Значения")
};
}


Expand Down
19 changes: 19 additions & 0 deletions tests/reflector.os
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьРефлексиюВнешнегоПараметра");
ВсеТесты.Добавить("ТестДолжен_ПроверитьРефлексиюВнешнегоПараметраВРежимеПриватных");

ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляСтруктуры");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляФиксированнойСтруктуры");

#Если Windows Тогда
ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовМетодаComОбъекта");
#КонецЕсли
Expand Down Expand Up @@ -928,3 +931,19 @@
юТест.ПроверитьИстину(ТаблицаСвойств[1].Экспорт);

КонецПроцедуры

Процедура ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляСтруктуры() Экспорт
Рефлектор = Новый Рефлектор;
Структура = Новый Структура("Поле1, Поле2", -1, -2);
Таблица = Рефлектор.ПолучитьТаблицуСвойств(Структура);
юТест.ПроверитьРавенство(2, Таблица.Количество());
юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("Поле1"));
КонецПроцедуры

Процедура ТестДолжен_ПроверитьПолучитьТаблицуСвойствДляФиксированнойСтруктуры() Экспорт
Рефлектор = Новый Рефлектор;
ФиксСтруктура = Новый ФиксированнаяСтруктура("Поле1, Поле2", -1, -2);
Таблица = Рефлектор.ПолучитьТаблицуСвойств(ФиксСтруктура);
юТест.ПроверитьРавенство(2, Таблица.Количество());
юТест.ПроверитьНеРавенство(Неопределено, Таблица.Найти("Поле1"));
КонецПроцедуры

0 comments on commit 7a3239d

Please sign in to comment.